virtio: add "use-started" property
In order to avoid migration issues, we introduce a "use-started" property to the base virtio device to indicate whether use "started" flag or not. This property will be true by default and set to false when machine type <= 4.0. Suggested-by: Greg Kurz <groug@kaod.org> Signed-off-by: Xie Yongji <xieyongji@baidu.com> Message-Id: <20190626023130.31315-2-xieyongji@baidu.com> Reviewed-by: Greg Kurz <groug@kaod.org> Tested-by: Greg Kurz <groug@kaod.org> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
683c1d89ef
commit
e57f2c31b6
@ -191,7 +191,7 @@ static void vhost_user_blk_stop(VirtIODevice *vdev)
|
||||
static void vhost_user_blk_set_status(VirtIODevice *vdev, uint8_t status)
|
||||
{
|
||||
VHostUserBlk *s = VHOST_USER_BLK(vdev);
|
||||
bool should_start = vdev->started;
|
||||
bool should_start = virtio_device_started(vdev, status);
|
||||
int ret;
|
||||
|
||||
if (!vdev->vm_running) {
|
||||
@ -317,7 +317,7 @@ static int vhost_user_blk_connect(DeviceState *dev)
|
||||
}
|
||||
|
||||
/* restore vhost state */
|
||||
if (vdev->started) {
|
||||
if (virtio_device_started(vdev, vdev->status)) {
|
||||
ret = vhost_user_blk_start(vdev);
|
||||
if (ret < 0) {
|
||||
error_report("vhost-user-blk: vhost start failed: %s",
|
||||
|
@ -30,6 +30,7 @@ GlobalProperty hw_compat_4_0[] = {
|
||||
{ "bochs-display", "edid", "false" },
|
||||
{ "virtio-vga", "edid", "false" },
|
||||
{ "virtio-gpu-pci", "edid", "false" },
|
||||
{ "virtio-device", "use-started", "false" },
|
||||
};
|
||||
const size_t hw_compat_4_0_len = G_N_ELEMENTS(hw_compat_4_0);
|
||||
|
||||
|
@ -1162,10 +1162,8 @@ int virtio_set_status(VirtIODevice *vdev, uint8_t val)
|
||||
}
|
||||
}
|
||||
}
|
||||
vdev->started = val & VIRTIO_CONFIG_S_DRIVER_OK;
|
||||
if (unlikely(vdev->start_on_kick && vdev->started)) {
|
||||
vdev->start_on_kick = false;
|
||||
}
|
||||
|
||||
virtio_set_started(vdev, val & VIRTIO_CONFIG_S_DRIVER_OK);
|
||||
|
||||
if (k->set_status) {
|
||||
k->set_status(vdev, val);
|
||||
@ -1536,8 +1534,7 @@ static bool virtio_queue_notify_aio_vq(VirtQueue *vq)
|
||||
ret = vq->handle_aio_output(vdev, vq);
|
||||
|
||||
if (unlikely(vdev->start_on_kick)) {
|
||||
vdev->started = true;
|
||||
vdev->start_on_kick = false;
|
||||
virtio_set_started(vdev, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1557,8 +1554,7 @@ static void virtio_queue_notify_vq(VirtQueue *vq)
|
||||
vq->handle_output(vdev, vq);
|
||||
|
||||
if (unlikely(vdev->start_on_kick)) {
|
||||
vdev->started = true;
|
||||
vdev->start_on_kick = false;
|
||||
virtio_set_started(vdev, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1579,8 +1575,7 @@ void virtio_queue_notify(VirtIODevice *vdev, int n)
|
||||
}
|
||||
|
||||
if (unlikely(vdev->start_on_kick)) {
|
||||
vdev->started = true;
|
||||
vdev->start_on_kick = false;
|
||||
virtio_set_started(vdev, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2291,7 +2286,7 @@ static void virtio_vmstate_change(void *opaque, int running, RunState state)
|
||||
VirtIODevice *vdev = opaque;
|
||||
BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
|
||||
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
||||
bool backend_run = running && vdev->started;
|
||||
bool backend_run = running && virtio_device_started(vdev, vdev->status);
|
||||
vdev->vm_running = running;
|
||||
|
||||
if (backend_run) {
|
||||
@ -2669,6 +2664,7 @@ static void virtio_device_instance_finalize(Object *obj)
|
||||
|
||||
static Property virtio_properties[] = {
|
||||
DEFINE_VIRTIO_COMMON_FEATURES(VirtIODevice, host_features),
|
||||
DEFINE_PROP_BOOL("use-started", VirtIODevice, use_started, true),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
@ -105,6 +105,7 @@ struct VirtIODevice
|
||||
uint16_t device_id;
|
||||
bool vm_running;
|
||||
bool broken; /* device in invalid state, needs reset */
|
||||
bool use_started;
|
||||
bool started;
|
||||
bool start_on_kick; /* virtio 1.0 transitional devices support that */
|
||||
VMChangeStateEntry *vmstate;
|
||||
@ -351,4 +352,24 @@ static inline bool virtio_is_big_endian(VirtIODevice *vdev)
|
||||
/* Devices conforming to VIRTIO 1.0 or later are always LE. */
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool virtio_device_started(VirtIODevice *vdev, uint8_t status)
|
||||
{
|
||||
if (vdev->use_started) {
|
||||
return vdev->started;
|
||||
}
|
||||
|
||||
return status & VIRTIO_CONFIG_S_DRIVER_OK;
|
||||
}
|
||||
|
||||
static inline void virtio_set_started(VirtIODevice *vdev, bool started)
|
||||
{
|
||||
if (started) {
|
||||
vdev->start_on_kick = false;
|
||||
}
|
||||
|
||||
if (vdev->use_started) {
|
||||
vdev->started = started;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user