[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 01/13] virtio-scsi: avoid race between unplug and transport e
From: |
Michael S. Tsirkin |
Subject: |
Re: [PATCH 01/13] virtio-scsi: avoid race between unplug and transport event |
Date: |
Tue, 4 Apr 2023 10:38:53 -0400 |
On Mon, Apr 03, 2023 at 02:29:52PM -0400, Stefan Hajnoczi wrote:
> Only report a transport reset event to the guest after the SCSIDevice
> has been unrealized by qdev_simple_device_unplug_cb().
>
> qdev_simple_device_unplug_cb() sets the SCSIDevice's qdev.realized field
> to false so that scsi_device_find/get() no longer see it.
>
> scsi_target_emulate_report_luns() also needs to be updated to filter out
> SCSIDevices that are unrealized.
>
> These changes ensure that the guest driver does not see the SCSIDevice
> that's being unplugged if it responds very quickly to the transport
> reset event.
>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Feel free to merge.
> ---
> hw/scsi/scsi-bus.c | 3 ++-
> hw/scsi/virtio-scsi.c | 18 +++++++++---------
> 2 files changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> index c97176110c..f9bd064833 100644
> --- a/hw/scsi/scsi-bus.c
> +++ b/hw/scsi/scsi-bus.c
> @@ -487,7 +487,8 @@ static bool scsi_target_emulate_report_luns(SCSITargetReq
> *r)
> DeviceState *qdev = kid->child;
> SCSIDevice *dev = SCSI_DEVICE(qdev);
>
> - if (dev->channel == channel && dev->id == id && dev->lun != 0) {
> + if (dev->channel == channel && dev->id == id && dev->lun != 0 &&
> + qatomic_load_acquire(&dev->qdev.realized)) {
> store_lun(tmp, dev->lun);
> g_byte_array_append(buf, tmp, 8);
> len += 8;
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index 612c525d9d..000961446c 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -1063,15 +1063,6 @@ static void virtio_scsi_hotunplug(HotplugHandler
> *hotplug_dev, DeviceState *dev,
> SCSIDevice *sd = SCSI_DEVICE(dev);
> AioContext *ctx = s->ctx ?: qemu_get_aio_context();
>
> - if (virtio_vdev_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG)) {
> - virtio_scsi_acquire(s);
> - virtio_scsi_push_event(s, sd,
> - VIRTIO_SCSI_T_TRANSPORT_RESET,
> - VIRTIO_SCSI_EVT_RESET_REMOVED);
> - scsi_bus_set_ua(&s->bus, SENSE_CODE(REPORTED_LUNS_CHANGED));
> - virtio_scsi_release(s);
> - }
> -
> aio_disable_external(ctx);
> qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
> aio_enable_external(ctx);
> @@ -1082,6 +1073,15 @@ static void virtio_scsi_hotunplug(HotplugHandler
> *hotplug_dev, DeviceState *dev,
> blk_set_aio_context(sd->conf.blk, qemu_get_aio_context(), NULL);
> virtio_scsi_release(s);
> }
> +
> + if (virtio_vdev_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG)) {
> + virtio_scsi_acquire(s);
> + virtio_scsi_push_event(s, sd,
> + VIRTIO_SCSI_T_TRANSPORT_RESET,
> + VIRTIO_SCSI_EVT_RESET_REMOVED);
> + scsi_bus_set_ua(&s->bus, SENSE_CODE(REPORTED_LUNS_CHANGED));
> + virtio_scsi_release(s);
> + }
> }
>
> static struct SCSIBusInfo virtio_scsi_scsi_info = {
> --
> 2.39.2
- [PATCH 06/13] block/export: stop using is_external in vhost-user-blk server, (continued)
- [PATCH 06/13] block/export: stop using is_external in vhost-user-blk server, Stefan Hajnoczi, 2023/04/03
- [PATCH 03/13] block/export: only acquire AioContext once for vhost_user_server_stop(), Stefan Hajnoczi, 2023/04/03
- [PATCH 08/13] hw/xen: do not use aio_set_fd_handler(is_external=true) in xen_xenstore, Stefan Hajnoczi, 2023/04/03
- [PATCH 04/13] util/vhost-user-server: rename refcount to in_flight counter, Stefan Hajnoczi, 2023/04/03
- [PATCH 01/13] virtio-scsi: avoid race between unplug and transport event, Stefan Hajnoczi, 2023/04/03
- [PATCH 09/13] hw/xen: do not set is_external=true on evtchn fds, Stefan Hajnoczi, 2023/04/03
- [PATCH 07/13] virtio: do not set is_external=true on host notifiers, Stefan Hajnoczi, 2023/04/03
- [PATCH 12/13] block/fuse: do not set is_external=true on FUSE fd, Stefan Hajnoczi, 2023/04/03
- [PATCH 10/13] block/export: rewrite vduse-blk drain code, Stefan Hajnoczi, 2023/04/03
- [PATCH 13/13] aio: remove aio_disable_external() API, Stefan Hajnoczi, 2023/04/03
- [PATCH 11/13] block/fuse: take AioContext lock around blk_exp_ref/unref(), Stefan Hajnoczi, 2023/04/03