nvme: Fix PRP Offset Invalid
authorAaron Williams <awilliams@marvell.com>
Fri, 23 Aug 2019 03:37:26 +0000 (20:37 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 26 Aug 2019 15:46:28 +0000 (11:46 -0400)
commitb21dcebfa6b372cd91bf42a30f1d8a1a525f329b
treeb569c1f257b8ccda9ea47714414147ce7adbfc4d
parent4ebeb4c559f3604169a54f3a318bdabcc6047320
nvme: Fix PRP Offset Invalid

When large writes take place I saw a Samsung EVO 970+ return a status
value of 0x13, PRP Offset Invalid.  I tracked this down to the
improper handling of PRP entries.  The blocks the PRP entries are
placed in cannot cross a page boundary and thus should be allocated
on page boundaries.  This is how the Linux kernel driver works.

With this patch, the PRP pool is allocated on a page boundary and
other than the very first allocation, the pool size is a multiple of
the page size.  Each page can hold (4096 / 8) - 1 entries since the
last entry must point to the next page in the pool.

Signed-off-by: Aaron Williams <awilliams@marvell.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
drivers/nvme/nvme.c