diff options
| -rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_transport.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index 98f945c5a007..c0cd334fe1c6 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c | |||
| @@ -1314,10 +1314,14 @@ void svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp, | |||
| 1314 | length = svc_rdma_xdr_encode_error(xprt, rmsgp, err, va); | 1314 | length = svc_rdma_xdr_encode_error(xprt, rmsgp, err, va); |
| 1315 | 1315 | ||
| 1316 | /* Prepare SGE for local address */ | 1316 | /* Prepare SGE for local address */ |
| 1317 | atomic_inc(&xprt->sc_dma_used); | ||
| 1318 | sge.addr = ib_dma_map_page(xprt->sc_cm_id->device, | 1317 | sge.addr = ib_dma_map_page(xprt->sc_cm_id->device, |
| 1319 | p, 0, PAGE_SIZE, DMA_FROM_DEVICE); | 1318 | p, 0, PAGE_SIZE, DMA_FROM_DEVICE); |
| 1320 | sge.lkey = xprt->sc_phys_mr->lkey; | 1319 | if (ib_dma_mapping_error(xprt->sc_cm_id->device, sge.addr)) { |
| 1320 | put_page(p); | ||
| 1321 | return; | ||
| 1322 | } | ||
| 1323 | atomic_inc(&xprt->sc_dma_used); | ||
| 1324 | sge.lkey = xprt->sc_dma_lkey; | ||
| 1321 | sge.length = length; | 1325 | sge.length = length; |
| 1322 | 1326 | ||
| 1323 | ctxt = svc_rdma_get_context(xprt); | 1327 | ctxt = svc_rdma_get_context(xprt); |
| @@ -1338,6 +1342,9 @@ void svc_rdma_send_error(struct svcxprt_rdma *xprt, struct rpcrdma_msg *rmsgp, | |||
| 1338 | if (ret) { | 1342 | if (ret) { |
| 1339 | dprintk("svcrdma: Error %d posting send for protocol error\n", | 1343 | dprintk("svcrdma: Error %d posting send for protocol error\n", |
| 1340 | ret); | 1344 | ret); |
| 1345 | ib_dma_unmap_page(xprt->sc_cm_id->device, | ||
| 1346 | sge.addr, PAGE_SIZE, | ||
| 1347 | DMA_FROM_DEVICE); | ||
| 1341 | svc_rdma_put_context(ctxt, 1); | 1348 | svc_rdma_put_context(ctxt, 1); |
| 1342 | } | 1349 | } |
| 1343 | } | 1350 | } |
