Commit 4f71fb43 authored by Kevin Wolf's avatar Kevin Wolf
Browse files

scsi-disk: Use qdev_prop_drive_iothread



This makes use of qdev_prop_drive_iothread for scsi-disk so that the
disk can be attached to a node that is already in the target AioContext.
We need to check that the HBA actually supports iothreads, otherwise
scsi-disk must make sure that the node is already in the main
AioContext.

This changes the error message for conflicting iothread settings.
Previously, virtio-scsi produced the error message, now it comes from
blk_set_aio_context(). Update a test case accordingly.

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 307a5f60
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -2336,6 +2336,13 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
        return;
    }

    if (blk_get_aio_context(s->qdev.conf.blk) != qemu_get_aio_context() &&
        !s->qdev.hba_supports_iothread)
    {
        error_setg(errp, "HBA does not support iothreads");
        return;
    }

    if (dev->type == TYPE_DISK) {
        if (!blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, errp)) {
            return;
@@ -2930,7 +2937,8 @@ static const TypeInfo scsi_disk_base_info = {
};

#define DEFINE_SCSI_DISK_PROPERTIES()                                   \
    DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),               \
    DEFINE_PROP_DRIVE_IOTHREAD("drive", SCSIDiskState, qdev.conf.blk),  \
    DEFINE_BLOCK_PROPERTIES_BASE(SCSIDiskState, qdev.conf),             \
    DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf),            \
    DEFINE_PROP_STRING("ver", SCSIDiskState, version),                  \
    DEFINE_PROP_STRING("serial", SCSIDiskState, serial),                \
+8 −7
Original line number Diff line number Diff line
@@ -789,6 +789,13 @@ static void virtio_scsi_change(SCSIBus *bus, SCSIDevice *dev, SCSISense sense)
    }
}

static void virtio_scsi_pre_hotplug(HotplugHandler *hotplug_dev,
                                    DeviceState *dev, Error **errp)
{
    SCSIDevice *sd = SCSI_DEVICE(dev);
    sd->hba_supports_iothread = true;
}

static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
                                Error **errp)
{
@@ -798,16 +805,9 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
    int ret;

    if (s->ctx && !s->dataplane_fenced) {
        AioContext *ctx;
        if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) {
            return;
        }
        ctx = blk_get_aio_context(sd->conf.blk);
        if (ctx != s->ctx && ctx != qemu_get_aio_context()) {
            error_setg(errp, "Cannot attach a blockdev that is using "
                       "a different iothread");
            return;
        }
        virtio_scsi_acquire(s);
        ret = blk_set_aio_context(sd->conf.blk, s->ctx, errp);
        virtio_scsi_release(s);
@@ -990,6 +990,7 @@ static void virtio_scsi_class_init(ObjectClass *klass, void *data)
    vdc->reset = virtio_scsi_reset;
    vdc->start_ioeventfd = virtio_scsi_dataplane_start;
    vdc->stop_ioeventfd = virtio_scsi_dataplane_stop;
    hc->pre_plug = virtio_scsi_pre_hotplug;
    hc->plug = virtio_scsi_hotplug;
    hc->unplug = virtio_scsi_hotunplug;
}
+1 −0
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ struct SCSIDevice
    int scsi_version;
    int default_scsi_version;
    bool needs_vpd_bl_emulation;
    bool hba_supports_iothread;
};

extern const VMStateDescription vmstate_scsi_device;
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ QMP_VERSION
{"return": {}}
{"return": {}}
{"return": {}}
{"error": {"class": "GenericError", "desc": "Cannot attach a blockdev that is using a different iothread"}}
{"error": {"class": "GenericError", "desc": "Cannot change iothread of active block backend"}}
{"return": {}}
{"return": {}}
{"return": {}}