diff options
Diffstat (limited to 'net')
-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 | /* |