nvme: adjust multiples of NVME_CTRL_PAGE_SIZE in offset
authorKundan Kumar <kundan.kumar@samsung.com>
Thu, 23 May 2024 11:31:49 +0000 (17:01 +0530)
committerKeith Busch <kbusch@kernel.org>
Fri, 24 May 2024 15:59:16 +0000 (08:59 -0700)
bio_vec start offset may be relatively large particularly when large
folio gets added to the bio. A bigger offset will result in avoiding the
single-segment mapping optimization and end up using expensive
mempool_alloc further.

Rather than using absolute value, adjust bv_offset by
NVME_CTRL_PAGE_SIZE while checking if segment can be fitted into one/two
PRP entries.

Suggested-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Kundan Kumar <kundan.kumar@samsung.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/pci.c

index 7100430..102a9fb 100644 (file)
@@ -778,7 +778,8 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
                struct bio_vec bv = req_bvec(req);
 
                if (!is_pci_p2pdma_page(bv.bv_page)) {
-                       if (bv.bv_offset + bv.bv_len <= NVME_CTRL_PAGE_SIZE * 2)
+                       if ((bv.bv_offset & (NVME_CTRL_PAGE_SIZE - 1)) +
+                            bv.bv_len <= NVME_CTRL_PAGE_SIZE * 2)
                                return nvme_setup_prp_simple(dev, req,
                                                             &cmnd->rw, &bv);