hc
2024-02-19 1c055e55a242a33e574e48be530e06770a210dcd
kernel/net/9p/trans_rdma.c
....@@ -386,6 +386,7 @@
386386 struct p9_trans_rdma *rdma = client->trans;
387387 struct ib_recv_wr wr;
388388 struct ib_sge sge;
389
+ int ret;
389390
390391 c->busa = ib_dma_map_single(rdma->cm_id->device,
391392 c->rc.sdata, client->msize,
....@@ -403,7 +404,12 @@
403404 wr.wr_cqe = &c->cqe;
404405 wr.sg_list = &sge;
405406 wr.num_sge = 1;
406
- return ib_post_recv(rdma->qp, &wr, NULL);
407
+
408
+ ret = ib_post_recv(rdma->qp, &wr, NULL);
409
+ if (ret)
410
+ ib_dma_unmap_single(rdma->cm_id->device, c->busa,
411
+ client->msize, DMA_FROM_DEVICE);
412
+ return ret;
407413
408414 error:
409415 p9_debug(P9_DEBUG_ERROR, "EIO\n");
....@@ -500,7 +506,7 @@
500506
501507 if (down_interruptible(&rdma->sq_sem)) {
502508 err = -EINTR;
503
- goto send_error;
509
+ goto dma_unmap;
504510 }
505511
506512 /* Mark request as `sent' *before* we actually send it,
....@@ -510,11 +516,14 @@
510516 req->status = REQ_STATUS_SENT;
511517 err = ib_post_send(rdma->qp, &wr, NULL);
512518 if (err)
513
- goto send_error;
519
+ goto dma_unmap;
514520
515521 /* Success */
516522 return 0;
517523
524
+dma_unmap:
525
+ ib_dma_unmap_single(rdma->cm_id->device, c->busa,
526
+ c->req->tc.size, DMA_TO_DEVICE);
518527 /* Handle errors that happened during or while preparing the send: */
519528 send_error:
520529 req->status = REQ_STATUS_ERROR;