diff options
Diffstat (limited to 'net/sunrpc/xprtrdma/verbs.c')
-rw-r--r-- | net/sunrpc/xprtrdma/verbs.c | 49 |
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 | */ |
2222 | static size_t | 2217 | unsigned int |
2223 | rpcrdma_physical_max_payload(struct rpcrdma_xprt *r_xprt) | 2218 | rpcrdma_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 | ||
2235 | static size_t | 2223 | bytes = min_t(unsigned int, cdata->inline_wsize, cdata->inline_rsize); |
2236 | rpcrdma_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; | |
2241 | size_t | ||
2242 | rpcrdma_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 | } |