From ae53973843482be642123f9616187ac56ee5412d Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Wed, 14 Oct 2015 16:32:35 +0000 Subject: [PATCH 1/7] README_in-tree: Sync with README git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@6539 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/README_in-tree | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scst/README_in-tree b/scst/README_in-tree index efb12a791..8bccc3b71 100644 --- a/scst/README_in-tree +++ b/scst/README_in-tree @@ -1413,14 +1413,14 @@ DEVICE_GROUP dgroup2 { DEVICE disk02 TARGET_GROUP tgroup1 { - group_id 256 + group_id 258 state standby TARGET fe80:0000:0000:0000:0002:c903:00fa:b7e1 { rel_tgt_id 1 } } TARGET_GROUP tgroup2 { - group_id 257 + group_id 259 preferred 1 state active TARGET fe80:0000:0000:0000:0002:c903:00fa:b7f2 { @@ -1468,7 +1468,7 @@ Report target port groups: Relative target port ids: 0x01 target port group id : 0x101 , Pref=0 - target port group asymmetric access state : 0x00 + target port group asymmetric access state : 0x02 T_SUP : 0, O_SUP : 0, LBD_SUP : 0, U_SUP : 1, S_SUP : 1, AN_SUP : 1, AO_SUP : 1 status code : 0x02 vendor unique status : 0x00 From 3438e73474d9f74770e45d2596d0b45b3b0a71db Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Wed, 14 Oct 2015 22:15:27 +0000 Subject: [PATCH 2/7] ib_srpt: Fix grammar in a source code comment git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@6540 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- srpt/src/ib_srpt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index 9c65ae56b..1ee2896dd 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -1555,7 +1555,7 @@ static void srpt_handle_rdma_err_comp(struct srpt_rdma_ch *ch, case SRPT_RDMA_WRITE_LAST: /* * Note: if an RDMA write error completion is received that - * means that a SEND has also been posted. Defer further + * means that a SEND also has been posted. Defer further * processing of the associated command until the send error * completion has been received. */ From cd346f8c647a7b4dd943df78b84f5c6cdf3b5385 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Wed, 14 Oct 2015 22:18:47 +0000 Subject: [PATCH 3/7] ib_srpt: Remove dead code This is a follow-up for patch "ib_srpt: Micro-optimize SCSI command processing" (trunk r4784). git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@6541 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- srpt/src/ib_srpt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index 1ee2896dd..383dcafce 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -1514,7 +1514,7 @@ static void srpt_handle_rdma_comp(struct srpt_rdma_ch *ch, EXTRACHECKS_WARN_ON(ioctx->n_rdma <= 0); srpt_adjust_sq_wr_avail(ch, ioctx->n_rdma); - if (opcode == SRPT_RDMA_READ_LAST && cmd) { + if (opcode == SRPT_RDMA_READ_LAST) { if (srpt_test_and_set_cmd_state(ioctx, SRPT_STATE_NEED_DATA, SRPT_STATE_DATA_IN)) scst_rx_data(cmd, SCST_RX_STATUS_SUCCESS, context); From b7f49e8afcc38625c266819a9b26c73aac66dbb4 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Wed, 14 Oct 2015 22:19:12 +0000 Subject: [PATCH 4/7] ib_srpt: Fix a diagnostic message git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@6542 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- srpt/src/ib_srpt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index 383dcafce..4cb6be11d 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -1524,7 +1524,7 @@ static void srpt_handle_rdma_comp(struct srpt_rdma_ch *ch, } else if (opcode == SRPT_RDMA_ABORT) { ioctx->rdma_aborted = true; } else { - WARN(true, "cmd == NULL (opcode %d)\n", opcode); + WARN(true, "Unexpected RDMA opcode %d\n", opcode); } } From fd6e33756c8ec430b63a6de0240cef8881c48b72 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Wed, 14 Oct 2015 22:21:26 +0000 Subject: [PATCH 5/7] ib_srpt: Fix error handling in srpt_xmit_response() This patch fixes a regression introduced in patch "ib_srpt: Convert srpt_xfer_data() return value" (trunk r6103). git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@6543 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- srpt/src/ib_srpt.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index 4cb6be11d..f875bc3f4 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -1511,10 +1511,9 @@ static void srpt_handle_rdma_comp(struct srpt_rdma_ch *ch, { struct scst_cmd *cmd = &ioctx->cmd; - EXTRACHECKS_WARN_ON(ioctx->n_rdma <= 0); - srpt_adjust_sq_wr_avail(ch, ioctx->n_rdma); - if (opcode == SRPT_RDMA_READ_LAST) { + EXTRACHECKS_WARN_ON(ioctx->n_rdma <= 0); + srpt_adjust_sq_wr_avail(ch, ioctx->n_rdma); if (srpt_test_and_set_cmd_state(ioctx, SRPT_STATE_NEED_DATA, SRPT_STATE_DATA_IN)) scst_rx_data(cmd, SCST_RX_STATUS_SUCCESS, context); From 166c12eb495fb7747bb287bcbe200e0fd1a97503 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Wed, 14 Oct 2015 22:21:47 +0000 Subject: [PATCH 6/7] ib_srpt: Account RDMA writes into sq_wr_avail git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@6544 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- srpt/src/ib_srpt.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index f875bc3f4..3a69578a8 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -3604,12 +3604,25 @@ static int srpt_xmit_response(struct scst_cmd *cmd) if (dir == SCST_DATA_READ && scst_cmd_get_adjusted_resp_data_len(cmd)) { ret = srpt_xfer_data(ch, ioctx); - if (unlikely(ret != SCST_TGT_RES_SUCCESS)) { + if (unlikely(ret != 0)) { srpt_set_cmd_state(ioctx, state); pr_warn("xfer_data failed for tag %llu - %s\n", scst_cmd_get_tag(cmd), - ret == SCST_TGT_RES_QUEUE_FULL ? "retrying" : + ret == -EAGAIN ? "retrying" : "failing"); + switch (ret) { + case -EAGAIN: + ret = SCST_TGT_RES_QUEUE_FULL; + break; + default: + WARN_ONCE(true, + "srpt_xfer_data() returned %d\n", + ret); + /* fall-through */ + case -EIO: + ret = SCST_TGT_RES_FATAL_ERROR; + break; + } goto out; } } From 4d9c05f1ee6054f8d9e2162c2026d6da6f0368aa Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Wed, 14 Oct 2015 22:22:19 +0000 Subject: [PATCH 7/7] ib_srpt: Increase maximum sg-list length from 128 to 65536 This avoids that the following message appears in the target system kernel log: Unable to complete command due to SG IO count limitation git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@6545 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- srpt/src/ib_srpt.c | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index 3a69578a8..7579ea64c 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -1449,15 +1449,24 @@ static void srpt_handle_send_err_comp(struct srpt_rdma_ch *ch, u64 wr_id, { u32 index = idx_from_wr_id(wr_id); struct srpt_send_ioctx *ioctx = ch->ioctx_ring[index]; + struct scst_cmd *cmd = &ioctx->cmd; enum srpt_command_state state = ioctx->state; - - srpt_adjust_sq_wr_avail(ch, 1); + int wr_avail_delta = 1; switch (state) { case SRPT_STATE_NEED_DATA: srpt_abort_cmd(ioctx, context); break; case SRPT_STATE_CMD_RSP_SENT: + if (scst_cmd_get_data_direction(cmd) == SCST_DATA_READ) { + /* + * IB_SEND_SIGNALED is not set for RDMA writes so + * process the wr_avail delta when the response + * send completion has been received. + */ + EXTRACHECKS_WARN_ON(ioctx->n_rdma <= 0); + wr_avail_delta += ioctx->n_rdma; + } srpt_undo_inc_req_lim(ch, ioctx->req_lim_delta); srpt_abort_cmd(ioctx, context); break; @@ -1473,6 +1482,8 @@ static void srpt_handle_send_err_comp(struct srpt_rdma_ch *ch, u64 wr_id, EXTRACHECKS_WARN_ON(true); break; } + + srpt_adjust_sq_wr_avail(ch, wr_avail_delta); } /** @@ -1482,10 +1493,20 @@ static void srpt_handle_send_comp(struct srpt_rdma_ch *ch, struct srpt_send_ioctx *ioctx, enum scst_exec_context context) { - srpt_adjust_sq_wr_avail(ch, 1); + struct scst_cmd *cmd = &ioctx->cmd; + int wr_avail_delta = 1; switch (srpt_set_cmd_state(ioctx, SRPT_STATE_DONE)) { case SRPT_STATE_CMD_RSP_SENT: + if (scst_cmd_get_data_direction(cmd) == SCST_DATA_READ) { + /* + * IB_SEND_SIGNALED is not set for RDMA writes so + * process the wr_avail delta when the response + * send completion has been received. + */ + EXTRACHECKS_WARN_ON(ioctx->n_rdma <= 0); + wr_avail_delta += ioctx->n_rdma; + } srpt_unmap_sg_to_ib_sge(ch, ioctx); scst_tgt_cmd_done(&ioctx->cmd, context); break; @@ -1499,6 +1520,8 @@ static void srpt_handle_send_comp(struct srpt_rdma_ch *ch, default: EXTRACHECKS_WARN_ON(true); } + + srpt_adjust_sq_wr_avail(ch, wr_avail_delta); } /** @@ -3347,18 +3370,15 @@ static int srpt_perform_rdmas(struct srpt_rdma_ch *ch, struct ib_send_wr *bad_wr; struct rdma_iu *riu; int i; - int ret; + int ret = -ENOMEM; int sq_wr_avail; const int n_rdma = ioctx->n_rdma; - if (dir == SCST_DATA_WRITE) { - ret = -ENOMEM; - sq_wr_avail = srpt_adjust_sq_wr_avail(ch, -n_rdma); - if (sq_wr_avail < 0) { - pr_warn("ch %s-%d send queue full (needed %d)\n", - ch->sess_name, ch->qp->qp_num, n_rdma); - goto out; - } + sq_wr_avail = srpt_adjust_sq_wr_avail(ch, -n_rdma); + if (sq_wr_avail < 0) { + pr_warn("ch %s-%d send queue full (needed %d)\n", + ch->sess_name, ch->qp->qp_num, n_rdma); + goto out; } ioctx->rdma_aborted = false; @@ -3421,7 +3441,7 @@ static int srpt_perform_rdmas(struct srpt_rdma_ch *ch, } out: - if (unlikely(dir == SCST_DATA_WRITE && ret < 0)) + if (unlikely(ret < 0)) srpt_adjust_sq_wr_avail(ch, n_rdma); return ret; }