svcrdma: Use max_sge_rd for destination read depths
authorSteve Wise <swise@opengridcomputing.com>
Mon, 27 Jul 2015 23:10:12 +0000 (18:10 -0500)
committerDoug Ledford <dledford@redhat.com>
Sat, 29 Aug 2015 03:02:11 +0000 (23:02 -0400)
Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
include/linux/sunrpc/svc_rdma.h
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
net/sunrpc/xprtrdma/svc_rdma_transport.c

index cb94ee4181d4937bd99e125891fe633fa6763719..83211bc9219e47fd760e39cfcdf505509ea1eba3 100644 (file)
@@ -132,6 +132,7 @@ struct svcxprt_rdma {
        struct list_head     sc_accept_q;       /* Conn. waiting accept */
        int                  sc_ord;            /* RDMA read limit */
        int                  sc_max_sge;
+       int                  sc_max_sge_rd;     /* max sge for read target */
 
        int                  sc_sq_depth;       /* Depth of SQ */
        atomic_t             sc_sq_count;       /* Number of SQ WR on queue */
index 2e1348bde325de89d22b8e5fcbcc897d50eba98f..cb51742840740f790d24797e585e7fb520646a09 100644 (file)
@@ -115,15 +115,6 @@ static void rdma_build_arg_xdr(struct svc_rqst *rqstp,
        rqstp->rq_arg.tail[0].iov_len = 0;
 }
 
-static int rdma_read_max_sge(struct svcxprt_rdma *xprt, int sge_count)
-{
-       if (!rdma_cap_read_multi_sge(xprt->sc_cm_id->device,
-                                    xprt->sc_cm_id->port_num))
-               return 1;
-       else
-               return min_t(int, sge_count, xprt->sc_max_sge);
-}
-
 /* Issue an RDMA_READ using the local lkey to map the data sink */
 int rdma_read_chunk_lcl(struct svcxprt_rdma *xprt,
                        struct svc_rqst *rqstp,
@@ -144,8 +135,7 @@ int rdma_read_chunk_lcl(struct svcxprt_rdma *xprt,
 
        ctxt->direction = DMA_FROM_DEVICE;
        ctxt->read_hdr = head;
-       pages_needed =
-               min_t(int, pages_needed, rdma_read_max_sge(xprt, pages_needed));
+       pages_needed = min_t(int, pages_needed, xprt->sc_max_sge_rd);
        read = min_t(int, pages_needed << PAGE_SHIFT, rs_length);
 
        for (pno = 0; pno < pages_needed; pno++) {
index 6b36279e428850ee6fc96e49e2997a2a5679dc3c..fdc850ffc26c42a3e027a303283dc382dc53e3b5 100644 (file)
@@ -872,6 +872,8 @@ 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);
+       newxprt->sc_max_sge_rd = min_t(size_t, devattr.max_sge_rd,
+                                      RPCSVC_MAXPAGES);
        newxprt->sc_max_requests = min((size_t)devattr.max_qp_wr,
                                   (size_t)svcrdma_max_requests);
        newxprt->sc_sq_depth = RPCRDMA_SQ_DEPTH_MULT * newxprt->sc_max_requests;
@@ -1046,6 +1048,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
                "    remote_ip       : %pI4\n"
                "    remote_port     : %d\n"
                "    max_sge         : %d\n"
+               "    max_sge_rd      : %d\n"
                "    sq_depth        : %d\n"
                "    max_requests    : %d\n"
                "    ord             : %d\n",
@@ -1059,6 +1062,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
                ntohs(((struct sockaddr_in *)&newxprt->sc_cm_id->
                       route.addr.dst_addr)->sin_port),
                newxprt->sc_max_sge,
+               newxprt->sc_max_sge_rd,
                newxprt->sc_sq_depth,
                newxprt->sc_max_requests,
                newxprt->sc_ord);