svcrdma: Remove frmr cache
authorChuck Lever <chuck.lever@oracle.com>
Fri, 23 Jun 2017 21:18:57 +0000 (17:18 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 12 Jul 2017 19:54:58 +0000 (15:54 -0400)
Clean up: Now that the svc_rdma_recvfrom path uses the rdma_rw API,
the details of Read sink buffer registration are dealt with by the
kernel's RDMA core. This cache is no longer used, and can be
removed.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
include/linux/sunrpc/svc_rdma.h
net/sunrpc/xprtrdma/svc_rdma_transport.c

index 06d58a3f74bc637e26420c2ee7a094add5dc658f..fd7775f70bb5e058576c2569269e7a51d00eadf1 100644 (file)
@@ -77,7 +77,6 @@ extern atomic_t rdma_stat_sq_prod;
  */
 struct svc_rdma_op_ctxt {
        struct list_head list;
-       struct svc_rdma_fastreg_mr *frmr;
        struct xdr_buf arg;
        struct ib_cqe cqe;
        u32 byte_len;
@@ -91,17 +90,6 @@ struct svc_rdma_op_ctxt {
        struct page *pages[RPCSVC_MAXPAGES];
 };
 
-struct svc_rdma_fastreg_mr {
-       struct ib_mr *mr;
-       struct scatterlist *sg;
-       int sg_nents;
-       unsigned long access_flags;
-       enum dma_data_direction direction;
-       struct list_head frmr_list;
-};
-
-#define RDMACTXT_F_LAST_CTXT   2
-
 #define        SVCRDMA_DEVCAP_FAST_REG         1       /* fast mr registration */
 #define        SVCRDMA_DEVCAP_READ_W_INV       2       /* read w/ invalidate */
 
@@ -136,9 +124,6 @@ struct svcxprt_rdma {
        struct ib_cq         *sc_rq_cq;
        struct ib_cq         *sc_sq_cq;
        u32                  sc_dev_caps;       /* distilled device caps */
-       unsigned int         sc_frmr_pg_list_len;
-       struct list_head     sc_frmr_q;
-       spinlock_t           sc_frmr_q_lock;
 
        spinlock_t           sc_lock;           /* transport lock */
 
@@ -210,9 +195,6 @@ extern int svc_rdma_create_listen(struct svc_serv *, int, struct sockaddr *);
 extern struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *);
 extern void svc_rdma_put_context(struct svc_rdma_op_ctxt *, int);
 extern void svc_rdma_unmap_dma(struct svc_rdma_op_ctxt *ctxt);
-extern struct svc_rdma_fastreg_mr *svc_rdma_get_frmr(struct svcxprt_rdma *);
-extern void svc_rdma_put_frmr(struct svcxprt_rdma *,
-                             struct svc_rdma_fastreg_mr *);
 extern void svc_sq_reap(struct svcxprt_rdma *);
 extern void svc_rq_reap(struct svcxprt_rdma *);
 extern void svc_rdma_prep_reply_hdr(struct svc_rqst *);
index c915cba0f8e60003bbea63d84771f637eca20a1d..8864105d86ec321adac12c3e6e5544d9a3912f4c 100644 (file)
@@ -202,7 +202,6 @@ struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt)
 out:
        ctxt->count = 0;
        ctxt->mapped_sges = 0;
-       ctxt->frmr = NULL;
        return ctxt;
 
 out_empty:
@@ -387,14 +386,12 @@ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv,
        INIT_LIST_HEAD(&cma_xprt->sc_accept_q);
        INIT_LIST_HEAD(&cma_xprt->sc_rq_dto_q);
        INIT_LIST_HEAD(&cma_xprt->sc_read_complete_q);
-       INIT_LIST_HEAD(&cma_xprt->sc_frmr_q);
        INIT_LIST_HEAD(&cma_xprt->sc_ctxts);
        INIT_LIST_HEAD(&cma_xprt->sc_rw_ctxts);
        init_waitqueue_head(&cma_xprt->sc_send_wait);
 
        spin_lock_init(&cma_xprt->sc_lock);
        spin_lock_init(&cma_xprt->sc_rq_dto_lock);
-       spin_lock_init(&cma_xprt->sc_frmr_q_lock);
        spin_lock_init(&cma_xprt->sc_ctxt_lock);
        spin_lock_init(&cma_xprt->sc_rw_ctxt_lock);
 
@@ -705,86 +702,6 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
        return ERR_PTR(ret);
 }
 
