SUNRPC: Add a transport-specific private field in rpc_rqst
authorChuck Lever <chuck.lever@oracle.com>
Thu, 15 Sep 2016 14:55:45 +0000 (10:55 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 19 Sep 2016 17:08:37 +0000 (13:08 -0400)
Currently there's a hidden and indirect mechanism for finding the
rpcrdma_req that goes with an rpc_rqst. It depends on getting from
the rq_buffer pointer in struct rpc_rqst to the struct
rpcrdma_regbuf that controls that buffer, and then to the struct
rpcrdma_req it goes with.

This was done back in the day to avoid the need to add a per-rqst
pointer or to alter the buf_free API when support for RPC-over-RDMA
was introduced.

I'm about to change the way regbuf's work to support larger inline
thresholds. Now is a good time to replace this indirect mechanism
with something that is more straightforward. I guess this should be
considered a clean up.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
include/linux/sunrpc/xprt.h
net/sunrpc/xprtrdma/backchannel.c
net/sunrpc/xprtrdma/transport.c
net/sunrpc/xprtrdma/verbs.c
net/sunrpc/xprtrdma/xprt_rdma.h

index 46f069efa0561baa62eadad1a8187cc330e6274f..a5da60b24d83ec79fb75bae8cd91ae52b6bcccc8 100644 (file)
@@ -83,6 +83,7 @@ struct rpc_rqst {
        void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */
        struct list_head        rq_list;
 
+       void                    *rq_xprtdata;   /* Per-xprt private data */
        void                    *rq_buffer;     /* Call XDR encode buffer */
        size_t                  rq_callsize;
        void                    *rq_rbuffer;    /* Reply XDR decode buffer */
index d3cfaf281e55de31f0f81e0123ab1d3ab4a145d8..c4904f881640189f6cdf1ae0096760a64d944637 100644 (file)
@@ -55,11 +55,9 @@ static int rpcrdma_bc_setup_rqst(struct rpcrdma_xprt *r_xprt,
        rb = rpcrdma_alloc_regbuf(ia, size, GFP_KERNEL);
        if (IS_ERR(rb))
                goto out_fail;
-       rb->rg_owner = req;
        req->rl_sendbuf = rb;
-       /* so that rpcr_to_rdmar works when receiving a request */
-       rqst->rq_buffer = (void *)req->rl_sendbuf->rg_base;
-       xdr_buf_init(&rqst->rq_snd_buf, rqst->rq_buffer, size);
+       xdr_buf_init(&rqst->rq_snd_buf, rb->rg_base, size);
+       rpcrdma_set_xprtdata(rqst, req);
        return 0;
 
 out_fail:
index 136caf3dd299c93a42a163b2e22a1f0471c789cd..d83bffa92dfc431ba2d044ce0150cfa2c42c322e 100644 (file)
@@ -523,6 +523,7 @@ xprt_rdma_allocate(struct rpc_task *task)
 out:
        dprintk("RPC:       %s: size %zd, request 0x%p\n", __func__, size, req);
        req->rl_connect_cookie = 0;     /* our reserved value */
+       rpcrdma_set_xprtdata(rqst, req);
        rqst->rq_buffer = req->rl_sendbuf->rg_base;
        rqst->rq_rbuffer = (char *)rqst->rq_buffer + rqst->rq_rcvsize;
        return 0;
@@ -559,7 +560,6 @@ out_sendbuf:
        rb = rpcrdma_alloc_regbuf(&r_xprt->rx_ia, size, flags);
        if (IS_ERR(rb))
                goto out_fail;
-       rb->rg_owner = req;
 
        r_xprt->rx_stats.hardway_register_count += size;
        rpcrdma_free_regbuf(&r_xprt->rx_ia, req->rl_sendbuf);
index 799cce6cbe45e89f4030d4cd1a17a15b56cf3cf2..93def0bf07af6bf4ecdcb80a5839184386e5af38 100644 (file)
@@ -1210,7 +1210,6 @@ rpcrdma_alloc_regbuf(struct rpcrdma_ia *ia, size_t size, gfp_t flags)
        iov->length = size;
        iov->lkey = ia->ri_pd->local_dma_lkey;
        rb->rg_size = size;
-       rb->rg_owner = NULL;
        return rb;
 
 out_free:
index 4838a85bdcf6b12103279387162179b80084d4a7..484855eddb85d75266945a2b61222aa4ed5fcaa4 100644 (file)
@@ -113,7 +113,6 @@ struct rpcrdma_ep {
 
 struct rpcrdma_regbuf {
        size_t                  rg_size;
-       struct rpcrdma_req      *rg_owner;
        struct ib_sge           rg_iov;
        __be32                  rg_base[0] __attribute__ ((aligned(256)));
 };
@@ -297,14 +296,16 @@ struct rpcrdma_req {
        struct rpcrdma_mr_seg   rl_segments[RPCRDMA_MAX_SEGS];
 };
 
+static inline void
+rpcrdma_set_xprtdata(struct rpc_rqst *rqst, struct rpcrdma_req *req)
+{
+       rqst->rq_xprtdata = req;
+}
+
 static inline struct rpcrdma_req *
 rpcr_to_rdmar(struct rpc_rqst *rqst)
 {
-       void *buffer = rqst->rq_buffer;
-       struct rpcrdma_regbuf *rb;
-
-       rb = container_of(buffer, struct rpcrdma_regbuf, rg_base);
-       return rb->rg_owner;
+       return rqst->rq_xprtdata;
 }
 
 /*