]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
svcrdma: Define maximum number of backchannel requests
authorChuck Lever <chuck.lever@oracle.com>
Wed, 26 Aug 2015 20:26:17 +0000 (14:26 -0600)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 31 Aug 2015 20:46:02 +0000 (14:46 -0600)
[ Proposed for v4.4 ]

Extra resources for handling backchannel requests have to be
pre-allocated when a transport instance is created. Set a limit.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
include/linux/sunrpc/svc_rdma.h
net/sunrpc/xprtrdma/svc_rdma_transport.c

index c60173048786dc87aeb7073febf4bad27e4c66fa..a91f760254d9e27ff6b436dd4b0c404db0b72bf8 100644 (file)
@@ -179,6 +179,11 @@ struct svcxprt_rdma {
 #define RPCRDMA_SQ_DEPTH_MULT   8
 #define RPCRDMA_MAX_REQUESTS    32
 #define RPCRDMA_MAX_REQ_SIZE    4096
+#if defined(CONFIG_SUNRPC_BACKCHANNEL)
+#define RPCRDMA_MAX_BC_REQUESTS        8
+#else
+#define RPCRDMA_MAX_BC_REQUESTS        0
+#endif
 
 #define RPCSVC_MAXPAYLOAD_RDMA RPCSVC_MAXPAYLOAD
 
index ac4b718c5746649937fc571350a86dbdee309b0a..e35cf9c5fe81305c922e05f1c0b874ca44a27ef7 100644 (file)
@@ -923,8 +923,10 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
         * capabilities of this particular device */
        newxprt->sc_max_sge = min((size_t)devattr.max_sge,
                                  (size_t)RPCSVC_MAXPAGES);
+       /* XXX: what if HCA can't support enough WRs for bc operation? */
        newxprt->sc_max_requests = min((size_t)devattr.max_qp_wr,
-                                  (size_t)svcrdma_max_requests);
+                                      (size_t)(svcrdma_max_requests +
+                                      RPCRDMA_MAX_BC_REQUESTS));
        newxprt->sc_sq_depth = RPCRDMA_SQ_DEPTH_MULT * newxprt->sc_max_requests;
 
        /*
@@ -964,7 +966,8 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
        qp_attr.event_handler = qp_event_handler;
        qp_attr.qp_context = &newxprt->sc_xprt;
        qp_attr.cap.max_send_wr = newxprt->sc_sq_depth;
-       qp_attr.cap.max_recv_wr = newxprt->sc_max_requests;
+       qp_attr.cap.max_recv_wr = newxprt->sc_max_requests +
+                                 RPCRDMA_MAX_BC_REQUESTS;
        qp_attr.cap.max_send_sge = newxprt->sc_max_sge;
        qp_attr.cap.max_recv_sge = newxprt->sc_max_sge;
        qp_attr.sq_sig_type = IB_SIGNAL_REQ_WR;