IB/iser: use IB_PD_UNSAFE_GLOBAL_RKEY
authorChristoph Hellwig <hch@lst.de>
Mon, 5 Sep 2016 10:56:18 +0000 (12:56 +0200)
committerDoug Ledford <dledford@redhat.com>
Fri, 23 Sep 2016 17:47:44 +0000 (13:47 -0400)
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/ulp/iser/iscsi_iser.h
drivers/infiniband/ulp/iser/iser_memory.c
drivers/infiniband/ulp/iser/iser_verbs.c

index 0351059..0be6a7c 100644 (file)
@@ -374,7 +374,6 @@ struct iser_reg_ops {
 struct iser_device {
        struct ib_device             *ib_device;
        struct ib_pd                 *pd;
-       struct ib_mr                 *mr;
        struct ib_event_handler      event_handler;
        struct list_head             ig_list;
        int                          refcount;
index 90be568..9c3e9ab 100644 (file)
@@ -199,7 +199,11 @@ iser_reg_dma(struct iser_device *device, struct iser_data_buf *mem,
         * FIXME: rework the registration code path to differentiate
         * rkey/lkey use cases
         */
-       reg->rkey = device->mr ? device->mr->rkey : 0;
+
+       if (device->pd->flags & IB_PD_UNSAFE_GLOBAL_RKEY)
+               reg->rkey = device->pd->unsafe_global_rkey;
+       else
+               reg->rkey = 0;
        reg->sge.addr = ib_sg_dma_address(device->ib_device, &sg[0]);
        reg->sge.length = ib_sg_dma_len(device->ib_device, &sg[0]);
 
index e9de992..a4b791d 100644 (file)
@@ -88,7 +88,8 @@ static int iser_create_device_ib_res(struct iser_device *device)
                  device->comps_used, ib_dev->name,
                  ib_dev->num_comp_vectors, max_cqe);
 
-       device->pd = ib_alloc_pd(ib_dev, 0);
+       device->pd = ib_alloc_pd(ib_dev,
+               iser_always_reg ? 0 : IB_PD_UNSAFE_GLOBAL_RKEY);
        if (IS_ERR(device->pd))
                goto pd_err;
 
@@ -103,26 +104,13 @@ static int iser_create_device_ib_res(struct iser_device *device)
                }
        }
 
-       if (!iser_always_reg) {
-               int access = IB_ACCESS_LOCAL_WRITE |
-                            IB_ACCESS_REMOTE_WRITE |
-                            IB_ACCESS_REMOTE_READ;
-
-               device->mr = ib_get_dma_mr(device->pd, access);
-               if (IS_ERR(device->mr))
-                       goto cq_err;
-       }
-
        INIT_IB_EVENT_HANDLER(&device->event_handler, ib_dev,
                              iser_event_handler);
        if (ib_register_event_handler(&device->event_handler))
-               goto handler_err;
+               goto cq_err;
 
        return 0;
 
-handler_err:
-       if (device->mr)
-               ib_dereg_mr(device->mr);
 cq_err:
        for (i = 0; i < device->comps_used; i++) {
                struct iser_comp *comp = &device->comps[i];
@@ -154,14 +142,10 @@ static void iser_free_device_ib_res(struct iser_device *device)
        }
 
        (void)ib_unregister_event_handler(&device->event_handler);
-       if (device->mr)
-               (void)ib_dereg_mr(device->mr);
        ib_dealloc_pd(device->pd);
 
        kfree(device->comps);
        device->comps = NULL;
-
-       device->mr = NULL;
        device->pd = NULL;
 }