[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v6 04/20] virtio-scsi: stop using aio_disable_external() during u
From: |
Stefan Hajnoczi |
Subject: |
[PATCH v6 04/20] virtio-scsi: stop using aio_disable_external() during unplug |
Date: |
Tue, 16 May 2023 15:02:22 -0400 |
This patch is part of an effort to remove the aio_disable_external()
API because it does not fit in a multi-queue block layer world where
many AioContexts may be submitting requests to the same disk.
The SCSI emulation code is already in good shape to stop using
aio_disable_external(). It was only used by commit 9c5aad84da1c
("virtio-scsi: fixed virtio_scsi_ctx_check failed when detaching scsi
disk") to ensure that virtio_scsi_hotunplug() works while the guest
driver is submitting I/O.
Ensure virtio_scsi_hotunplug() is safe as follows:
1. qdev_simple_device_unplug_cb() -> qdev_unrealize() ->
device_set_realized() calls qatomic_set(&dev->realized, false) so
that future scsi_device_get() calls return NULL because they exclude
SCSIDevices with realized=false.
That means virtio-scsi will reject new I/O requests to this
SCSIDevice with VIRTIO_SCSI_S_BAD_TARGET even while
virtio_scsi_hotunplug() is still executing. We are protected against
new requests!
2. scsi_qdev_unrealize() already contains a call to
scsi_device_purge_requests() so that in-flight requests are cancelled
synchronously. This ensures that no in-flight requests remain once
qdev_simple_device_unplug_cb() returns.
Thanks to these two conditions we don't need aio_disable_external()
anymore.
Cc: Zhengui Li <lizhengui@huawei.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
---
hw/scsi/virtio-scsi.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index ae314af3de..c1a7ea9ae2 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -1091,7 +1091,6 @@ static void virtio_scsi_hotunplug(HotplugHandler
*hotplug_dev, DeviceState *dev,
VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
VirtIOSCSI *s = VIRTIO_SCSI(vdev);
SCSIDevice *sd = SCSI_DEVICE(dev);
- AioContext *ctx = s->ctx ?: qemu_get_aio_context();
VirtIOSCSIEventInfo info = {
.event = VIRTIO_SCSI_T_TRANSPORT_RESET,
.reason = VIRTIO_SCSI_EVT_RESET_REMOVED,
@@ -1101,9 +1100,7 @@ static void virtio_scsi_hotunplug(HotplugHandler
*hotplug_dev, DeviceState *dev,
},
};
- aio_disable_external(ctx);
qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
- aio_enable_external(ctx);
if (s->ctx) {
virtio_scsi_acquire(s);
--
2.40.1
- [PATCH v6 00/20] block: remove aio_disable_external() API, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 01/20] block-backend: split blk_do_set_aio_context(), Stefan Hajnoczi, 2023/05/16
- [PATCH v6 02/20] hw/qdev: introduce qdev_is_realized() helper, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 03/20] virtio-scsi: avoid race between unplug and transport event, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 04/20] virtio-scsi: stop using aio_disable_external() during unplug,
Stefan Hajnoczi <=
- [PATCH v6 05/20] util/vhost-user-server: rename refcount to in_flight counter, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 07/20] block/export: stop using is_external in vhost-user-blk server, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 06/20] block/export: wait for vhost-user-blk requests when draining, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 08/20] hw/xen: do not use aio_set_fd_handler(is_external=true) in xen_xenstore, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 09/20] block: add blk_in_drain() API, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 10/20] block: drain from main loop thread in bdrv_co_yield_to_drain(), Stefan Hajnoczi, 2023/05/16
- [PATCH v6 11/20] xen-block: implement BlockDevOps->drained_begin(), Stefan Hajnoczi, 2023/05/16
- [PATCH v6 12/20] hw/xen: do not set is_external=true on evtchn fds, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 13/20] block/export: rewrite vduse-blk drain code, Stefan Hajnoczi, 2023/05/16
- [PATCH v6 14/20] block/export: don't require AioContext lock around blk_exp_ref/unref(), Stefan Hajnoczi, 2023/05/16