IB/srpt: Cache global L_Key
authorBart Van Assche <bart.vanassche@wdc.com>
Wed, 11 Oct 2017 17:27:24 +0000 (10:27 -0700)
committerDoug Ledford <dledford@redhat.com>
Wed, 18 Oct 2017 14:49:54 +0000 (10:49 -0400)
This patch is a micro-optimization for the hot path.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/ulp/srpt/ib_srpt.c
drivers/infiniband/ulp/srpt/ib_srpt.h

index 76370e3..6cf95ad 100644 (file)
@@ -766,7 +766,7 @@ static int srpt_post_recv(struct srpt_device *sdev,
        BUG_ON(!sdev);
        list.addr = ioctx->ioctx.dma;
        list.length = srp_max_req_size;
-       list.lkey = sdev->pd->local_dma_lkey;
+       list.lkey = sdev->lkey;
 
        ioctx->ioctx.cqe.done = srpt_recv_done;
        wr.wr_cqe = &ioctx->ioctx.cqe;
@@ -2343,7 +2343,7 @@ static void srpt_queue_response(struct se_cmd *cmd)
 
        sge.addr = ioctx->ioctx.dma;
        sge.length = resp_len;
-       sge.lkey = sdev->pd->local_dma_lkey;
+       sge.lkey = sdev->lkey;
 
        ioctx->ioctx.cqe.done = srpt_send_done;
        send_wr.next = NULL;
@@ -2491,6 +2491,8 @@ static void srpt_add_one(struct ib_device *device)
        if (IS_ERR(sdev->pd))
                goto free_dev;
 
+       sdev->lkey = sdev->pd->local_dma_lkey;
+
        sdev->srq_size = min(srpt_srq_size, sdev->device->attrs.max_srq_wr);
 
        srq_attr.event_handler = srpt_srq_event;
index 1b817e5..976e924 100644 (file)
@@ -343,7 +343,7 @@ struct srpt_port {
  * struct srpt_device - Information associated by SRPT with a single HCA.
  * @device:        Backpointer to the struct ib_device managed by the IB core.
  * @pd:            IB protection domain.
- * @mr:            L_Key (local key) with write access to all local memory.
+ * @lkey:          L_Key (local key) with write access to all local memory.
  * @srq:           Per-HCA SRQ (shared receive queue).
  * @cm_id:         Connection identifier.
  * @srq_size:      SRQ size.
@@ -358,6 +358,7 @@ struct srpt_port {
 struct srpt_device {
        struct ib_device        *device;
        struct ib_pd            *pd;
+       u32                     lkey;
        struct ib_srq           *srq;
        struct ib_cm_id         *cm_id;
        int                     srq_size;