ACK: [Vivid][PATCH 1/1] nvme: Fix PRP list calculation for non-4k system page size
Chris J Arges
chris.j.arges at canonical.com
Fri Apr 10 17:44:49 UTC 2015
On 04/10/2015 12:28 PM, leann.ogasawara at canonical.com wrote:
> From: Murali Iyer <mniyer at us.ibm.com>
>
> BugLink: http://bugs.launchpad.net/bugs/1442186
>
> PRP list calculation is supposed to be based on device's page size.
> Systems with page size larger than device's page size cause corruption
> to the name space as well as system memory with out this fix.
> Systems like x86 might not experience this issue because it uses
> PAGE_SIZE of 4K where as powerpc uses PAGE_SIZE of 64k while NVMe device's
> page size varies depending upon the vendor.
>
> Signed-off-by: Murali Iyer <mniyer at us.ibm.com>
> Signed-off-by: Brian King <brking at linux.vnet.ibm.com>
> Acked-by: Keith Busch <keith.busch at intel.com>
> Signed-off-by: Jens Axboe <axboe at fb.com>
> (cherry picked from commit f137e0f15101c0a0ff8a5d956042e50247f1fef9 in
> git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next)
> Signed-off-by: Leann Ogasawara <leann.ogasawara at canonical.com>
> ---
> drivers/block/nvme-core.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c
> index d826bf3..3251e93 100644
> --- a/drivers/block/nvme-core.c
> +++ b/drivers/block/nvme-core.c
> @@ -467,12 +467,12 @@ int nvme_setup_prps(struct nvme_dev *dev, struct nvme_iod *iod, int total_len,
> struct scatterlist *sg = iod->sg;
> int dma_len = sg_dma_len(sg);
> u64 dma_addr = sg_dma_address(sg);
> - int offset = offset_in_page(dma_addr);
> + u32 page_size = dev->page_size;
> + int offset = dma_addr & (page_size - 1);
> __le64 *prp_list;
> __le64 **list = iod_list(iod);
> dma_addr_t prp_dma;
> int nprps, i;
> - u32 page_size = dev->page_size;
>
> length -= (page_size - offset);
> if (length <= 0)
>
More information about the kernel-team
mailing list