xprtrdma: Create more MRs at a time
authorChuck Lever <chuck.lever@oracle.com>
Mon, 1 Oct 2018 18:25:20 +0000 (14:25 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 2 Oct 2018 19:46:35 +0000 (15:46 -0400)
Some devices require more than 3 MRs to build a single 1MB I/O.
Ensure that rpcrdma_mrs_create() will add enough MRs to build that
I/O.

In a subsequent patch I'm changing the MR recovery logic to just
toss out the MRs. In that case it's possible for ->send_request to
loop acquiring some MRs, not getting enough, getting called again,
recycling the previous MRs, then not getting enough, lather rinse
repeat. Thus first we need to ensure enough MRs are created to
prevent that loop.

I'm "reusing" ia->ri_max_segs. All of its accessors seem to want the
maximum number of data segments plus two, so I'm going to bake that
into the initial calculation.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/fmr_ops.c
net/sunrpc/xprtrdma/frwr_ops.c
net/sunrpc/xprtrdma/rpc_rdma.c
net/sunrpc/xprtrdma/verbs.c

index 0f7c465d9a5aa1abdd29ae583a19d52a9f092df6..db589a23682b32b50ef9f5aff11e433ad63aff44 100644 (file)
@@ -187,6 +187,7 @@ fmr_op_open(struct rpcrdma_ia *ia, struct rpcrdma_ep *ep,
 
        ia->ri_max_segs = max_t(unsigned int, 1, RPCRDMA_MAX_DATA_SEGS /
                                RPCRDMA_MAX_FMR_SGES);
+       ia->ri_max_segs += 2;   /* segments for head and tail buffers */
        return 0;
 }
 
index 1bb00dd6ccdb83b780328c935fd1d5ffcc7f2eef..1cc4db515c85faeacecbc3ce6b64e553d2f84ba0 100644 (file)
@@ -276,6 +276,7 @@ frwr_op_open(struct rpcrdma_ia *ia, struct rpcrdma_ep *ep,
 
        ia->ri_max_segs = max_t(unsigned int, 1, RPCRDMA_MAX_DATA_SEGS /
                                ia->ri_max_frwr_depth);
+       ia->ri_max_segs += 2;   /* segments for head and tail buffers */
        return 0;
 }
 
index 293b3d3e3e65dc4409f7d5df3bd5f7d6b33847c8..15edc050ca934dcf70e8ec47434d4179a5f4547c 100644 (file)
@@ -71,7 +71,6 @@ static unsigned int rpcrdma_max_call_header_size(unsigned int maxsegs)
        size = RPCRDMA_HDRLEN_MIN;
 
        /* Maximum Read list size */
-       maxsegs += 2;   /* segment for head and tail buffers */
        size = maxsegs * rpcrdma_readchunk_maxsz * sizeof(__be32);
 
        /* Minimal Read chunk size */
@@ -97,7 +96,6 @@ static unsigned int rpcrdma_max_reply_header_size(unsigned int maxsegs)
        size = RPCRDMA_HDRLEN_MIN;
 
        /* Maximum Write list size */
-       maxsegs += 2;   /* segment for head and tail buffers */
        size = sizeof(__be32);          /* segment count */
        size += maxsegs * rpcrdma_segment_maxsz * sizeof(__be32);
        size += sizeof(__be32); /* list discriminator */
index 956a5ea47b58ee8a6009aa8b6315ce5887ec9110..5625a5089f96f9402c1d379d9ed6f9f150a3a993 100644 (file)
@@ -1019,7 +1019,7 @@ rpcrdma_mrs_create(struct rpcrdma_xprt *r_xprt)
        LIST_HEAD(free);
        LIST_HEAD(all);
 
-       for (count = 0; count < 3; count++) {
+       for (count = 0; count < ia->ri_max_segs; count++) {
                struct rpcrdma_mr *mr;
                int rc;