In function iscsi_data_xmit (TX worker) there is walking through the
queue of new SCSI commands that is replenished in parallell. And only
after that queue got emptied the function will start sending pending
DataOut PDUs. That lead to DataOut timer time out on target side and
to connection reinstatment.

This patch swaps walking through the new commands queue and the pending
DataOut queue. To make a preference to ongoing commands over new ones.

Reviewed-by: Konstantin Shelekhin <[email protected]>
Signed-off-by: Dmitry Bogdanov <[email protected]>
---
 drivers/scsi/libiscsi.c | 44 ++++++++++++++++++++++-------------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 797abf4f5399..8d78559ae94a 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1567,6 +1567,28 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
                        goto done;
        }
 
+check_requeue:
+       while (!list_empty(&conn->requeue)) {
+               /*
+                * we always do fastlogout - conn stop code will clean up.
+                */
+               if (conn->session->state == ISCSI_STATE_LOGGING_OUT)
+                       break;
+
+               task = list_entry(conn->requeue.next, struct iscsi_task,
+                                 running);
+
+               if (iscsi_check_tmf_restrictions(task, ISCSI_OP_SCSI_DATA_OUT))
+                       break;
+
+               list_del_init(&task->running);
+               rc = iscsi_xmit_task(conn, task, true);
+               if (rc)
+                       goto done;
+               if (!list_empty(&conn->mgmtqueue))
+                       goto check_mgmt;
+       }
+
        /* process pending command queue */
        while (!list_empty(&conn->cmdqueue)) {
                task = list_entry(conn->cmdqueue.next, struct iscsi_task,
@@ -1594,28 +1616,10 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
                 */
                if (!list_empty(&conn->mgmtqueue))
                        goto check_mgmt;
+               if (!list_empty(&conn->requeue))
+                       goto check_requeue;
        }
 
-       while (!list_empty(&conn->requeue)) {
-               /*
-                * we always do fastlogout - conn stop code will clean up.
-                */
-               if (conn->session->state == ISCSI_STATE_LOGGING_OUT)
-                       break;
-
-               task = list_entry(conn->requeue.next, struct iscsi_task,
-                                 running);
-
-               if (iscsi_check_tmf_restrictions(task, ISCSI_OP_SCSI_DATA_OUT))
-                       break;
-
-               list_del_init(&task->running);
-               rc = iscsi_xmit_task(conn, task, true);
-               if (rc)
-                       goto done;
-               if (!list_empty(&conn->mgmtqueue))
-                       goto check_mgmt;
-       }
        spin_unlock_bh(&conn->session->frwd_lock);
        return -ENODATA;
 
-- 
2.25.1

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20220607131953.11584-1-d.bogdanov%40yadro.com.

Reply via email to