list.addr = ioctx->ioctx.dma;
        list.length = srp_max_req_size;
-       list.lkey = sdev->mr->lkey;
+       list.lkey = sdev->pd->local_dma_lkey;
 
        wr.next = NULL;
        wr.sg_list = &list;
 
        list.addr = ioctx->ioctx.dma;
        list.length = len;
-       list.lkey = sdev->mr->lkey;
+       list.lkey = sdev->pd->local_dma_lkey;
 
        wr.next = NULL;
        wr.wr_id = encode_wr_id(SRPT_SEND, ioctx->ioctx.index);
 
                while (rsize > 0 && tsize > 0) {
                        sge->addr = dma_addr;
-                       sge->lkey = ch->sport->sdev->mr->lkey;
+                       sge->lkey = ch->sport->sdev->pd->local_dma_lkey;
 
                        if (rsize >= dma_len) {
                                sge->length =
        if (IS_ERR(sdev->pd))
                goto free_dev;
 
-       sdev->mr = ib_get_dma_mr(sdev->pd, IB_ACCESS_LOCAL_WRITE);
-       if (IS_ERR(sdev->mr))
-               goto err_pd;
-
        sdev->srq_size = min(srpt_srq_size, sdev->dev_attr.max_srq_wr);
 
        srq_attr.event_handler = srpt_srq_event;
 
        sdev->srq = ib_create_srq(sdev->pd, &srq_attr);
        if (IS_ERR(sdev->srq))
-               goto err_mr;
+               goto err_pd;
 
        pr_debug("%s: create SRQ #wr= %d max_allow=%d dev= %s\n",
                 __func__, sdev->srq_size, sdev->dev_attr.max_srq_wr,
        ib_destroy_cm_id(sdev->cm_id);
 err_srq:
        ib_destroy_srq(sdev->srq);
-err_mr:
-       ib_dereg_mr(sdev->mr);
 err_pd:
        ib_dealloc_pd(sdev->pd);
 free_dev:
        srpt_release_sdev(sdev);
 
        ib_destroy_srq(sdev->srq);
-       ib_dereg_mr(sdev->mr);
        ib_dealloc_pd(sdev->pd);
 
        srpt_free_ioctx_ring((struct srpt_ioctx **)sdev->ioctx_ring, sdev,