Message ID | 20230104020424.611926-1-shaozhengchao@huawei.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [v2] 9p/rdma: unmap receive dma buffer in rdma_request()/post_recv() | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply |
On Wed, Jan 04, 2023 at 10:04:24AM +0800, Zhengchao Shao wrote: > When down_interruptible() or ib_post_send() failed in rdma_request(), > receive dma buffer is not unmapped. Add unmap action to error path. > Also if ib_post_recv() failed in post_recv(), dma buffer is not unmapped. > Add unmap action to error path. > > Fixes: fc79d4b104f0 ("9p: rdma: RDMA Transport Support for 9P") > Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com> > --- > v2: add unmap action if ib_post_send() or ib_post_recv() failed > --- > net/9p/trans_rdma.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > Thanks, Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Leon Romanovsky wrote on Wed, Jan 04, 2023 at 09:39:07AM +0200: > On Wed, Jan 04, 2023 at 10:04:24AM +0800, Zhengchao Shao wrote: > > When down_interruptible() or ib_post_send() failed in rdma_request(), > > receive dma buffer is not unmapped. Add unmap action to error path. > > Also if ib_post_recv() failed in post_recv(), dma buffer is not unmapped. > > Add unmap action to error path. > > > > Fixes: fc79d4b104f0 ("9p: rdma: RDMA Transport Support for 9P") > > Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com> > Reviewed-by: Leon Romanovsky <leonro@nvidia.com> Sorry for the delay -- I have no way of testing it but it looks sane, I'll submit it when 6.3 opens up in a week or two. Thanks for the patch & Leon for the review.
diff --git a/net/9p/trans_rdma.c b/net/9p/trans_rdma.c index 83f9100d46bf..b84748baf9cb 100644 --- a/net/9p/trans_rdma.c +++ b/net/9p/trans_rdma.c @@ -385,6 +385,7 @@ post_recv(struct p9_client *client, struct p9_rdma_context *c) struct p9_trans_rdma *rdma = client->trans; struct ib_recv_wr wr; struct ib_sge sge; + int ret; c->busa = ib_dma_map_single(rdma->cm_id->device, c->rc.sdata, client->msize, @@ -402,7 +403,12 @@ post_recv(struct p9_client *client, struct p9_rdma_context *c) wr.wr_cqe = &c->cqe; wr.sg_list = &sge; wr.num_sge = 1; - return ib_post_recv(rdma->qp, &wr, NULL); + + ret = ib_post_recv(rdma->qp, &wr, NULL); + if (ret) + ib_dma_unmap_single(rdma->cm_id->device, c->busa, + client->msize, DMA_FROM_DEVICE); + return ret; error: p9_debug(P9_DEBUG_ERROR, "EIO\n"); @@ -499,7 +505,7 @@ static int rdma_request(struct p9_client *client, struct p9_req_t *req) if (down_interruptible(&rdma->sq_sem)) { err = -EINTR; - goto send_error; + goto dma_unmap; } /* Mark request as `sent' *before* we actually send it, @@ -509,11 +515,14 @@ static int rdma_request(struct p9_client *client, struct p9_req_t *req) WRITE_ONCE(req->status, REQ_STATUS_SENT); err = ib_post_send(rdma->qp, &wr, NULL); if (err) - goto send_error; + goto dma_unmap; /* Success */ return 0; +dma_unmap: + ib_dma_unmap_single(rdma->cm_id->device, c->busa, + c->req->tc.size, DMA_TO_DEVICE); /* Handle errors that happened during or while preparing the send: */ send_error: WRITE_ONCE(req->status, REQ_STATUS_ERROR);
When down_interruptible() or ib_post_send() failed in rdma_request(), receive dma buffer is not unmapped. Add unmap action to error path. Also if ib_post_recv() failed in post_recv(), dma buffer is not unmapped. Add unmap action to error path. Fixes: fc79d4b104f0 ("9p: rdma: RDMA Transport Support for 9P") Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com> --- v2: add unmap action if ib_post_send() or ib_post_recv() failed --- net/9p/trans_rdma.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)