diff options
Diffstat (limited to 'net/sunrpc/xprtrdma')
-rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_transport.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index c3e8db0eeb3b..d9183cbcd967 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c | |||
@@ -483,7 +483,7 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt) | |||
483 | struct ib_recv_wr recv_wr, *bad_recv_wr; | 483 | struct ib_recv_wr recv_wr, *bad_recv_wr; |
484 | struct svc_rdma_op_ctxt *ctxt; | 484 | struct svc_rdma_op_ctxt *ctxt; |
485 | struct page *page; | 485 | struct page *page; |
486 | unsigned long pa; | 486 | dma_addr_t pa; |
487 | int sge_no; | 487 | int sge_no; |
488 | int buflen; | 488 | int buflen; |
489 | int ret; | 489 | int ret; |
@@ -495,13 +495,15 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt) | |||
495 | BUG_ON(sge_no >= xprt->sc_max_sge); | 495 | BUG_ON(sge_no >= xprt->sc_max_sge); |
496 | page = svc_rdma_get_page(); | 496 | page = svc_rdma_get_page(); |
497 | ctxt->pages[sge_no] = page; | 497 | ctxt->pages[sge_no] = page; |
498 | atomic_inc(&xprt->sc_dma_used); | ||
499 | pa = ib_dma_map_page(xprt->sc_cm_id->device, | 498 | pa = ib_dma_map_page(xprt->sc_cm_id->device, |
500 | page, 0, PAGE_SIZE, | 499 | page, 0, PAGE_SIZE, |
501 | DMA_FROM_DEVICE); | 500 | DMA_FROM_DEVICE); |
501 | if (ib_dma_mapping_error(xprt->sc_cm_id->device, pa)) | ||
502 | goto err_put_ctxt; | ||
503 | atomic_inc(&xprt->sc_dma_used); | ||
502 | ctxt->sge[sge_no].addr = pa; | 504 | ctxt->sge[sge_no].addr = pa; |
503 | ctxt->sge[sge_no].length = PAGE_SIZE; | 505 | ctxt->sge[sge_no].length = PAGE_SIZE; |
504 | ctxt->sge[sge_no].lkey = xprt->sc_phys_mr->lkey; | 506 | ctxt->sge[sge_no].lkey = xprt->sc_dma_lkey; |
505 | buflen += PAGE_SIZE; | 507 | buflen += PAGE_SIZE; |
506 | } | 508 | } |
507 | ctxt->count = sge_no; | 509 | ctxt->count = sge_no; |
@@ -517,6 +519,10 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt) | |||
517 | svc_rdma_put_context(ctxt, 1); | 519 | svc_rdma_put_context(ctxt, 1); |
518 | } | 520 | } |
519 | return ret; | 521 | return ret; |
522 | |||
523 | err_put_ctxt: | ||
524 | svc_rdma_put_context(ctxt, 1); | ||
525 | return -ENOMEM; | ||
520 | } | 526 | } |
521 | 527 | ||
522 | /* | 528 | /* |