]> git.baikalelectronics.ru Git - kernel.git/commitdiff
xprtrdma: DMA map rr_rdma_buf as each rpcrdma_rep is created
authorChuck Lever <chuck.lever@oracle.com>
Fri, 3 Jan 2020 16:57:09 +0000 (11:57 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 15 Jan 2020 15:54:32 +0000 (10:54 -0500)
Clean up: This simplifies the logic in rpcrdma_post_recvs.

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

index ec557e434de09fc3aa4ad2b8b45ade035228abb5..353f61ac8d51961720f5c915310dd07a97e45f20 100644 (file)
@@ -1110,8 +1110,9 @@ static void rpcrdma_reqs_reset(struct rpcrdma_xprt *r_xprt)
 /* No locking needed here. This function is called only by the
  * Receive completion handler.
  */
-static struct rpcrdma_rep *rpcrdma_rep_create(struct rpcrdma_xprt *r_xprt,
-                                             bool temp)
+static noinline
+struct rpcrdma_rep *rpcrdma_rep_create(struct rpcrdma_xprt *r_xprt,
+                                      bool temp)
 {
        struct rpcrdma_rep *rep;
 
@@ -1124,6 +1125,9 @@ static struct rpcrdma_rep *rpcrdma_rep_create(struct rpcrdma_xprt *r_xprt,
        if (!rep->rr_rdmabuf)
                goto out_free;
 
+       if (!rpcrdma_regbuf_dma_map(r_xprt, rep->rr_rdmabuf))
+               goto out_free_regbuf;
+
        xdr_buf_init(&rep->rr_hdrbuf, rdmab_data(rep->rr_rdmabuf),
                     rdmab_length(rep->rr_rdmabuf));
        rep->rr_cqe.done = rpcrdma_wc_receive;
@@ -1136,6 +1140,8 @@ static struct rpcrdma_rep *rpcrdma_rep_create(struct rpcrdma_xprt *r_xprt,
        list_add(&rep->rr_all, &r_xprt->rx_buf.rb_all_reps);
        return rep;
 
+out_free_regbuf:
+       rpcrdma_regbuf_free(rep->rr_rdmabuf);
 out_free:
        kfree(rep);
 out:
@@ -1537,7 +1543,7 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp)
 {
        struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
        struct rpcrdma_ep *ep = &r_xprt->rx_ep;
-       struct ib_recv_wr *i, *wr, *bad_wr;
+       struct ib_recv_wr *wr, *bad_wr;
        struct rpcrdma_rep *rep;
        int needed, count, rc;
 
@@ -1564,23 +1570,15 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp)
                if (!rep)
                        break;
 
+               trace_xprtrdma_post_recv(rep);
                rep->rr_recv_wr.next = wr;
                wr = &rep->rr_recv_wr;
                --needed;
+               ++count;
        }
        if (!wr)
                goto out;
 
-       for (i = wr; i; i = i->next) {
-               rep = container_of(i, struct rpcrdma_rep, rr_recv_wr);
-
-               if (!rpcrdma_regbuf_dma_map(r_xprt, rep->rr_rdmabuf))
-                       goto release_wrs;
-
-               trace_xprtrdma_post_recv(rep);
-               ++count;
-       }
-
        rc = ib_post_recv(r_xprt->rx_ia.ri_id->qp, wr,
                          (const struct ib_recv_wr **)&bad_wr);
 out:
@@ -1597,11 +1595,4 @@ out:
        }
        ep->rep_receive_count += count;
        return;
-
-release_wrs:
-       for (i = wr; i;) {
-               rep = container_of(i, struct rpcrdma_rep, rr_recv_wr);
-               i = i->next;
-               rpcrdma_recv_buffer_put(rep);
-       }
 }