Commit 88ec4157 authored by Or Gerlitz's avatar Or Gerlitz Committed by Roland Dreier

IB/iser: Remove redundant locking from iser scsi command response flow

Currently the iSER receive completion flow takes the session lock
twice.  Optimize it to avoid the first one by letting
iser_task_rdma_finalize() be called only from the cleanup_task
callback invoked by iscsi_free_task, thus reducing the contention on
the session lock between the scsi command submission to the scsi
command completion flows.
Signed-off-by: default avatarOr Gerlitz <ogerlitz@voltaire.com>
Reviewed-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 962b4b52
...@@ -440,10 +440,7 @@ void iser_rcv_completion(struct iser_rx_desc *rx_desc, ...@@ -440,10 +440,7 @@ void iser_rcv_completion(struct iser_rx_desc *rx_desc,
struct iser_conn *ib_conn) struct iser_conn *ib_conn)
{ {
struct iscsi_iser_conn *conn = ib_conn->iser_conn; struct iscsi_iser_conn *conn = ib_conn->iser_conn;
struct iscsi_task *task;
struct iscsi_iser_task *iser_task;
struct iscsi_hdr *hdr; struct iscsi_hdr *hdr;
unsigned char opcode;
u64 rx_dma; u64 rx_dma;
int rx_buflen, outstanding, count, err; int rx_buflen, outstanding, count, err;
...@@ -464,28 +461,6 @@ void iser_rcv_completion(struct iser_rx_desc *rx_desc, ...@@ -464,28 +461,6 @@ void iser_rcv_completion(struct iser_rx_desc *rx_desc,
iser_dbg("op 0x%x itt 0x%x dlen %d\n", hdr->opcode, iser_dbg("op 0x%x itt 0x%x dlen %d\n", hdr->opcode,
hdr->itt, (int)(rx_xfer_len - ISER_HEADERS_LEN)); hdr->itt, (int)(rx_xfer_len - ISER_HEADERS_LEN));
opcode = hdr->opcode & ISCSI_OPCODE_MASK;
if (opcode == ISCSI_OP_SCSI_CMD_RSP) {
spin_lock(&conn->iscsi_conn->session->lock);
task = iscsi_itt_to_ctask(conn->iscsi_conn, hdr->itt);
if (task)
__iscsi_get_task(task);
spin_unlock(&conn->iscsi_conn->session->lock);
if (!task)
iser_err("itt can't be matched to task!!! "
"conn %p opcode %d itt %d\n",
conn->iscsi_conn, opcode, hdr->itt);
else {
iser_task = task->dd_data;
iser_dbg("itt %d task %p\n",hdr->itt, task);
iser_task->status = ISER_TASK_STATUS_COMPLETED;
iser_task_rdma_finalize(iser_task);
iscsi_put_task(task);
}
}
iscsi_iser_recv(conn->iscsi_conn, hdr, iscsi_iser_recv(conn->iscsi_conn, hdr,
rx_desc->data, rx_xfer_len - ISER_HEADERS_LEN); rx_desc->data, rx_xfer_len - ISER_HEADERS_LEN);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment