aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/xprtrdma/verbs.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/xprtrdma/verbs.c')
-rw-r--r--net/sunrpc/xprtrdma/verbs.c49
1 files changed, 15 insertions, 34 deletions
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index c3319e12551c..da55cda30568 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -2212,43 +2212,24 @@ rpcrdma_ep_post_recv(struct rpcrdma_ia *ia,
2212 return rc; 2212 return rc;
2213} 2213}
2214 2214
2215/* Physical mapping means one Read/Write list entry per-page. 2215/* How many chunk list items fit within our inline buffers?
2216 * All list entries must fit within an inline buffer
2217 *
2218 * NB: The server must return a Write list for NFS READ,
2219 * which has the same constraint. Factor in the inline
2220 * rsize as well.
2221 */ 2216 */
2222static size_t 2217unsigned int
2223rpcrdma_physical_max_payload(struct rpcrdma_xprt *r_xprt) 2218rpcrdma_max_segments(struct rpcrdma_xprt *r_xprt)
2224{ 2219{
2225 struct rpcrdma_create_data_internal *cdata = &r_xprt->rx_data; 2220 struct rpcrdma_create_data_internal *cdata = &r_xprt->rx_data;
2226 unsigned int inline_size, pages; 2221 int bytes, segments;
2227
2228 inline_size = min_t(unsigned int,
2229 cdata->inline_wsize, cdata->inline_rsize);
2230 inline_size -= RPCRDMA_HDRLEN_MIN;
2231 pages = inline_size / sizeof(struct rpcrdma_segment);
2232 return pages << PAGE_SHIFT;
2233}
2234 2222
2235static size_t 2223 bytes = min_t(unsigned int, cdata->inline_wsize, cdata->inline_rsize);
2236rpcrdma_mr_max_payload(struct rpcrdma_xprt *r_xprt) 2224 bytes -= RPCRDMA_HDRLEN_MIN;
2237{ 2225 if (bytes < sizeof(struct rpcrdma_segment) * 2) {
2238 return RPCRDMA_MAX_DATA_SEGS << PAGE_SHIFT; 2226 pr_warn("RPC: %s: inline threshold too small\n",
2239} 2227 __func__);
2240 2228 return 0;
2241size_t
2242rpcrdma_max_payload(struct rpcrdma_xprt *r_xprt)
2243{
2244 size_t result;
2245
2246 switch (r_xprt->rx_ia.ri_memreg_strategy) {
2247 case RPCRDMA_ALLPHYSICAL:
2248 result = rpcrdma_physical_max_payload(r_xprt);
2249 break;
2250 default:
2251 result = rpcrdma_mr_max_payload(r_xprt);
2252 } 2229 }
2253 return result; 2230
2231 segments = 1 << (fls(bytes / sizeof(struct rpcrdma_segment)) - 1);
2232 dprintk("RPC: %s: max chunk list size = %d segments\n",
2233 __func__, segments);
2234 return segments;
2254} 2235}