Skip to content

Commit 783b94b

Browse files
author
Christoph Hellwig
committed
nvme-pci: do not build a scatterlist to map metadata
We always have exactly one segment, so we can simply call dma_map_bvec. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Keith Busch <[email protected]> Reviewed-by: Sagi Grimberg <[email protected]> Reviewed-by: Chaitanya Kulkarni <[email protected]>
1 parent b15c592 commit 783b94b

File tree

1 file changed

+10
-13
lines changed

1 file changed

+10
-13
lines changed

drivers/nvme/host/pci.c

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ struct nvme_iod {
221221
int npages; /* In the PRP list. 0 means small pool in use */
222222
int nents; /* Used in scatterlist */
223223
dma_addr_t first_dma;
224-
struct scatterlist meta_sg; /* metadata requires single contiguous buffer */
224+
dma_addr_t meta_dma;
225225
struct scatterlist *sg;
226226
struct scatterlist inline_sg[0];
227227
};
@@ -592,13 +592,16 @@ static void nvme_unmap_data(struct nvme_dev *dev, struct request *req)
592592
dma_addr_t dma_addr = iod->first_dma, next_dma_addr;
593593
int i;
594594

595+
if (blk_integrity_rq(req)) {
596+
dma_unmap_page(dev->dev, iod->meta_dma,
597+
rq_integrity_vec(req)->bv_len, dma_dir);
598+
}
599+
595600
if (iod->nents) {
596601
/* P2PDMA requests do not need to be unmapped */
597602
if (!is_pci_p2pdma_page(sg_page(iod->sg)))
598603
dma_unmap_sg(dev->dev, iod->sg, iod->nents, dma_dir);
599604

600-
if (blk_integrity_rq(req))
601-
dma_unmap_sg(dev->dev, &iod->meta_sg, 1, dma_dir);
602605
}
603606

604607
if (iod->npages == 0)
@@ -861,17 +864,11 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
861864

862865
ret = BLK_STS_IOERR;
863866
if (blk_integrity_rq(req)) {
864-
if (blk_rq_count_integrity_sg(q, req->bio) != 1)
865-
goto out;
866-
867-
sg_init_table(&iod->meta_sg, 1);
868-
if (blk_rq_map_integrity_sg(q, req->bio, &iod->meta_sg) != 1)
869-
goto out;
870-
871-
if (!dma_map_sg(dev->dev, &iod->meta_sg, 1, dma_dir))
867+
iod->meta_dma = dma_map_bvec(dev->dev, rq_integrity_vec(req),
868+
dma_dir, 0);
869+
if (dma_mapping_error(dev->dev, iod->meta_dma))
872870
goto out;
873-
874-
cmnd->rw.metadata = cpu_to_le64(sg_dma_address(&iod->meta_sg));
871+
cmnd->rw.metadata = cpu_to_le64(iod->meta_dma);
875872
}
876873

877874
return BLK_STS_OK;

0 commit comments

Comments
 (0)