xprtrdma: Refactor initialization of ep->rep_max_requests
authorChuck Lever <chuck.lever@oracle.com>
Fri, 3 Jan 2020 16:56:37 +0000 (11:56 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 15 Jan 2020 15:54:32 +0000 (10:54 -0500)
Clean up: there is no need to keep two copies of the same value.
Also, in subsequent patches, rpcrdma_ep_create() will be called in
the connect worker rather than at set-up time.

Minor fix: Initialize the transport's sendctx to the value based on
the capabilities of the underlying device, not the maximum setting.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/rpc_rdma.c
net/sunrpc/xprtrdma/transport.c
net/sunrpc/xprtrdma/verbs.c
net/sunrpc/xprtrdma/xprt_rdma.h

index af917228d2457eb8f54e5fe4f8ad8d19476ea608..520323ddc930e192d4f1b4479102c78756a65950 100644 (file)
@@ -909,7 +909,7 @@ rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst)
                goto out_err;
        *p++ = rqst->rq_xid;
        *p++ = rpcrdma_version;
-       *p++ = cpu_to_be32(r_xprt->rx_buf.rb_max_requests);
+       *p++ = r_xprt->rx_buf.rb_max_requests;
 
        /* When the ULP employs a GSS flavor that guarantees integrity
         * or privacy, direct data placement of individual data items
@@ -1480,8 +1480,8 @@ void rpcrdma_reply_handler(struct rpcrdma_rep *rep)
 
        if (credits == 0)
                credits = 1;    /* don't deadlock */
-       else if (credits > buf->rb_max_requests)
-               credits = buf->rb_max_requests;
+       else if (credits > r_xprt->rx_ep.rep_max_requests)
+               credits = r_xprt->rx_ep.rep_max_requests;
        if (buf->rb_credits != credits)
                rpcrdma_update_cwnd(r_xprt, credits);
        rpcrdma_post_recvs(r_xprt, false);
index 7395eb2cfdeba3adb3185d8c0a6b483337707637..f868a75057ad8b7442c6acf0e4f33bdec60d35a0 100644 (file)
@@ -316,7 +316,8 @@ xprt_setup_rdma(struct xprt_create *args)
        if (args->addrlen > sizeof(xprt->addr))
                return ERR_PTR(-EBADF);
 
-       xprt = xprt_alloc(args->net, sizeof(struct rpcrdma_xprt), 0, 0);
+       xprt = xprt_alloc(args->net, sizeof(struct rpcrdma_xprt), 0,
+                         xprt_rdma_slot_table_entries);
        if (!xprt)
                return ERR_PTR(-ENOMEM);
 
index b6aba0c859988762fc3a1805bff01ad97e17de79..766e77592cfd98924010f5a71a42c5025f102689 100644 (file)
@@ -475,13 +475,14 @@ int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt)
        struct ib_cq *sendcq, *recvcq;
        int rc;
 
-       ep->rep_max_requests = xprt_rdma_slot_table_entries;
+       ep->rep_max_requests = r_xprt->rx_xprt.max_reqs;
        ep->rep_inline_send = xprt_rdma_max_inline_write;
        ep->rep_inline_recv = xprt_rdma_max_inline_read;
 
        rc = frwr_open(ia, ep);
        if (rc)
                return rc;
+       r_xprt->rx_buf.rb_max_requests = cpu_to_be32(ep->rep_max_requests);
 
        ep->rep_attr.event_handler = rpcrdma_qp_event_handler;
        ep->rep_attr.qp_context = ep;
@@ -821,7 +822,7 @@ static int rpcrdma_sendctxs_create(struct rpcrdma_xprt *r_xprt)
         * the ->send_request call to fail temporarily before too many
         * Sends are posted.
         */
-       i = buf->rb_max_requests + RPCRDMA_MAX_BC_REQUESTS;
+       i = r_xprt->rx_ep.rep_max_requests + RPCRDMA_MAX_BC_REQUESTS;
        buf->rb_sc_ctxs = kcalloc(i, sizeof(sc), GFP_KERNEL);
        if (!buf->rb_sc_ctxs)
                return -ENOMEM;
@@ -1155,7 +1156,6 @@ int rpcrdma_buffer_create(struct rpcrdma_xprt *r_xprt)
        struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
        int i, rc;
 
-       buf->rb_max_requests = r_xprt->rx_ep.rep_max_requests;
        buf->rb_bc_srv_max_requests = 0;
        spin_lock_init(&buf->rb_lock);
        INIT_LIST_HEAD(&buf->rb_mrs);
@@ -1167,7 +1167,7 @@ int rpcrdma_buffer_create(struct rpcrdma_xprt *r_xprt)
        INIT_LIST_HEAD(&buf->rb_all_reps);
 
        rc = -ENOMEM;
-       for (i = 0; i < buf->rb_max_requests; i++) {
+       for (i = 0; i < r_xprt->rx_xprt.max_reqs; i++) {
                struct rpcrdma_req *req;
 
                req = rpcrdma_req_create(r_xprt, RPCRDMA_V1_DEF_INLINE_SIZE * 2,
index 7655a99fd5596a0f5f31857e4d6924e6fae3780b..0fde694144f58e5d4b0760025090dbdd3d87dcb6 100644 (file)
@@ -98,7 +98,7 @@ struct rpcrdma_ep {
        wait_queue_head_t       rep_connect_wait;
        struct rpcrdma_connect_private  rep_cm_private;
        struct rdma_conn_param  rep_remote_cma;
-       unsigned int            rep_max_requests;       /* set by /proc */
+       unsigned int            rep_max_requests;       /* depends on device */
        unsigned int            rep_inline_send;        /* negotiated */
        unsigned int            rep_inline_recv;        /* negotiated */
        int                     rep_receive_count;
@@ -372,7 +372,7 @@ struct rpcrdma_buffer {
 
        struct llist_head       rb_free_reps;
 
-       u32                     rb_max_requests;
+       __be32                  rb_max_requests;
        u32                     rb_credits;     /* most recent credit grant */
 
        u32                     rb_bc_srv_max_requests;
@@ -582,7 +582,6 @@ static inline void rpcrdma_set_xdrlen(struct xdr_buf *xdr, size_t len)
 
 /* RPC/RDMA module init - xprtrdma/transport.c
  */
-extern unsigned int xprt_rdma_slot_table_entries;
 extern unsigned int xprt_rdma_max_inline_read;
 extern unsigned int xprt_rdma_max_inline_write;
 void xprt_rdma_format_addresses(struct rpc_xprt *xprt, struct sockaddr *sap);