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: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Kevin Wolf 2019-04-26 19:29:47 +02:00
parent 307a5f60eb
commit 4f71fb436a
4 changed files with 25 additions and 15 deletions

View File

@ -2336,6 +2336,13 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
return; 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 (dev->type == TYPE_DISK) {
if (!blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, errp)) { if (!blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, errp)) {
return; return;
@ -2929,13 +2936,14 @@ static const TypeInfo scsi_disk_base_info = {
.abstract = true, .abstract = true,
}; };
#define DEFINE_SCSI_DISK_PROPERTIES() \ #define DEFINE_SCSI_DISK_PROPERTIES() \
DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \ DEFINE_PROP_DRIVE_IOTHREAD("drive", SCSIDiskState, qdev.conf.blk), \
DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \ DEFINE_BLOCK_PROPERTIES_BASE(SCSIDiskState, qdev.conf), \
DEFINE_PROP_STRING("ver", SCSIDiskState, version), \ DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \ DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \ DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
DEFINE_PROP_STRING("product", SCSIDiskState, product), \ DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
DEFINE_PROP_STRING("product", SCSIDiskState, product), \
DEFINE_PROP_STRING("device_id", SCSIDiskState, device_id) DEFINE_PROP_STRING("device_id", SCSIDiskState, device_id)

View File

@ -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, static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
Error **errp) Error **errp)
{ {
@ -798,16 +805,9 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
int ret; int ret;
if (s->ctx && !s->dataplane_fenced) { if (s->ctx && !s->dataplane_fenced) {
AioContext *ctx;
if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) { if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) {
return; 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); virtio_scsi_acquire(s);
ret = blk_set_aio_context(sd->conf.blk, s->ctx, errp); ret = blk_set_aio_context(sd->conf.blk, s->ctx, errp);
virtio_scsi_release(s); virtio_scsi_release(s);
@ -990,6 +990,7 @@ static void virtio_scsi_class_init(ObjectClass *klass, void *data)
vdc->reset = virtio_scsi_reset; vdc->reset = virtio_scsi_reset;
vdc->start_ioeventfd = virtio_scsi_dataplane_start; vdc->start_ioeventfd = virtio_scsi_dataplane_start;
vdc->stop_ioeventfd = virtio_scsi_dataplane_stop; vdc->stop_ioeventfd = virtio_scsi_dataplane_stop;
hc->pre_plug = virtio_scsi_pre_hotplug;
hc->plug = virtio_scsi_hotplug; hc->plug = virtio_scsi_hotplug;
hc->unplug = virtio_scsi_hotunplug; hc->unplug = virtio_scsi_hotunplug;
} }

View File

@ -88,6 +88,7 @@ struct SCSIDevice
int scsi_version; int scsi_version;
int default_scsi_version; int default_scsi_version;
bool needs_vpd_bl_emulation; bool needs_vpd_bl_emulation;
bool hba_supports_iothread;
}; };
extern const VMStateDescription vmstate_scsi_device; extern const VMStateDescription vmstate_scsi_device;

View File

@ -43,7 +43,7 @@ QMP_VERSION
{"return": {}} {"return": {}}
{"return": {}} {"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": {}} {"return": {}}
{"return": {}} {"return": {}}