]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
vhost-scsi: Handle vhost_vq_work_queue failures for cmds
authorMike Christie <michael.christie@oracle.com>
Sat, 16 Mar 2024 00:47:00 +0000 (19:47 -0500)
committerMichael S. Tsirkin <mst@redhat.com>
Wed, 22 May 2024 12:31:15 +0000 (08:31 -0400)
In the next patches we will support the vhost_task being killed while in
use. The problem for vhost-scsi is that we can't free some structs until
we get responses for commands we have submitted to the target layer and
we currently process the responses from the vhost_task.

This has just drop the responses and free the command's resources. When
all commands have completed then operations like flush will be woken up
and we can complete device release and endpoint cleanup.

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

index f34f9895b8984420a0b8c2103dc2af4d4d571559..6ec1abe7364f6a355820718aaea47efbd1dd784f 100644 (file)
@@ -358,6 +358,16 @@ static void vhost_scsi_release_tmf_res(struct vhost_scsi_tmf *tmf)
        vhost_scsi_put_inflight(inflight);
 }
 
+static void vhost_scsi_drop_cmds(struct vhost_scsi_virtqueue *svq)
+{
+       struct vhost_scsi_cmd *cmd, *t;
+       struct llist_node *llnode;
+
+       llnode = llist_del_all(&svq->completion_list);
+       llist_for_each_entry_safe(cmd, t, llnode, tvc_completion_list)
+               vhost_scsi_release_cmd_res(&cmd->tvc_se_cmd);
+}
+
 static void vhost_scsi_release_cmd(struct se_cmd *se_cmd)
 {
        if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) {
@@ -373,7 +383,8 @@ static void vhost_scsi_release_cmd(struct se_cmd *se_cmd)
                                        struct vhost_scsi_virtqueue, vq);
 
                llist_add(&cmd->tvc_completion_list, &svq->completion_list);
-               vhost_vq_work_queue(&svq->vq, &svq->completion_work);
+               if (!vhost_vq_work_queue(&svq->vq, &svq->completion_work))
+                       vhost_scsi_drop_cmds(svq);
        }
 }