-static struct svc_rdma_fastreg_mr *rdma_alloc_frmr(struct svcxprt_rdma *xprt)
-{
-       struct ib_mr *mr;
-       struct scatterlist *sg;
-       struct svc_rdma_fastreg_mr *frmr;
-       u32 num_sg;
-
-       frmr = kmalloc(sizeof(*frmr), GFP_KERNEL);
-       if (!frmr)
-               goto err;
-
-       num_sg = min_t(u32, RPCSVC_MAXPAGES, xprt->sc_frmr_pg_list_len);
-       mr = ib_alloc_mr(xprt->sc_pd, IB_MR_TYPE_MEM_REG, num_sg);
-       if (IS_ERR(mr))
-               goto err_free_frmr;
-
-       sg = kcalloc(RPCSVC_MAXPAGES, sizeof(*sg), GFP_KERNEL);
-       if (!sg)
-               goto err_free_mr;
-
-       sg_init_table(sg, RPCSVC_MAXPAGES);
-
-       frmr->mr = mr;
-       frmr->sg = sg;
-       INIT_LIST_HEAD(&frmr->frmr_list);
-       return frmr;
-
- err_free_mr:
-       ib_dereg_mr(mr);
- err_free_frmr:
-       kfree(frmr);
- err:
-       return ERR_PTR(-ENOMEM);
-}
-
-static void rdma_dealloc_frmr_q(struct svcxprt_rdma *xprt)
-{
-       struct svc_rdma_fastreg_mr *frmr;
-
-       while (!list_empty(&xprt->sc_frmr_q)) {
-               frmr = list_entry(xprt->sc_frmr_q.next,
-                                 struct svc_rdma_fastreg_mr, frmr_list);
-               list_del_init(&frmr->frmr_list);
-               kfree(frmr->sg);
-               ib_dereg_mr(frmr->mr);
-               kfree(frmr);
-       }
-}
-
-struct svc_rdma_fastreg_mr *svc_rdma_get_frmr(struct svcxprt_rdma *rdma)
-{
-       struct svc_rdma_fastreg_mr *frmr = NULL;
-
-       spin_lock(&rdma->sc_frmr_q_lock);
-       if (!list_empty(&rdma->sc_frmr_q)) {
-               frmr = list_entry(rdma->sc_frmr_q.next,
-                                 struct svc_rdma_fastreg_mr, frmr_list);
-               list_del_init(&frmr->frmr_list);
-               frmr->sg_nents = 0;
-       }
-       spin_unlock(&rdma->sc_frmr_q_lock);
-       if (frmr)
-               return frmr;
-
-       return rdma_alloc_frmr(rdma);
-}
-
-void svc_rdma_put_frmr(struct svcxprt_rdma *rdma,
-                      struct svc_rdma_fastreg_mr *frmr)
-{
-       if (frmr) {
-               ib_dma_unmap_sg(rdma->sc_cm_id->device,
-                               frmr->sg, frmr->sg_nents, frmr->direction);
-               spin_lock(&rdma->sc_frmr_q_lock);
-               WARN_ON_ONCE(!list_empty(&frmr->frmr_list));
-               list_add(&frmr->frmr_list, &rdma->sc_frmr_q);
-               spin_unlock(&rdma->sc_frmr_q_lock);
-       }
-}
-
 /*
  * This is the xpo_recvfrom function for listening endpoints. Its
  * purpose is to accept incoming connections. The CMA callback handler
@@ -922,8 +839,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
         *      of an RDMA_READ. IB does not.
         */
        if (dev->attrs.device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS) {
-               newxprt->sc_frmr_pg_list_len =
-                       dev->attrs.max_fast_reg_page_list_len;
                newxprt->sc_dev_caps |= SVCRDMA_DEVCAP_FAST_REG;
        } else
                newxprt->sc_snd_w_inv = false;
@@ -1063,7 +978,6 @@ static void __svc_rdma_free(struct work_struct *work)
                xprt->xpt_bc_xprt = NULL;
        }
 
-       rdma_dealloc_frmr_q(rdma);
        svc_rdma_destroy_rw_ctxts(rdma);
        svc_rdma_destroy_ctxts(rdma);