diff options
author | Kevin Hao <haokexin@gmail.com> | 2019-10-18 10:53:14 +0800 |
---|---|---|
committer | Keith Busch <kbusch@kernel.org> | 2019-10-18 23:09:41 +0900 |
commit | a4f40484e7f1dff56bb9f286cc59ffa36e0259eb (patch) | |
tree | 5acd12c4cc9d9ce326cc62bf9d75afe8ac0d0719 /drivers/nvme/host/pci.c | |
parent | 28a4cac48c7e897a0b4e7d79a53a8e4fe40337ae (diff) | |
download | lwn-a4f40484e7f1dff56bb9f286cc59ffa36e0259eb.tar.gz lwn-a4f40484e7f1dff56bb9f286cc59ffa36e0259eb.zip |
nvme-pci: Set the prp2 correctly when using more than 4k page
In the current code, the nvme is using a fixed 4k PRP entry size,
but if the kernel use a page size which is more than 4k, we should
consider the situation that the bv_offset may be larger than the
dev->ctrl.page_size. Otherwise we may miss setting the prp2 and then
cause the command can't be executed correctly.
Fixes: dff824b2aadb ("nvme-pci: optimize mapping of small single segment requests")
Cc: stable@vger.kernel.org
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Kevin Hao <haokexin@gmail.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Diffstat (limited to 'drivers/nvme/host/pci.c')
-rw-r--r-- | drivers/nvme/host/pci.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 4b181969c432..869f462e6b6e 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -773,7 +773,8 @@ static blk_status_t nvme_setup_prp_simple(struct nvme_dev *dev, struct bio_vec *bv) { struct nvme_iod *iod = blk_mq_rq_to_pdu(req); - unsigned int first_prp_len = dev->ctrl.page_size - bv->bv_offset; + unsigned int offset = bv->bv_offset & (dev->ctrl.page_size - 1); + unsigned int first_prp_len = dev->ctrl.page_size - offset; iod->first_dma = dma_map_bvec(dev->dev, bv, rq_dma_dir(req), 0); if (dma_mapping_error(dev->dev, iod->first_dma)) |