Commit e57f2c31 authored by Xie Yongji's avatar Xie Yongji Committed by Michael S. Tsirkin
Browse files

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: default avatarGreg Kurz <groug@kaod.org>
Signed-off-by: default avatarXie Yongji <xieyongji@baidu.com>
Message-Id: <20190626023130.31315-2-xieyongji@baidu.com>
Reviewed-by: default avatarGreg Kurz <groug@kaod.org>
Tested-by: default avatarGreg Kurz <groug@kaod.org>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 683c1d89
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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",
+1 −0
Original line number Diff line number Diff line
@@ -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);

+7 −11
Original line number Diff line number Diff line
@@ -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(),
};

+21 −0
Original line number Diff line number Diff line
@@ -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