|
@@ -22,7 +22,6 @@
|
|
|
#include <linux/socket.h>
|
|
|
#include <linux/in.h>
|
|
|
#include <linux/in6.h>
|
|
|
-#include <linux/llist.h>
|
|
|
#include <rdma/ib_verbs.h>
|
|
|
#include <rdma/rdma_cm.h>
|
|
|
#include <target/target_core_base.h>
|
|
@@ -1063,7 +1062,7 @@ isert_init_tx_hdrs(struct isert_conn *isert_conn,
|
|
|
|
|
|
static void
|
|
|
isert_init_send_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
|
|
|
- struct ib_send_wr *send_wr, bool coalesce)
|
|
|
+ struct ib_send_wr *send_wr)
|
|
|
{
|
|
|
struct iser_tx_desc *tx_desc = &isert_cmd->tx_desc;
|
|
|
|
|
@@ -1072,22 +1071,6 @@ isert_init_send_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
|
|
|
send_wr->opcode = IB_WR_SEND;
|
|
|
send_wr->sg_list = &tx_desc->tx_sg[0];
|
|
|
send_wr->num_sge = isert_cmd->tx_desc.num_sge;
|
|
|
- /*
|
|
|
- * Coalesce send completion interrupts by only setting IB_SEND_SIGNALED
|
|
|
- * bit for every ISERT_COMP_BATCH_COUNT number of ib_post_send() calls.
|
|
|
- */
|
|
|
- mutex_lock(&isert_conn->conn_mutex);
|
|
|
- if (coalesce && isert_conn->state == ISER_CONN_FULL_FEATURE &&
|
|
|
- ++isert_conn->conn_comp_batch < ISERT_COMP_BATCH_COUNT) {
|
|
|
- tx_desc->llnode_active = true;
|
|
|
- llist_add(&tx_desc->comp_llnode, &isert_conn->conn_comp_llist);
|
|
|
- mutex_unlock(&isert_conn->conn_mutex);
|
|
|
- return;
|
|
|
- }
|
|
|
- isert_conn->conn_comp_batch = 0;
|
|
|
- tx_desc->comp_llnode_batch = llist_del_all(&isert_conn->conn_comp_llist);
|
|
|
- mutex_unlock(&isert_conn->conn_mutex);
|
|
|
-
|
|
|
send_wr->send_flags = IB_SEND_SIGNALED;
|
|
|
}
|
|
|
|
|
@@ -1988,8 +1971,8 @@ isert_response_completion(struct iser_tx_desc *tx_desc,
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-__isert_send_completion(struct iser_tx_desc *tx_desc,
|
|
|
- struct isert_conn *isert_conn)
|
|
|
+isert_send_completion(struct iser_tx_desc *tx_desc,
|
|
|
+ struct isert_conn *isert_conn)
|
|
|
{
|
|
|
struct ib_device *ib_dev = isert_conn->conn_cm_id->device;
|
|
|
struct isert_cmd *isert_cmd = tx_desc->isert_cmd;
|
|
@@ -2030,88 +2013,11 @@ __isert_send_completion(struct iser_tx_desc *tx_desc,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-isert_send_completion(struct iser_tx_desc *tx_desc,
|
|
|
- struct isert_conn *isert_conn)
|
|
|
-{
|
|
|
- struct llist_node *llnode = tx_desc->comp_llnode_batch;
|
|
|
- struct iser_tx_desc *t;
|
|
|
- /*
|
|
|
- * Drain coalesced completion llist starting from comp_llnode_batch
|
|
|
- * setup in isert_init_send_wr(), and then complete trailing tx_desc.
|
|
|
- */
|
|
|
- while (llnode) {
|
|
|
- t = llist_entry(llnode, struct iser_tx_desc, comp_llnode);
|
|
|
- llnode = llist_next(llnode);
|
|
|
- __isert_send_completion(t, isert_conn);
|
|
|
- }
|
|
|
- __isert_send_completion(tx_desc, isert_conn);
|
|
|
-}
|
|
|
-
|
|
|
-static void
|
|
|
-isert_cq_drain_comp_llist(struct isert_conn *isert_conn, struct ib_device *ib_dev)
|
|
|
-{
|
|
|
- struct llist_node *llnode;
|
|
|
- struct isert_rdma_wr *wr;
|
|
|
- struct iser_tx_desc *t;
|
|
|
-
|
|
|
- mutex_lock(&isert_conn->conn_mutex);
|
|
|
- llnode = llist_del_all(&isert_conn->conn_comp_llist);
|
|
|
- isert_conn->conn_comp_batch = 0;
|
|
|
- mutex_unlock(&isert_conn->conn_mutex);
|
|
|
-
|
|
|
- while (llnode) {
|
|
|
- t = llist_entry(llnode, struct iser_tx_desc, comp_llnode);
|
|
|
- llnode = llist_next(llnode);
|
|
|
- wr = &t->isert_cmd->rdma_wr;
|
|
|
-
|
|
|
- /**
|
|
|
- * If send_wr_num is 0 this means that we got
|
|
|
- * RDMA completion and we cleared it and we should
|
|
|
- * simply decrement the response post. else the
|
|
|
- * response is incorporated in send_wr_num, just
|
|
|
- * sub it.
|
|
|
- **/
|
|
|
- if (wr->send_wr_num)
|
|
|
- atomic_sub(wr->send_wr_num,
|
|
|
- &isert_conn->post_send_buf_count);
|
|
|
- else
|
|
|
- atomic_dec(&isert_conn->post_send_buf_count);
|
|
|
-
|
|
|
- isert_completion_put(t, t->isert_cmd, ib_dev, true);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
static void
|
|
|
isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn)
|
|
|
{
|
|
|
struct ib_device *ib_dev = isert_conn->conn_cm_id->device;
|
|
|
struct isert_cmd *isert_cmd = tx_desc->isert_cmd;
|
|
|
- struct llist_node *llnode = tx_desc->comp_llnode_batch;
|
|
|
- struct isert_rdma_wr *wr;
|
|
|
- struct iser_tx_desc *t;
|
|
|
-
|
|
|
- while (llnode) {
|
|
|
- t = llist_entry(llnode, struct iser_tx_desc, comp_llnode);
|
|
|
- llnode = llist_next(llnode);
|
|
|
- wr = &t->isert_cmd->rdma_wr;
|
|
|
-
|
|
|
- /**
|
|
|
- * If send_wr_num is 0 this means that we got
|
|
|
- * RDMA completion and we cleared it and we should
|
|
|
- * simply decrement the response post. else the
|
|
|
- * response is incorporated in send_wr_num, just
|
|
|
- * sub it.
|
|
|
- **/
|
|
|
- if (wr->send_wr_num)
|
|
|
- atomic_sub(wr->send_wr_num,
|
|
|
- &isert_conn->post_send_buf_count);
|
|
|
- else
|
|
|
- atomic_dec(&isert_conn->post_send_buf_count);
|
|
|
-
|
|
|
- isert_completion_put(t, t->isert_cmd, ib_dev, true);
|
|
|
- }
|
|
|
- tx_desc->comp_llnode_batch = NULL;
|
|
|
|
|
|
if (!isert_cmd)
|
|
|
isert_unmap_tx_desc(tx_desc, ib_dev);
|
|
@@ -2122,14 +2028,11 @@ isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn
|
|
|
static void
|
|
|
isert_cq_rx_comp_err(struct isert_conn *isert_conn)
|
|
|
{
|
|
|
- struct ib_device *ib_dev = isert_conn->conn_cm_id->device;
|
|
|
struct iscsi_conn *conn = isert_conn->conn;
|
|
|
|
|
|
if (isert_conn->post_recv_buf_count)
|
|
|
return;
|
|
|
|
|
|
- isert_cq_drain_comp_llist(isert_conn, ib_dev);
|
|
|
-
|
|
|
if (conn->sess) {
|
|
|
target_sess_cmd_list_set_waiting(conn->sess->se_sess);
|
|
|
target_wait_for_sess_cmds(conn->sess->se_sess);
|
|
@@ -2171,9 +2074,6 @@ isert_cq_tx_work(struct work_struct *work)
|
|
|
pr_debug("TX wc.vendor_err: 0x%08x\n", wc.vendor_err);
|
|
|
|
|
|
if (wc.wr_id != ISER_FASTREG_LI_WRID) {
|
|
|
- if (tx_desc->llnode_active)
|
|
|
- continue;
|
|
|
-
|
|
|
atomic_dec(&isert_conn->post_send_buf_count);
|
|
|
isert_cq_tx_comp_err(tx_desc, isert_conn);
|
|
|
}
|
|
@@ -2293,7 +2193,7 @@ isert_put_response(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
|
|
|
isert_cmd->tx_desc.num_sge = 2;
|
|
|
}
|
|
|
|
|
|
- isert_init_send_wr(isert_conn, isert_cmd, send_wr, false);
|
|
|
+ isert_init_send_wr(isert_conn, isert_cmd, send_wr);
|
|
|
|
|
|
pr_debug("Posting SCSI Response IB_WR_SEND >>>>>>>>>>>>>>>>>>>>>>\n");
|
|
|
|
|
@@ -2351,7 +2251,7 @@ isert_put_nopin(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
|
|
|
&isert_cmd->tx_desc.iscsi_header,
|
|
|
nopout_response);
|
|
|
isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
|
|
|
- isert_init_send_wr(isert_conn, isert_cmd, send_wr, false);
|
|
|
+ isert_init_send_wr(isert_conn, isert_cmd, send_wr);
|
|
|
|
|
|
pr_debug("Posting NOPIN Response IB_WR_SEND >>>>>>>>>>>>>>>>>>>>>>\n");
|
|
|
|
|
@@ -2369,7 +2269,7 @@ isert_put_logout_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
|
|
|
iscsit_build_logout_rsp(cmd, conn, (struct iscsi_logout_rsp *)
|
|
|
&isert_cmd->tx_desc.iscsi_header);
|
|
|
isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
|
|
|
- isert_init_send_wr(isert_conn, isert_cmd, send_wr, false);
|
|
|
+ isert_init_send_wr(isert_conn, isert_cmd, send_wr);
|
|
|
|
|
|
pr_debug("Posting Logout Response IB_WR_SEND >>>>>>>>>>>>>>>>>>>>>>\n");
|
|
|
|
|
@@ -2387,7 +2287,7 @@ isert_put_tm_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
|
|
|
iscsit_build_task_mgt_rsp(cmd, conn, (struct iscsi_tm_rsp *)
|
|
|
&isert_cmd->tx_desc.iscsi_header);
|
|
|
isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
|
|
|
- isert_init_send_wr(isert_conn, isert_cmd, send_wr, false);
|
|
|
+ isert_init_send_wr(isert_conn, isert_cmd, send_wr);
|
|
|
|
|
|
pr_debug("Posting Task Management Response IB_WR_SEND >>>>>>>>>>>>>>>>>>>>>>\n");
|
|
|
|
|
@@ -2419,7 +2319,7 @@ isert_put_reject(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
|
|
|
tx_dsg->lkey = isert_conn->conn_mr->lkey;
|
|
|
isert_cmd->tx_desc.num_sge = 2;
|
|
|
|
|
|
- isert_init_send_wr(isert_conn, isert_cmd, send_wr, false);
|
|
|
+ isert_init_send_wr(isert_conn, isert_cmd, send_wr);
|
|
|
|
|
|
pr_debug("Posting Reject IB_WR_SEND >>>>>>>>>>>>>>>>>>>>>>\n");
|
|
|
|
|
@@ -2459,7 +2359,7 @@ isert_put_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
|
|
|
tx_dsg->lkey = isert_conn->conn_mr->lkey;
|
|
|
isert_cmd->tx_desc.num_sge = 2;
|
|
|
}
|
|
|
- isert_init_send_wr(isert_conn, isert_cmd, send_wr, false);
|
|
|
+ isert_init_send_wr(isert_conn, isert_cmd, send_wr);
|
|
|
|
|
|
pr_debug("Posting Text Response IB_WR_SEND >>>>>>>>>>>>>>>>>>>>>>\n");
|
|
|
|
|
@@ -3026,7 +2926,7 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
|
|
|
&isert_cmd->tx_desc.iscsi_header);
|
|
|
isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
|
|
|
isert_init_send_wr(isert_conn, isert_cmd,
|
|
|
- &isert_cmd->tx_desc.send_wr, false);
|
|
|
+ &isert_cmd->tx_desc.send_wr);
|
|
|
isert_cmd->rdma_wr.s_send_wr.next = &isert_cmd->tx_desc.send_wr;
|
|
|
wr->send_wr_num += 1;
|
|
|
}
|