aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.h5
-rw-r--r--drivers/infiniband/ulp/iser/iser_initiator.c13
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c5
3 files changed, 16 insertions, 7 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h
index 6c3743b6860e..f4e9d621826e 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
@@ -101,7 +101,6 @@
101#define SHIFT_4K 12 101#define SHIFT_4K 12
102#define SIZE_4K (1ULL << SHIFT_4K) 102#define SIZE_4K (1ULL << SHIFT_4K)
103#define MASK_4K (~(SIZE_4K-1)) 103#define MASK_4K (~(SIZE_4K-1))
104
105 /* support up to 512KB in one RDMA */ 104 /* support up to 512KB in one RDMA */
106#define ISCSI_ISER_SG_TABLESIZE (0x80000 >> SHIFT_4K) 105#define ISCSI_ISER_SG_TABLESIZE (0x80000 >> SHIFT_4K)
107#define ISER_DEF_XMIT_CMDS_DEFAULT 512 106#define ISER_DEF_XMIT_CMDS_DEFAULT 512
@@ -146,6 +145,7 @@
146 ISER_MAX_RX_MISC_PDUS) 145 ISER_MAX_RX_MISC_PDUS)
147 146
148#define ISER_WC_BATCH_COUNT 16 147#define ISER_WC_BATCH_COUNT 16
148#define ISER_SIGNAL_CMD_COUNT 32
149 149
150#define ISER_VER 0x10 150#define ISER_VER 0x10
151#define ISER_WSV 0x08 151#define ISER_WSV 0x08
@@ -500,7 +500,8 @@ void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,
500 500
501int iser_post_recvl(struct iser_conn *iser_conn); 501int iser_post_recvl(struct iser_conn *iser_conn);
502int iser_post_recvm(struct iser_conn *iser_conn, int count); 502int iser_post_recvm(struct iser_conn *iser_conn, int count);
503int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc); 503int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc,
504 bool signal);
504 505
505int iser_dma_map_task_data(struct iscsi_iser_task *iser_task, 506int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
506 struct iser_data_buf *data, 507 struct iser_data_buf *data,
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c
index ffbdf922587a..5a489ea63732 100644
--- a/drivers/infiniband/ulp/iser/iser_initiator.c
+++ b/drivers/infiniband/ulp/iser/iser_initiator.c
@@ -369,6 +369,11 @@ static int iser_post_rx_bufs(struct iscsi_conn *conn, struct iscsi_hdr *req)
369 return 0; 369 return 0;
370} 370}
371 371
372static inline bool iser_signal_comp(int sig_count)
373{
374 return ((sig_count % ISER_SIGNAL_CMD_COUNT) == 0);
375}
376
372/** 377/**
373 * iser_send_command - send command PDU 378 * iser_send_command - send command PDU
374 */ 379 */
@@ -383,6 +388,7 @@ int iser_send_command(struct iscsi_conn *conn,
383 struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)task->hdr; 388 struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)task->hdr;
384 struct scsi_cmnd *sc = task->sc; 389 struct scsi_cmnd *sc = task->sc;
385 struct iser_tx_desc *tx_desc = &iser_task->desc; 390 struct iser_tx_desc *tx_desc = &iser_task->desc;
391 static unsigned sig_count;
386 392
387 edtl = ntohl(hdr->data_length); 393 edtl = ntohl(hdr->data_length);
388 394
@@ -428,7 +434,8 @@ int iser_send_command(struct iscsi_conn *conn,
428 434
429 iser_task->status = ISER_TASK_STATUS_STARTED; 435 iser_task->status = ISER_TASK_STATUS_STARTED;
430 436
431 err = iser_post_send(&iser_conn->ib_conn, tx_desc); 437 err = iser_post_send(&iser_conn->ib_conn, tx_desc,
438 iser_signal_comp(++sig_count));
432 if (!err) 439 if (!err)
433 return 0; 440 return 0;
434 441
@@ -493,7 +500,7 @@ int iser_send_data_out(struct iscsi_conn *conn,
493 itt, buf_offset, data_seg_len); 500 itt, buf_offset, data_seg_len);
494 501
495 502
496 err = iser_post_send(&iser_conn->ib_conn, tx_desc); 503 err = iser_post_send(&iser_conn->ib_conn, tx_desc, true);
497 if (!err) 504 if (!err)
498 return 0; 505 return 0;
499 506
@@ -555,7 +562,7 @@ int iser_send_control(struct iscsi_conn *conn,
555 goto send_control_error; 562 goto send_control_error;
556 } 563 }
557 564
558 err = iser_post_send(&iser_conn->ib_conn, mdesc); 565 err = iser_post_send(&iser_conn->ib_conn, mdesc, true);
559 if (!err) 566 if (!err)
560 return 0; 567 return 0;
561 568
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 82bedbc260b2..67225bb82bb5 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -1099,7 +1099,8 @@ int iser_post_recvm(struct iser_conn *iser_conn, int count)
1099 * 1099 *
1100 * returns 0 on success, -1 on failure 1100 * returns 0 on success, -1 on failure
1101 */ 1101 */
1102int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc) 1102int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc,
1103 bool signal)
1103{ 1104{
1104 int ib_ret; 1105 int ib_ret;
1105 struct ib_send_wr send_wr, *send_wr_failed; 1106 struct ib_send_wr send_wr, *send_wr_failed;
@@ -1113,7 +1114,7 @@ int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc)
1113 send_wr.sg_list = tx_desc->tx_sg; 1114 send_wr.sg_list = tx_desc->tx_sg;
1114 send_wr.num_sge = tx_desc->num_sge; 1115 send_wr.num_sge = tx_desc->num_sge;
1115 send_wr.opcode = IB_WR_SEND; 1116 send_wr.opcode = IB_WR_SEND;
1116 send_wr.send_flags = IB_SEND_SIGNALED; 1117 send_wr.send_flags = signal ? IB_SEND_SIGNALED : 0;
1117 1118
1118 ib_ret = ib_post_send(ib_conn->qp, &send_wr, &send_wr_failed); 1119 ib_ret = ib_post_send(ib_conn->qp, &send_wr, &send_wr_failed);
1119 if (ib_ret) 1120 if (ib_ret)