diff options
| -rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 17 | ||||
| -rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_sendto.c | 10 | ||||
| -rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_transport.c | 19 |
3 files changed, 11 insertions, 35 deletions
diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c index c22d6b6f2db4..f3a108a864ad 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | |||
| @@ -457,8 +457,6 @@ static int rdma_read_complete(struct svc_rqst *rqstp, | |||
| 457 | ret, rqstp->rq_arg.len, rqstp->rq_arg.head[0].iov_base, | 457 | ret, rqstp->rq_arg.len, rqstp->rq_arg.head[0].iov_base, |
| 458 | rqstp->rq_arg.head[0].iov_len); | 458 | rqstp->rq_arg.head[0].iov_len); |
| 459 | 459 | ||
| 460 | /* Indicate that we've consumed an RQ credit */ | ||
| 461 | rqstp->rq_xprt_ctxt = rqstp->rq_xprt; | ||
| 462 | svc_xprt_received(rqstp->rq_xprt); | 460 | svc_xprt_received(rqstp->rq_xprt); |
| 463 | return ret; | 461 | return ret; |
| 464 | } | 462 | } |
| @@ -480,13 +478,6 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) | |||
| 480 | 478 | ||
| 481 | dprintk("svcrdma: rqstp=%p\n", rqstp); | 479 | dprintk("svcrdma: rqstp=%p\n", rqstp); |
| 482 | 480 | ||
| 483 | /* | ||
| 484 | * The rq_xprt_ctxt indicates if we've consumed an RQ credit | ||
| 485 | * or not. It is used in the rdma xpo_release_rqst function to | ||
| 486 | * determine whether or not to return an RQ WQE to the RQ. | ||
| 487 | */ | ||
| 488 | rqstp->rq_xprt_ctxt = NULL; | ||
| 489 | |||
| 490 | spin_lock_bh(&rdma_xprt->sc_read_complete_lock); | 481 | spin_lock_bh(&rdma_xprt->sc_read_complete_lock); |
| 491 | if (!list_empty(&rdma_xprt->sc_read_complete_q)) { | 482 | if (!list_empty(&rdma_xprt->sc_read_complete_q)) { |
| 492 | ctxt = list_entry(rdma_xprt->sc_read_complete_q.next, | 483 | ctxt = list_entry(rdma_xprt->sc_read_complete_q.next, |
| @@ -550,9 +541,6 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) | |||
| 550 | return 0; | 541 | return 0; |
| 551 | } | 542 | } |
| 552 | 543 | ||
| 553 | /* Indicate we've consumed an RQ credit */ | ||
| 554 | rqstp->rq_xprt_ctxt = rqstp->rq_xprt; | ||
| 555 | |||
| 556 | ret = rqstp->rq_arg.head[0].iov_len | 544 | ret = rqstp->rq_arg.head[0].iov_len |
| 557 | + rqstp->rq_arg.page_len | 545 | + rqstp->rq_arg.page_len |
| 558 | + rqstp->rq_arg.tail[0].iov_len; | 546 | + rqstp->rq_arg.tail[0].iov_len; |
| @@ -569,11 +557,8 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) | |||
| 569 | return ret; | 557 | return ret; |
| 570 | 558 | ||
| 571 | close_out: | 559 | close_out: |
| 572 | if (ctxt) { | 560 | if (ctxt) |
| 573 | svc_rdma_put_context(ctxt, 1); | 561 | svc_rdma_put_context(ctxt, 1); |
| 574 | /* Indicate we've consumed an RQ credit */ | ||
| 575 | rqstp->rq_xprt_ctxt = rqstp->rq_xprt; | ||
| 576 | } | ||
| 577 | dprintk("svcrdma: transport %p is closing\n", xprt); | 562 | dprintk("svcrdma: transport %p is closing\n", xprt); |
| 578 | /* | 563 | /* |
| 579 | * Set the close bit and enqueue it. svc_recv will see the | 564 | * Set the close bit and enqueue it. svc_recv will see the |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c index 981f190c1b39..f61d7bd105fb 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c +++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c | |||
| @@ -389,6 +389,16 @@ static int send_reply(struct svcxprt_rdma *rdma, | |||
| 389 | int page_no; | 389 | int page_no; |
| 390 | int ret; | 390 | int ret; |
| 391 | 391 | ||
| 392 | /* Post a recv buffer to handle another request. */ | ||
| 393 | ret = svc_rdma_post_recv(rdma); | ||
| 394 | if (ret) { | ||
| 395 | printk(KERN_INFO | ||
| 396 | "svcrdma: could not post a receive buffer, err=%d." | ||
| 397 | "Closing transport %p.\n", ret, rdma); | ||
| 398 | set_bit(XPT_CLOSE, &rdma->sc_xprt.xpt_flags); | ||
| 399 | return 0; | ||
| 400 | } | ||
| 401 | |||
| 392 | /* Prepare the context */ | 402 | /* Prepare the context */ |
| 393 | ctxt->pages[0] = page; | 403 | ctxt->pages[0] = page; |
| 394 | ctxt->count = 1; | 404 | ctxt->count = 1; |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index af408fc12634..1e0af2f205e9 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c | |||
| @@ -910,27 +910,8 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) | |||
| 910 | return NULL; | 910 | return NULL; |
| 911 | } | 911 | } |
| 912 | 912 | ||
| 913 | /* | ||
| 914 | * Post an RQ WQE to the RQ when the rqst is being released. This | ||
| 915 | * effectively returns an RQ credit to the client. The rq_xprt_ctxt | ||
| 916 | * will be null if the request is deferred due to an RDMA_READ or the | ||
| 917 | * transport had no data ready (EAGAIN). Note that an RPC deferred in | ||
| 918 | * svc_process will still return the credit, this is because the data | ||
| 919 | * is copied and no longer consume a WQE/WC. | ||
| 920 | */ | ||
| 921 | static void svc_rdma_release_rqst(struct svc_rqst *rqstp) | 913 | static void svc_rdma_release_rqst(struct svc_rqst *rqstp) |
| 922 | { | 914 | { |
| 923 | int err; | ||
| 924 | struct svcxprt_rdma *rdma = | ||
| 925 | container_of(rqstp->rq_xprt, struct svcxprt_rdma, sc_xprt); | ||
| 926 | if (rqstp->rq_xprt_ctxt) { | ||
| 927 | BUG_ON(rqstp->rq_xprt_ctxt != rdma); | ||
| 928 | err = svc_rdma_post_recv(rdma); | ||
| 929 | if (err) | ||
| 930 | dprintk("svcrdma: failed to post an RQ WQE error=%d\n", | ||
| 931 | err); | ||
| 932 | } | ||
| 933 | rqstp->rq_xprt_ctxt = NULL; | ||
| 934 | } | 915 | } |
| 935 | 916 | ||
| 936 | /* | 917 | /* |
