IB/iser: Suppress scsi command send completions
authorSagi Grimberg <sagig@mellanox.com>
Wed, 1 Oct 2014 11:02:12 +0000 (14:02 +0300)
committerRoland Dreier <roland@purestorage.com>
Thu, 9 Oct 2014 07:06:07 +0000 (00:06 -0700)
Singal completion of every 32 scsi commands and suppress all the rest.
We don't do anything upon getting the completion so no need to "just
consume" it.  Cleanup of scsi command is done in cleanup_task callback.

Still keep dataout and control send completions as we may need to
cleanup there. This helps reducing the amount of interrupts/completions
in the IO path.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/ulp/iser/iscsi_iser.h
drivers/infiniband/ulp/iser/iser_initiator.c
drivers/infiniband/ulp/iser/iser_verbs.c

index 6c3743b6860ec51b1e8e91dea5900cce780d7008..f4e9d621826ec8f10c39d8b8660b9e682aaf880e 100644 (file)
 #define SHIFT_4K       12
 #define SIZE_4K        (1ULL << SHIFT_4K)
 #define MASK_4K        (~(SIZE_4K-1))
-
                                        /* support up to 512KB in one RDMA */
 #define ISCSI_ISER_SG_TABLESIZE         (0x80000 >> SHIFT_4K)
 #define ISER_DEF_XMIT_CMDS_DEFAULT             512
                                        ISER_MAX_RX_MISC_PDUS)
 
 #define ISER_WC_BATCH_COUNT   16
+#define ISER_SIGNAL_CMD_COUNT 32
 
 #define ISER_VER                       0x10
 #define ISER_WSV                       0x08
@@ -500,7 +500,8 @@ void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,
 
 int  iser_post_recvl(struct iser_conn *iser_conn);
 int  iser_post_recvm(struct iser_conn *iser_conn, int count);
-int  iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc);
+int  iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc,
+                   bool signal);
 
 int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
                            struct iser_data_buf       *data,
index ffbdf922587aceb24f7be0c6668ea8eee2f7c140..5a489ea63732c0166b695ce21fe16c6bb3206413 100644 (file)
@@ -369,6 +369,11 @@ static int iser_post_rx_bufs(struct iscsi_conn *conn, struct iscsi_hdr *req)
        return 0;
 }
 
+static inline bool iser_signal_comp(int sig_count)
+{
+       return ((sig_count % ISER_SIGNAL_CMD_COUNT) == 0);
+}
+
 /**
  * iser_send_command - send command PDU
  */
@@ -383,6 +388,7 @@ int iser_send_command(struct iscsi_conn *conn,
        struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)task->hdr;
        struct scsi_cmnd *sc  =  task->sc;
        struct iser_tx_desc *tx_desc = &iser_task->desc;
+       static unsigned sig_count;
 
        edtl = ntohl(hdr->data_length);
 
@@ -428,7 +434,8 @@ int iser_send_command(struct iscsi_conn *conn,
 
        iser_task->status = ISER_TASK_STATUS_STARTED;
 
-       err = iser_post_send(&iser_conn->ib_conn, tx_desc);
+       err = iser_post_send(&iser_conn->ib_conn, tx_desc,
+                            iser_signal_comp(++sig_count));
        if (!err)
                return 0;
 
@@ -493,7 +500,7 @@ int iser_send_data_out(struct iscsi_conn *conn,
                 itt, buf_offset, data_seg_len);
 
 
-       err = iser_post_send(&iser_conn->ib_conn, tx_desc);
+       err = iser_post_send(&iser_conn->ib_conn, tx_desc, true);
        if (!err)
                return 0;
 
@@ -555,7 +562,7 @@ int iser_send_control(struct iscsi_conn *conn,
                        goto send_control_error;
        }
 
-       err = iser_post_send(&iser_conn->ib_conn, mdesc);
+       err = iser_post_send(&iser_conn->ib_conn, mdesc, true);
        if (!err)
                return 0;
 
index 82bedbc260b250f3d84fc7c525ec1407c205867b..67225bb82bb50bc4b35ac8f350a750e5e3d96797 100644 (file)
@@ -1099,7 +1099,8 @@ int iser_post_recvm(struct iser_conn *iser_conn, int count)
  *
  * returns 0 on success, -1 on failure
  */
-int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc)
+int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc,
+                  bool signal)
 {
        int               ib_ret;
        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)
        send_wr.sg_list    = tx_desc->tx_sg;
        send_wr.num_sge    = tx_desc->num_sge;
        send_wr.opcode     = IB_WR_SEND;
-       send_wr.send_flags = IB_SEND_SIGNALED;
+       send_wr.send_flags = signal ? IB_SEND_SIGNALED : 0;
 
        ib_ret = ib_post_send(ib_conn->qp, &send_wr, &send_wr_failed);
        if (ib_ret)