With one worker we will always send the scsi cmd responses then send the
TMF rsp, because LIO will always complete the scsi cmds first then call
into us to send the TMF response.

With multiple workers, one of the IO vq threads could be run after the
TMF is queued, so this has us flush all the IO vqs before sending the TMF
response.

Signed-off-by: Mike Christie <michael.chris...@oracle.com>
---
 drivers/vhost/scsi.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
index 08beba73ada4..29d9adcdb4fc 100644
--- a/drivers/vhost/scsi.c
+++ b/drivers/vhost/scsi.c
@@ -1153,12 +1153,28 @@ static void vhost_scsi_tmf_resp_work(struct vhost_work 
*work)
 {
        struct vhost_scsi_tmf *tmf = container_of(work, struct vhost_scsi_tmf,
                                                  vwork);
-       int resp_code;
+       struct vhost_virtqueue *ctl_vq, *vq;
+       int resp_code, i;
+
+       if (tmf->scsi_resp == TMR_FUNCTION_COMPLETE) {
+               /*
+                * Flush IO vqs that don't share a worker with the ctl to make
+                * sure they have sent their responses before us.
+                */
+               ctl_vq = &tmf->vhost->vqs[VHOST_SCSI_VQ_CTL].vq;
+               for (i = VHOST_SCSI_VQ_IO; i < tmf->vhost->dev.nvqs; i++) {
+                       vq = &tmf->vhost->vqs[i].vq;
+
+                       if (vhost_vq_is_setup(vq) &&
+                           vq->worker != ctl_vq->worker) {
+                               vhost_vq_work_flush(vq);
+                       }
+               }
 
-       if (tmf->scsi_resp == TMR_FUNCTION_COMPLETE)
                resp_code = VIRTIO_SCSI_S_FUNCTION_SUCCEEDED;
-       else
+       } else {
                resp_code = VIRTIO_SCSI_S_FUNCTION_REJECTED;
+       }
 
        vhost_scsi_send_tmf_resp(tmf->vhost, &tmf->svq->vq, tmf->in_iovs,
                                 tmf->vq_desc, &tmf->resp_iov, resp_code);
-- 
2.25.1

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to