Mike Christie wrote: > Mike Christie wrote: >> On 07/31/2009 07:43 AM, Erez Zilber wrote: >>> I thought that this patch just reduces the timeout from 15 to 3. Does >>> it also fix the 3 sndtmo periods or is it another patch? What was the >> Another patch. You should have it. >> >>> bug that caused the 3 sndtmo periods waiting? >>> >> I think I meant two. >> >> If iscsi_tcp_xmit_segment sent some data, then got EAGIN, it would drop >> the EAGIN. iscsi_xmit would then retry the operation so we would wait again. >> > > There is one more bug. > > Could you try the 15->3 sec snd tmp patch plus the attached patch? > > Another problem is that if we had multiple tasks on the cmd or requeue > lists, and iscsi_tcp returns a error, the write_space function can still > run and queue iscsi_data_xmit. If it was a legetimate problem and > iscsi_conn_failure was run but we raced and iscsi_data_xmit was run > first it could miss the suspend bit checks, and start trying to send > data again and hit another timeout. >
Here is a updated patch that also fixes the problem for cxgb3i and iscsi_tcp. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "open-iscsi" group. To post to this group, send email to open-iscsi@googlegroups.com To unsubscribe from this group, send email to open-iscsi+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/open-iscsi -~----------~----~----~----~------~----~------~--~---
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index d00257e..955c4d4 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -245,6 +245,10 @@ static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn, unsigned int offset, copy; int flags = 0; + if (test_bit(ISCSI_SUSPEND_BIT, + &tcp_conn->iscsi_conn->suspend_tx)) + return -ENODATA; + r = 0; offset = segment->copied; copy = segment->size - offset; diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 1d7a8b7..a7ee4bb 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c @@ -1280,6 +1280,9 @@ static int iscsi_xmit_task(struct iscsi_conn *conn) struct iscsi_task *task = conn->task; int rc; + if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) + return -ENODATA; + __iscsi_get_task(task); spin_unlock_bh(&conn->session->lock); rc = conn->session->tt->xmit_task(task); @@ -1329,7 +1332,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn) int rc = 0; spin_lock_bh(&conn->session->lock); - if (unlikely(conn->suspend_tx)) { + if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { ISCSI_DBG_SESSION(conn->session, "Tx suspended!\n"); spin_unlock_bh(&conn->session->lock); return -ENODATA; @@ -1338,7 +1341,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn) if (conn->task) { rc = iscsi_xmit_task(conn); if (rc) - goto again; + goto done; } /* @@ -1358,7 +1361,7 @@ check_mgmt: } rc = iscsi_xmit_task(conn); if (rc) - goto again; + goto done; } /* process pending command queue */ @@ -1379,14 +1382,14 @@ check_mgmt: list_add_tail(&conn->task->running, &conn->cmdqueue); conn->task = NULL; - goto again; + goto done; } else fail_scsi_task(conn->task, DID_ABORT); continue; } rc = iscsi_xmit_task(conn); if (rc) - goto again; + goto done; /* * we could continuously get new task requests so * we need to check the mgmt queue for nops that need to @@ -1412,16 +1415,14 @@ check_mgmt: conn->task->state = ISCSI_TASK_RUNNING; rc = iscsi_xmit_task(conn); if (rc) - goto again; + goto done; if (!list_empty(&conn->mgmtqueue)) goto check_mgmt; } spin_unlock_bh(&conn->session->lock); return -ENODATA; -again: - if (unlikely(conn->suspend_tx)) - rc = -ENODATA; +done: spin_unlock_bh(&conn->session->lock); return rc; }