diff options
| author | Tom Tucker <tom@ogc.us> | 2010-08-11 12:47:24 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-08-11 12:47:24 -0400 |
| commit | 15cdc644b268a9a9ce73ce0b153129222c254b7b (patch) | |
| tree | aca119f733a5c0823ed4b294c3eef4a222d55b7c | |
| parent | 7a8b80eb38b248cfdf84048dad12073d5cfba3e6 (diff) | |
rpcrdma: Fix SQ size calculation when memreg is FRMR
This patch updates the computation to include the worst case situation
where three FRMR are required to map a single RPC REQ.
Signed-off-by: Tom Tucker <tom@ogc.us>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
| -rw-r--r-- | net/sunrpc/xprtrdma/rpc_rdma.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/xprtrdma/verbs.c | 20 |
2 files changed, 18 insertions, 4 deletions
diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c index e5e28d1946a4..2ac3f6e8adff 100644 --- a/net/sunrpc/xprtrdma/rpc_rdma.c +++ b/net/sunrpc/xprtrdma/rpc_rdma.c | |||
| @@ -249,6 +249,8 @@ rpcrdma_create_chunks(struct rpc_rqst *rqst, struct xdr_buf *target, | |||
| 249 | req->rl_nchunks = nchunks; | 249 | req->rl_nchunks = nchunks; |
| 250 | 250 | ||
| 251 | BUG_ON(nchunks == 0); | 251 | BUG_ON(nchunks == 0); |
| 252 | BUG_ON((r_xprt->rx_ia.ri_memreg_strategy == RPCRDMA_FRMR) | ||
| 253 | && (nchunks > 3)); | ||
| 252 | 254 | ||
| 253 | /* | 255 | /* |
| 254 | * finish off header. If write, marshal discrim and nchunks. | 256 | * finish off header. If write, marshal discrim and nchunks. |
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index 3bdbd9f3b88f..5f4c7b3bc711 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c | |||
| @@ -650,10 +650,22 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia, | |||
| 650 | ep->rep_attr.cap.max_send_wr = cdata->max_requests; | 650 | ep->rep_attr.cap.max_send_wr = cdata->max_requests; |
| 651 | switch (ia->ri_memreg_strategy) { | 651 | switch (ia->ri_memreg_strategy) { |
| 652 | case RPCRDMA_FRMR: | 652 | case RPCRDMA_FRMR: |
| 653 | /* Add room for frmr register and invalidate WRs */ | 653 | /* Add room for frmr register and invalidate WRs. |
| 654 | ep->rep_attr.cap.max_send_wr *= 3; | 654 | * 1. FRMR reg WR for head |
| 655 | if (ep->rep_attr.cap.max_send_wr > devattr.max_qp_wr) | 655 | * 2. FRMR invalidate WR for head |
| 656 | return -EINVAL; | 656 | * 3. FRMR reg WR for pagelist |
| 657 | * 4. FRMR invalidate WR for pagelist | ||
| 658 | * 5. FRMR reg WR for tail | ||
| 659 | * 6. FRMR invalidate WR for tail | ||
| 660 | * 7. The RDMA_SEND WR | ||
| 661 | */ | ||
| 662 | ep->rep_attr.cap.max_send_wr *= 7; | ||
| 663 | if (ep->rep_attr.cap.max_send_wr > devattr.max_qp_wr) { | ||
| 664 | cdata->max_requests = devattr.max_qp_wr / 7; | ||
| 665 | if (!cdata->max_requests) | ||
| 666 | return -EINVAL; | ||
| 667 | ep->rep_attr.cap.max_send_wr = cdata->max_requests * 7; | ||
| 668 | } | ||
| 657 | break; | 669 | break; |
| 658 | case RPCRDMA_MEMWINDOWS_ASYNC: | 670 | case RPCRDMA_MEMWINDOWS_ASYNC: |
| 659 | case RPCRDMA_MEMWINDOWS: | 671 | case RPCRDMA_MEMWINDOWS: |
