mirror of https://github.com/xemu-project/xemu.git
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:
parent
307a5f60eb
commit
4f71fb436a
|
@ -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;
|
||||
|
@ -2929,13 +2936,14 @@ static const TypeInfo scsi_disk_base_info = {
|
|||
.abstract = true,
|
||||
};
|
||||
|
||||
#define DEFINE_SCSI_DISK_PROPERTIES() \
|
||||
DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
|
||||
DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
|
||||
DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
|
||||
DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
|
||||
DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
|
||||
DEFINE_PROP_STRING("product", SCSIDiskState, product), \
|
||||
#define DEFINE_SCSI_DISK_PROPERTIES() \
|
||||
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), \
|
||||
DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
|
||||
DEFINE_PROP_STRING("product", SCSIDiskState, product), \
|
||||
DEFINE_PROP_STRING("device_id", SCSIDiskState, device_id)
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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": {}}
|
||||
|
|
Loading…
Reference in New Issue