Mike Christie wrote:
> What prevents the problem this code was handling from coming up now? Are
> you now preallocating enough resources, or are you returning
> -ENOMEM/-ENOBUFS from the init_task/xmit_task callouts so the scsi layer
> is now requeueing the IO?
Basically before/after this change we preallocate enough resources (namely
the size of the QP TX ring), and hitting this error as of over-flow is kind
of impossible in practice. Still, there was a problem here which I fixed and
will post as V2 (below).
[PATCH V2 08/9] ib/iser: move to use libiscsi passthrough mode
The libiscsi passthrough mode invokes the transport xmit calls directly
without first going through an internal queue as done in the other mode
which uses a queue and a xmitworker thread. Now when the "cant_sleep"
prerequisite of iscsi_host_alloc is met, move to use it. Handling xmit
errors is now done by the passthrough flow of libiscsi. Since the
queue/worker aren't used in this mode, the code that schedules the
xmitworker is removed.
Signed-off-by: Or Gerlitz
---
changes from V1:
- remove calls to iscsi_conn_failure which are under now both buggy and not
needed, instead
return errors to libiscsi (e.g iscsi_queuecommand, __iscsi_conn_send_pdu)
- enhance/fix the two debug prints and the change log
I tested the error flow by instrumenting the xmit code to inject synthetic
failures from time to time and things are working just great, see that the
command
with ITT 0x71 is failed by iser, then xmitted again, completed fine, etc.
> session2: iscsi_prep_scsi_cmd_pdu iscsi prep [read cid 0 sc 8802137a8100
> cdb 0x28 itt 0x71 len 4096 bidi_len 0 cmdsn 39015 win 129]
> iser: iscsi_iser_task_xmit:ctask xmit [cid 0 itt 0x71]
> iser: iser_reg_rdma_mem:PHYSICAL Mem.register: lkey: 0x300422AA rkey:
> 0x300422AA va: 0x21354 sz: 4096]
> iser: iser_prepare_read_cmd:Cmd itt:113 READ tags RKEY:0X300422AA
> VA:0X21354
> iser: iser_send_command: emulating command failure with -ENOMEM
> iser: iser_send_command:conn 880218d3d198 failed task->itt 113 err -12
> session2: iscsi_complete_task complete task itt 0x71 state 3 sc
> 8802137a8100
> session2: iscsi_free_task freeing task itt 0x71 state 1 sc 8802137a8100
> session2: iscsi_queuecommand cmd 0x28 rejected (10)
> session2: iscsi_prep_scsi_cmd_pdu iscsi prep [read cid 0 sc 8802137a8100
> cdb 0x28 itt 0x72 len 4096 bidi_len 0 cmdsn 39015 win 129]
> iser: iscsi_iser_task_xmit:ctask xmit [cid 0 itt 0x72]
> iser: iser_reg_rdma_mem:PHYSICAL Mem.register: lkey: 0x300422AA rkey:
> 0x300422AA va: 0x21354 sz: 4096]
> iser: iser_prepare_read_cmd:Cmd itt:114 READ tags RKEY:0X300422AA
> VA:0X21354
> iser: iser_rcv_completion:op 0x21 itt 0x72 dlen 0
> session2: __iscsi_complete_pdu [op 0x21 cid 0 itt 0x72 len 0]
> session2: iscsi_scsi_cmd_rsp cmd rsp done [sc 8802137a8100 res 0 itt
> 0x72]
> session2: iscsi_complete_task complete task itt 0x72 state 3 sc
> 8802137a8100
> session2: iscsi_free_task freeing task itt 0x72 state 1 sc 8802137a8100
drivers/infiniband/ulp/iser/iscsi_iser.c | 11 +++
drivers/infiniband/ulp/iser/iser_initiator.c | 12
2 files changed, 3 insertions(+), 20 deletions(-)
Index: linux-2.6.33-rc4/drivers/infiniband/ulp/iser/iscsi_iser.c
===
--- linux-2.6.33-rc4.orig/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ linux-2.6.33-rc4/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -190,7 +190,7 @@ iscsi_iser_mtask_xmit(struct iscsi_conn
{
int error = 0;
- iser_dbg("task deq [cid %d itt 0x%x]\n", conn->id, task->itt);
+ iser_dbg("mtask xmit [cid %d itt 0x%x]\n", conn->id, task->itt);
error = iser_send_control(conn, task);
@@ -200,9 +200,6 @@ iscsi_iser_mtask_xmit(struct iscsi_conn
* - if yes, the task is recycled at iscsi_complete_pdu
* - if no, the task is recycled at iser_snd_completion
*/
- if (error && error != -ENOBUFS)
- iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
-
return error;
}
@@ -254,7 +251,7 @@ iscsi_iser_task_xmit(struct iscsi_task *
task->imm_count, task->unsol_r2t.data_length);
}
- iser_dbg("task deq [cid %d itt 0x%x]\n",
+ iser_dbg("ctask xmit [cid %d itt 0x%x]\n",
conn->id, task->itt);
/* Send the cmd PDU */
@@ -270,8 +267,6 @@ iscsi_iser_task_xmit(struct iscsi_task *
error = iscsi_iser_task_xmit_unsol_data(conn, task);
iscsi_iser_task_xmit_exit:
- if (error && error != -ENOBUFS)
- iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
return error;
}
@@ -423,7 +418,7 @@ iscsi_iser_session_create(struct iscsi_e
struct Scsi_Host *shost;
struct iser_conn *ib_conn;
- shost = iscsi_host_alloc(&iscsi_iser_sht, 0, 1);
+ shost = iscsi_host_alloc(&iscsi_iser_sht, 0, 0);