aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/isert
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-03-17 06:52:17 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-04-07 04:48:48 -0400
commit897bb2c9162fa8f03653693a751b473cd131ee60 (patch)
tree42536c26073b2d5e57196243d4b5826c00682460 /drivers/infiniband/ulp/isert
parentc2caa207774683bddaa628d4c848ca48cc172e0a (diff)
Target/iser: Consider DIF and RDMA_READ completions when calculating post_send counter
If protection is involved, iSER target must wait for completion of RDMA_READ before sending SCSI response. So we must consider that when calculating post_send_buf_count additions, also when processing good/error completions. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/infiniband/ulp/isert')
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c47
1 files changed, 41 insertions, 6 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index e4ebb4c08358..faec22404da5 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -1705,6 +1705,7 @@ isert_completion_rdma_write(struct iser_tx_desc *tx_desc,
1705 1705
1706fail_mr_status: 1706fail_mr_status:
1707 device->unreg_rdma_mem(isert_cmd, isert_conn); 1707 device->unreg_rdma_mem(isert_cmd, isert_conn);
1708 wr->send_wr_num = 0;
1708 if (ret) 1709 if (ret)
1709 transport_send_check_condition_and_sense(se_cmd, 1710 transport_send_check_condition_and_sense(se_cmd,
1710 se_cmd->pi_err, 0); 1711 se_cmd->pi_err, 0);
@@ -1838,7 +1839,18 @@ isert_response_completion(struct iser_tx_desc *tx_desc,
1838 queue_work(isert_comp_wq, &isert_cmd->comp_work); 1839 queue_work(isert_comp_wq, &isert_cmd->comp_work);
1839 return; 1840 return;
1840 } 1841 }
1841 atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); 1842
1843 /**
1844 * If send_wr_num is 0 this means that we got
1845 * RDMA completion and we cleared it and we should
1846 * simply decrement the response post. else the
1847 * response is incorporated in send_wr_num, just
1848 * sub it.
1849 **/
1850 if (wr->send_wr_num)
1851 atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count);
1852 else
1853 atomic_dec(&isert_conn->post_send_buf_count);
1842 1854
1843 cmd->i_state = ISTATE_SENT_STATUS; 1855 cmd->i_state = ISTATE_SENT_STATUS;
1844 isert_completion_put(tx_desc, isert_cmd, ib_dev); 1856 isert_completion_put(tx_desc, isert_cmd, ib_dev);
@@ -1871,7 +1883,7 @@ __isert_send_completion(struct iser_tx_desc *tx_desc,
1871 break; 1883 break;
1872 case ISER_IB_RDMA_WRITE: 1884 case ISER_IB_RDMA_WRITE:
1873 pr_debug("isert_send_completion: Got ISER_IB_RDMA_WRITE\n"); 1885 pr_debug("isert_send_completion: Got ISER_IB_RDMA_WRITE\n");
1874 atomic_dec(&isert_conn->post_send_buf_count); 1886 atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count);
1875 isert_completion_rdma_write(tx_desc, isert_cmd); 1887 isert_completion_rdma_write(tx_desc, isert_cmd);
1876 break; 1888 break;
1877 case ISER_IB_RDMA_READ: 1889 case ISER_IB_RDMA_READ:
@@ -1922,7 +1934,18 @@ isert_cq_drain_comp_llist(struct isert_conn *isert_conn, struct ib_device *ib_de
1922 llnode = llist_next(llnode); 1934 llnode = llist_next(llnode);
1923 wr = &t->isert_cmd->rdma_wr; 1935 wr = &t->isert_cmd->rdma_wr;
1924 1936
1925 atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); 1937 /**
1938 * If send_wr_num is 0 this means that we got
1939 * RDMA completion and we cleared it and we should
1940 * simply decrement the response post. else the
1941 * response is incorporated in send_wr_num, just
1942 * sub it.
1943 **/
1944 if (wr->send_wr_num)
1945 atomic_sub(wr->send_wr_num,
1946 &isert_conn->post_send_buf_count);
1947 else
1948 atomic_dec(&isert_conn->post_send_buf_count);
1926 isert_completion_put(t, t->isert_cmd, ib_dev); 1949 isert_completion_put(t, t->isert_cmd, ib_dev);
1927 } 1950 }
1928} 1951}
@@ -1941,7 +1964,18 @@ isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn
1941 llnode = llist_next(llnode); 1964 llnode = llist_next(llnode);
1942 wr = &t->isert_cmd->rdma_wr; 1965 wr = &t->isert_cmd->rdma_wr;
1943 1966
1944 atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); 1967 /**
1968 * If send_wr_num is 0 this means that we got
1969 * RDMA completion and we cleared it and we should
1970 * simply decrement the response post. else the
1971 * response is incorporated in send_wr_num, just
1972 * sub it.
1973 **/
1974 if (wr->send_wr_num)
1975 atomic_sub(wr->send_wr_num,
1976 &isert_conn->post_send_buf_count);
1977 else
1978 atomic_dec(&isert_conn->post_send_buf_count);
1945 isert_completion_put(t, t->isert_cmd, ib_dev); 1979 isert_completion_put(t, t->isert_cmd, ib_dev);
1946 } 1980 }
1947 tx_desc->comp_llnode_batch = NULL; 1981 tx_desc->comp_llnode_batch = NULL;
@@ -2795,14 +2829,15 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
2795 isert_init_send_wr(isert_conn, isert_cmd, 2829 isert_init_send_wr(isert_conn, isert_cmd,
2796 &isert_cmd->tx_desc.send_wr, true); 2830 &isert_cmd->tx_desc.send_wr, true);
2797 isert_cmd->rdma_wr.s_send_wr.next = &isert_cmd->tx_desc.send_wr; 2831 isert_cmd->rdma_wr.s_send_wr.next = &isert_cmd->tx_desc.send_wr;
2832 wr->send_wr_num += 1;
2798 } 2833 }
2799 2834
2800 atomic_add(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); 2835 atomic_add(wr->send_wr_num, &isert_conn->post_send_buf_count);
2801 2836
2802 rc = ib_post_send(isert_conn->conn_qp, wr->send_wr, &wr_failed); 2837 rc = ib_post_send(isert_conn->conn_qp, wr->send_wr, &wr_failed);
2803 if (rc) { 2838 if (rc) {
2804 pr_warn("ib_post_send() failed for IB_WR_RDMA_WRITE\n"); 2839 pr_warn("ib_post_send() failed for IB_WR_RDMA_WRITE\n");
2805 atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); 2840 atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count);
2806 } 2841 }
2807 2842
2808 if (se_cmd->prot_op == TARGET_PROT_NORMAL) 2843 if (se_cmd->prot_op == TARGET_PROT_NORMAL)