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;
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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": {}}
|
||||||
|
|
Loading…
Reference in New Issue