aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/isert/ib_isert.c
diff options
context:
space:
mode:
authorJenny Derzhavetz <jennyf@mellanox.com>2015-09-06 07:52:25 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2015-09-15 18:47:29 -0400
commit4366b19ca5eb15e63d6640565ade135cf06be91a (patch)
treef65abf9982867c5f34c35edbba70c0563426053c /drivers/infiniband/ulp/isert/ib_isert.c
parentbd3792205aaeb79b994338af2e5499fa503d79c7 (diff)
iser-target: Change the recv buffers posting logic
iser target batches post recv operations to avoid the overhead of acquiring the recv queue lock and posting a HW doorbell for each command. We change it to be per command in order to support zcopy immediate data for IOs that fits in the 8K transfer boundary (in the next patch). (Fix minor patch fuzz due to ib_mr removal - nab) Signed-off-by: Jenny Derzhavetz <jennyf@mellanox.com> Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/infiniband/ulp/isert/ib_isert.c')
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c111
1 files changed, 65 insertions, 46 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index f3f498f6ecc5..233b8c7a78df 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -238,8 +238,6 @@ isert_alloc_rx_descriptors(struct isert_conn *isert_conn)
238 rx_sg->lkey = device->pd->local_dma_lkey; 238 rx_sg->lkey = device->pd->local_dma_lkey;
239 } 239 }
240 240
241 isert_conn->rx_desc_head = 0;
242
243 return 0; 241 return 0;
244 242
245dma_map_fail: 243dma_map_fail:
@@ -1002,35 +1000,51 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
1002} 1000}
1003 1001
1004static int 1002static int
1005isert_post_recv(struct isert_conn *isert_conn, u32 count) 1003isert_post_recvm(struct isert_conn *isert_conn, u32 count)
1006{ 1004{
1007 struct ib_recv_wr *rx_wr, *rx_wr_failed; 1005 struct ib_recv_wr *rx_wr, *rx_wr_failed;
1008 int i, ret; 1006 int i, ret;
1009 unsigned int rx_head = isert_conn->rx_desc_head;
1010 struct iser_rx_desc *rx_desc; 1007 struct iser_rx_desc *rx_desc;
1011 1008
1012 for (rx_wr = isert_conn->rx_wr, i = 0; i < count; i++, rx_wr++) { 1009 for (rx_wr = isert_conn->rx_wr, i = 0; i < count; i++, rx_wr++) {
1013 rx_desc = &isert_conn->rx_descs[rx_head]; 1010 rx_desc = &isert_conn->rx_descs[i];
1014 rx_wr->wr_id = (uintptr_t)rx_desc; 1011 rx_wr->wr_id = (uintptr_t)rx_desc;
1015 rx_wr->sg_list = &rx_desc->rx_sg; 1012 rx_wr->sg_list = &rx_desc->rx_sg;
1016 rx_wr->num_sge = 1; 1013 rx_wr->num_sge = 1;
1017 rx_wr->next = rx_wr + 1; 1014 rx_wr->next = rx_wr + 1;
1018 rx_head = (rx_head + 1) & (ISERT_QP_MAX_RECV_DTOS - 1);
1019 } 1015 }
1020
1021 rx_wr--; 1016 rx_wr--;
1022 rx_wr->next = NULL; /* mark end of work requests list */ 1017 rx_wr->next = NULL; /* mark end of work requests list */
1023 1018
1024 isert_conn->post_recv_buf_count += count; 1019 isert_conn->post_recv_buf_count += count;
1025 ret = ib_post_recv(isert_conn->qp, isert_conn->rx_wr, 1020 ret = ib_post_recv(isert_conn->qp, isert_conn->rx_wr,
1026 &rx_wr_failed); 1021 &rx_wr_failed);
1027 if (ret) { 1022 if (ret) {
1028 isert_err("ib_post_recv() failed with ret: %d\n", ret); 1023 isert_err("ib_post_recv() failed with ret: %d\n", ret);
1029 isert_conn->post_recv_buf_count -= count; 1024 isert_conn->post_recv_buf_count -= count;
1030 } else {
1031 isert_dbg("Posted %d RX buffers\n", count);
1032 isert_conn->rx_desc_head = rx_head;
1033 } 1025 }
1026
1027 return ret;
1028}
1029
1030static int
1031isert_post_recv(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc)
1032{
1033 struct ib_recv_wr *rx_wr_failed, rx_wr;
1034 int ret;
1035
1036 rx_wr.wr_id = (uintptr_t)rx_desc;
1037 rx_wr.sg_list = &rx_desc->rx_sg;
1038 rx_wr.num_sge = 1;
1039 rx_wr.next = NULL;
1040
1041 isert_conn->post_recv_buf_count++;
1042 ret = ib_post_recv(isert_conn->qp, &rx_wr, &rx_wr_failed);
1043 if (ret) {
1044 isert_err("ib_post_recv() failed with ret: %d\n", ret);
1045 isert_conn->post_recv_buf_count--;
1046 }
1047
1034 return ret; 1048 return ret;
1035} 1049}
1036 1050
@@ -1201,7 +1215,8 @@ isert_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login,
1201 if (ret) 1215 if (ret)
1202 return ret; 1216 return ret;
1203 1217
1204 ret = isert_post_recv(isert_conn, ISERT_MIN_POSTED_RX); 1218 ret = isert_post_recvm(isert_conn,
1219 ISERT_QP_MAX_RECV_DTOS);
1205 if (ret) 1220 if (ret)
1206 return ret; 1221 return ret;
1207 1222
@@ -1274,7 +1289,7 @@ isert_rx_login_req(struct isert_conn *isert_conn)
1274} 1289}
1275 1290
1276static struct iscsi_cmd 1291static struct iscsi_cmd
1277*isert_allocate_cmd(struct iscsi_conn *conn) 1292*isert_allocate_cmd(struct iscsi_conn *conn, struct iser_rx_desc *rx_desc)
1278{ 1293{
1279 struct isert_conn *isert_conn = conn->context; 1294 struct isert_conn *isert_conn = conn->context;
1280 struct isert_cmd *isert_cmd; 1295 struct isert_cmd *isert_cmd;
@@ -1288,6 +1303,7 @@ static struct iscsi_cmd
1288 isert_cmd = iscsit_priv_cmd(cmd); 1303 isert_cmd = iscsit_priv_cmd(cmd);
1289 isert_cmd->conn = isert_conn; 1304 isert_cmd->conn = isert_conn;
1290 isert_cmd->iscsi_cmd = cmd; 1305 isert_cmd->iscsi_cmd = cmd;
1306 isert_cmd->rx_desc = rx_desc;
1291 1307
1292 return cmd; 1308 return cmd;
1293} 1309}
@@ -1403,6 +1419,15 @@ isert_handle_iscsi_dataout(struct isert_conn *isert_conn,
1403 if (rc < 0) 1419 if (rc < 0)
1404 return rc; 1420 return rc;
1405 1421
1422 /*
1423 * multiple data-outs on the same command can arrive -
1424 * so post the buffer before hand
1425 */
1426 rc = isert_post_recv(isert_conn, rx_desc);
1427 if (rc) {
1428 isert_err("ib_post_recv failed with %d\n", rc);
1429 return rc;
1430 }
1406 return 0; 1431 return 0;
1407} 1432}
1408 1433
@@ -1475,7 +1500,7 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
1475 1500
1476 switch (opcode) { 1501 switch (opcode) {
1477 case ISCSI_OP_SCSI_CMD: 1502 case ISCSI_OP_SCSI_CMD:
1478 cmd = isert_allocate_cmd(conn); 1503 cmd = isert_allocate_cmd(conn, rx_desc);
1479 if (!cmd) 1504 if (!cmd)
1480 break; 1505 break;
1481 1506
@@ -1489,7 +1514,7 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
1489 rx_desc, (unsigned char *)hdr); 1514 rx_desc, (unsigned char *)hdr);
1490 break; 1515 break;
1491 case ISCSI_OP_NOOP_OUT: 1516 case ISCSI_OP_NOOP_OUT:
1492 cmd = isert_allocate_cmd(conn); 1517 cmd = isert_allocate_cmd(conn, rx_desc);
1493 if (!cmd) 1518 if (!cmd)
1494 break; 1519 break;
1495 1520
@@ -1502,7 +1527,7 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
1502 (unsigned char *)hdr); 1527 (unsigned char *)hdr);
1503 break; 1528 break;
1504 case ISCSI_OP_SCSI_TMFUNC: 1529 case ISCSI_OP_SCSI_TMFUNC:
1505 cmd = isert_allocate_cmd(conn); 1530 cmd = isert_allocate_cmd(conn, rx_desc);
1506 if (!cmd) 1531 if (!cmd)
1507 break; 1532 break;
1508 1533
@@ -1510,22 +1535,20 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
1510 (unsigned char *)hdr); 1535 (unsigned char *)hdr);
1511 break; 1536 break;
1512 case ISCSI_OP_LOGOUT: 1537 case ISCSI_OP_LOGOUT:
1513 cmd = isert_allocate_cmd(conn); 1538 cmd = isert_allocate_cmd(conn, rx_desc);
1514 if (!cmd) 1539 if (!cmd)
1515 break; 1540 break;
1516 1541
1517 ret = iscsit_handle_logout_cmd(conn, cmd, (unsigned char *)hdr); 1542 ret = iscsit_handle_logout_cmd(conn, cmd, (unsigned char *)hdr);
1518 break; 1543 break;
1519 case ISCSI_OP_TEXT: 1544 case ISCSI_OP_TEXT:
1520 if (be32_to_cpu(hdr->ttt) != 0xFFFFFFFF) { 1545 if (be32_to_cpu(hdr->ttt) != 0xFFFFFFFF)
1521 cmd = iscsit_find_cmd_from_itt(conn, hdr->itt); 1546 cmd = iscsit_find_cmd_from_itt(conn, hdr->itt);
1522 if (!cmd) 1547 else
1523 break; 1548 cmd = isert_allocate_cmd(conn, rx_desc);
1524 } else { 1549
1525 cmd = isert_allocate_cmd(conn); 1550 if (!cmd)
1526 if (!cmd) 1551 break;
1527 break;
1528 }
1529 1552
1530 isert_cmd = iscsit_priv_cmd(cmd); 1553 isert_cmd = iscsit_priv_cmd(cmd);
1531 ret = isert_handle_text_cmd(isert_conn, isert_cmd, cmd, 1554 ret = isert_handle_text_cmd(isert_conn, isert_cmd, cmd,
@@ -1585,7 +1608,7 @@ isert_rcv_completion(struct iser_rx_desc *desc,
1585 struct ib_device *ib_dev = isert_conn->cm_id->device; 1608 struct ib_device *ib_dev = isert_conn->cm_id->device;
1586 struct iscsi_hdr *hdr; 1609 struct iscsi_hdr *hdr;
1587 u64 rx_dma; 1610 u64 rx_dma;
1588 int rx_buflen, outstanding; 1611 int rx_buflen;
1589 1612
1590 if ((char *)desc == isert_conn->login_req_buf) { 1613 if ((char *)desc == isert_conn->login_req_buf) {
1591 rx_dma = isert_conn->login_req_dma; 1614 rx_dma = isert_conn->login_req_dma;
@@ -1625,22 +1648,6 @@ isert_rcv_completion(struct iser_rx_desc *desc,
1625 DMA_FROM_DEVICE); 1648 DMA_FROM_DEVICE);
1626 1649
1627 isert_conn->post_recv_buf_count--; 1650 isert_conn->post_recv_buf_count--;
1628 isert_dbg("Decremented post_recv_buf_count: %d\n",
1629 isert_conn->post_recv_buf_count);
1630
1631 if ((char *)desc == isert_conn->login_req_buf)
1632 return;
1633
1634 outstanding = isert_conn->post_recv_buf_count;
1635 if (outstanding + ISERT_MIN_POSTED_RX <= ISERT_QP_MAX_RECV_DTOS) {
1636 int err, count = min(ISERT_QP_MAX_RECV_DTOS - outstanding,
1637 ISERT_MIN_POSTED_RX);
1638 err = isert_post_recv(isert_conn, count);
1639 if (err) {
1640 isert_err("isert_post_recv() count: %d failed, %d\n",
1641 count, err);
1642 }
1643 }
1644} 1651}
1645 1652
1646static int 1653static int
@@ -2152,6 +2159,12 @@ isert_post_response(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd)
2152 struct ib_send_wr *wr_failed; 2159 struct ib_send_wr *wr_failed;
2153 int ret; 2160 int ret;
2154 2161
2162 ret = isert_post_recv(isert_conn, isert_cmd->rx_desc);
2163 if (ret) {
2164 isert_err("ib_post_recv failed with %d\n", ret);
2165 return ret;
2166 }
2167
2155 ret = ib_post_send(isert_conn->qp, &isert_cmd->tx_desc.send_wr, 2168 ret = ib_post_send(isert_conn->qp, &isert_cmd->tx_desc.send_wr,
2156 &wr_failed); 2169 &wr_failed);
2157 if (ret) { 2170 if (ret) {
@@ -2946,6 +2959,12 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
2946 &isert_cmd->tx_desc.send_wr); 2959 &isert_cmd->tx_desc.send_wr);
2947 isert_cmd->rdma_wr.s_send_wr.next = &isert_cmd->tx_desc.send_wr; 2960 isert_cmd->rdma_wr.s_send_wr.next = &isert_cmd->tx_desc.send_wr;
2948 wr->send_wr_num += 1; 2961 wr->send_wr_num += 1;
2962
2963 rc = isert_post_recv(isert_conn, isert_cmd->rx_desc);
2964 if (rc) {
2965 isert_err("ib_post_recv failed with %d\n", rc);
2966 return rc;
2967 }
2949 } 2968 }
2950 2969
2951 rc = ib_post_send(isert_conn->qp, wr->send_wr, &wr_failed); 2970 rc = ib_post_send(isert_conn->qp, wr->send_wr, &wr_failed);