[PATCH v6 09/12] nvme-rdma: use ib_dma_map_sgtable_attrs()
Mykola Marzhan <[email protected]> Sun, 26 Jul 2026 13:32:26 +0200
| Newsgroups | org.kernel.vger.linux-raid,org.infradead.lists.linux-nvme,org.kernel.vger.linux-block,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci,org.kernel.vger.linux-rdma,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
ib_dma_map_sg() folds every mapping error into a zero return, losing the DMA layer's error code. Switch both scatterlist mappings to ib_dma_map_sgtable_attrs(), which preserves it for the next patch to act on. No behavior change: failures are still reported as -EIO. A local sg_table is needed: dma_map_sgtable() maps orig_nents entries, and the embedded table's orig_nents is the allocated count, not the count blk_rq_map_sg() produced. rdma_rw_ctx_init() does the same. Assisted-by: Claude:claude-fable-5 Cc: [email protected] # v7.1 Signed-off-by: Mykola Marzhan <[email protected]> Reviewed-by: Logan Gunthorpe <[email protected]> --- drivers/nvme/host/rdma.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c index 6909e3542794..63830334c73e 100644 --- a/drivers/nvme/host/rdma.c +++ b/drivers/nvme/host/rdma.c @@ -1469,6 +1469,7 @@ static int nvme_rdma_dma_map_req(struct ib_device *ibdev, struct request *rq, int *count, int *pi_count) { struct nvme_rdma_request *req = blk_mq_rq_to_pdu(rq); + struct sg_table sgt; int ret; req->data_sgl.sg_table.sgl = (struct scatterlist *)(req + 1); @@ -1480,12 +1481,16 @@ static int nvme_rdma_dma_map_req(struct ib_device *ibdev, struct request *rq, req->data_sgl.nents = blk_rq_map_sg(rq, req->data_sgl.sg_table.sgl); - *count = ib_dma_map_sg(ibdev, req->data_sgl.sg_table.sgl, - req->data_sgl.nents, rq_dma_dir(rq)); - if (unlikely(*count <= 0)) { + sgt = (struct sg_table) { + .sgl = req->data_sgl.sg_table.sgl, + .orig_nents = req->data_sgl.nents, + }; + ret = ib_dma_map_sgtable_attrs(ibdev, &sgt, rq_dma_dir(rq), 0); + if (unlikely(ret)) { ret = -EIO; goto out_free_table; } + *count = sgt.nents; if (blk_integrity_rq(rq)) { req->metadata_sgl->sg_table.sgl = @@ -1501,14 +1506,16 @@ static int nvme_rdma_dma_map_req(struct ib_device *ibdev, struct request *rq, req->metadata_sgl->nents = blk_rq_map_integrity_sg(rq, req->metadata_sgl->sg_table.sgl); - *pi_count = ib_dma_map_sg(ibdev, - req->metadata_sgl->sg_table.sgl, - req->metadata_sgl->nents, - rq_dma_dir(rq)); - if (unlikely(*pi_count <= 0)) { + sgt = (struct sg_table) { + .sgl = req->metadata_sgl->sg_table.sgl, + .orig_nents = req->metadata_sgl->nents, + }; + ret = ib_dma_map_sgtable_attrs(ibdev, &sgt, rq_dma_dir(rq), 0); + if (unlikely(ret)) { ret = -EIO; goto out_free_pi_table; } + *pi_count = sgt.nents; } return 0; -- 2.52.0