Loading net/sunrpc/xprtrdma/rpc_rdma.c +2 −0 Original line number Original line Diff line number Diff line Loading @@ -249,6 +249,8 @@ rpcrdma_create_chunks(struct rpc_rqst *rqst, struct xdr_buf *target, req->rl_nchunks = nchunks; req->rl_nchunks = nchunks; BUG_ON(nchunks == 0); BUG_ON(nchunks == 0); BUG_ON((r_xprt->rx_ia.ri_memreg_strategy == RPCRDMA_FRMR) && (nchunks > 3)); /* /* * finish off header. If write, marshal discrim and nchunks. * finish off header. If write, marshal discrim and nchunks. Loading net/sunrpc/xprtrdma/verbs.c +16 −4 Original line number Original line Diff line number Diff line Loading @@ -650,10 +650,22 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia, ep->rep_attr.cap.max_send_wr = cdata->max_requests; ep->rep_attr.cap.max_send_wr = cdata->max_requests; switch (ia->ri_memreg_strategy) { switch (ia->ri_memreg_strategy) { case RPCRDMA_FRMR: case RPCRDMA_FRMR: /* Add room for frmr register and invalidate WRs */ /* Add room for frmr register and invalidate WRs. ep->rep_attr.cap.max_send_wr *= 3; * 1. FRMR reg WR for head if (ep->rep_attr.cap.max_send_wr > devattr.max_qp_wr) * 2. FRMR invalidate WR for head * 3. FRMR reg WR for pagelist * 4. FRMR invalidate WR for pagelist * 5. FRMR reg WR for tail * 6. FRMR invalidate WR for tail * 7. The RDMA_SEND WR */ ep->rep_attr.cap.max_send_wr *= 7; if (ep->rep_attr.cap.max_send_wr > devattr.max_qp_wr) { cdata->max_requests = devattr.max_qp_wr / 7; if (!cdata->max_requests) return -EINVAL; return -EINVAL; ep->rep_attr.cap.max_send_wr = cdata->max_requests * 7; } break; break; case RPCRDMA_MEMWINDOWS_ASYNC: case RPCRDMA_MEMWINDOWS_ASYNC: case RPCRDMA_MEMWINDOWS: case RPCRDMA_MEMWINDOWS: Loading Loading
net/sunrpc/xprtrdma/rpc_rdma.c +2 −0 Original line number Original line Diff line number Diff line Loading @@ -249,6 +249,8 @@ rpcrdma_create_chunks(struct rpc_rqst *rqst, struct xdr_buf *target, req->rl_nchunks = nchunks; req->rl_nchunks = nchunks; BUG_ON(nchunks == 0); BUG_ON(nchunks == 0); BUG_ON((r_xprt->rx_ia.ri_memreg_strategy == RPCRDMA_FRMR) && (nchunks > 3)); /* /* * finish off header. If write, marshal discrim and nchunks. * finish off header. If write, marshal discrim and nchunks. Loading
net/sunrpc/xprtrdma/verbs.c +16 −4 Original line number Original line Diff line number Diff line Loading @@ -650,10 +650,22 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia, ep->rep_attr.cap.max_send_wr = cdata->max_requests; ep->rep_attr.cap.max_send_wr = cdata->max_requests; switch (ia->ri_memreg_strategy) { switch (ia->ri_memreg_strategy) { case RPCRDMA_FRMR: case RPCRDMA_FRMR: /* Add room for frmr register and invalidate WRs */ /* Add room for frmr register and invalidate WRs. ep->rep_attr.cap.max_send_wr *= 3; * 1. FRMR reg WR for head if (ep->rep_attr.cap.max_send_wr > devattr.max_qp_wr) * 2. FRMR invalidate WR for head * 3. FRMR reg WR for pagelist * 4. FRMR invalidate WR for pagelist * 5. FRMR reg WR for tail * 6. FRMR invalidate WR for tail * 7. The RDMA_SEND WR */ ep->rep_attr.cap.max_send_wr *= 7; if (ep->rep_attr.cap.max_send_wr > devattr.max_qp_wr) { cdata->max_requests = devattr.max_qp_wr / 7; if (!cdata->max_requests) return -EINVAL; return -EINVAL; ep->rep_attr.cap.max_send_wr = cdata->max_requests * 7; } break; break; case RPCRDMA_MEMWINDOWS_ASYNC: case RPCRDMA_MEMWINDOWS_ASYNC: case RPCRDMA_MEMWINDOWS: case RPCRDMA_MEMWINDOWS: Loading