Skip to content

Commit 13d55d6

Browse files
keithbuschkawasaki
authored andcommitted
nvme-pci: create common sgl unmapping helper
This can be reused by metadata sgls once that starts using the blk-mq dma api. Signed-off-by: Keith Busch <[email protected]>
1 parent 251f108 commit 13d55d6

1 file changed

Lines changed: 20 additions & 11 deletions

File tree

drivers/nvme/host/pci.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -693,25 +693,34 @@ static void nvme_free_prps(struct request *req)
693693
mempool_free(iod->dma_vecs, nvmeq->dev->dmavec_mempool);
694694
}
695695

696+
697+
static void __nvme_free_sgls(struct device *dma_dev, struct nvme_sgl_desc *sge,
698+
struct nvme_sgl_desc *sg_list, enum dma_data_direction dir)
699+
{
700+
unsigned int len = le32_to_cpu(sge->length);
701+
unsigned int i, nr_entries;
702+
703+
if (sge->type == (NVME_SGL_FMT_DATA_DESC << 4)) {
704+
dma_unmap_page(dma_dev, le64_to_cpu(sge->addr), len, dir);
705+
return;
706+
}
707+
708+
nr_entries = len / sizeof(*sg_list);
709+
for (i = 0; i < nr_entries; i++)
710+
dma_unmap_page(dma_dev, le64_to_cpu(sg_list[i].addr),
711+
le32_to_cpu(sg_list[i].length), dir);
712+
}
713+
696714
static void nvme_free_sgls(struct request *req)
697715
{
698716
struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
699717
struct nvme_queue *nvmeq = req->mq_hctx->driver_data;
700718
struct device *dma_dev = nvmeq->dev->dev;
701-
dma_addr_t sqe_dma_addr = le64_to_cpu(iod->cmd.common.dptr.sgl.addr);
702-
unsigned int sqe_dma_len = le32_to_cpu(iod->cmd.common.dptr.sgl.length);
703719
struct nvme_sgl_desc *sg_list = iod->descriptors[0];
720+
struct nvme_sgl_desc *sge = &iod->cmd.common.dptr.sgl;
704721
enum dma_data_direction dir = rq_dma_dir(req);
705722

706-
if (iod->nr_descriptors) {
707-
unsigned int nr_entries = sqe_dma_len / sizeof(*sg_list), i;
708-
709-
for (i = 0; i < nr_entries; i++)
710-
dma_unmap_page(dma_dev, le64_to_cpu(sg_list[i].addr),
711-
le32_to_cpu(sg_list[i].length), dir);
712-
} else {
713-
dma_unmap_page(dma_dev, sqe_dma_addr, sqe_dma_len, dir);
714-
}
723+
__nvme_free_sgls(dma_dev, sge, sg_list, dir);
715724
}
716725

717726
static void nvme_unmap_data(struct request *req)

0 commit comments

Comments
 (0)