OSDN Git Service

vhost-scsi: Check for a cleared backend before queueing an event
authorMike Christie <michael.christie@oracle.com>
Tue, 21 Mar 2023 02:06:22 +0000 (21:06 -0500)
committerMichael S. Tsirkin <mst@redhat.com>
Fri, 21 Apr 2023 07:02:30 +0000 (03:02 -0400)
We currenly hold the vhost_scsi_mutex while clearing the endpoint and
while performing vhost_scsi_do_plug, so tpg->vhost_scsi can't be freed
from uder us, and to make sure anything queued is handled by the
full call in vhost_scsi_clear_endpoint.

This patch removes the need for the vhost_scsi_mutex for the latter
case. In the next patches, we won't hold the vhost_scsi_mutex while
flushing so this patch adds a check for the clearing of the virtqueue
from vhost_scsi_clear_endpoint. We then know that once
vhost_scsi_clear_endpoint has cleared the backend that no new events
will be queued, and the flush after the vhost_vq_set_backend(vq, NULL)
call will see everything that's been queued to that point. So the flush
will then handle all events without the need for the vhost_scsi_mutex.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
Message-Id: <20230321020624.13323-6-michael.christie@oracle.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/vhost/scsi.c

index c945136..ba8097f 100644 (file)
@@ -2010,9 +2010,17 @@ vhost_scsi_do_plug(struct vhost_scsi_tpg *tpg,
 
        vq = &vs->vqs[VHOST_SCSI_VQ_EVT].vq;
        mutex_lock(&vq->mutex);
+       /*
+        * We can't queue events if the backend has been cleared, because
+        * we could end up queueing an event after the flush.
+        */
+       if (!vhost_vq_get_backend(vq))
+               goto unlock;
+
        if (vhost_has_feature(vq, VIRTIO_SCSI_F_HOTPLUG))
                vhost_scsi_send_evt(vs, tpg, lun,
                                   VIRTIO_SCSI_T_TRANSPORT_RESET, reason);
+unlock:
        mutex_unlock(&vq->mutex);
 }