linux/drivers/nvme/host
Robert Beckett 347654387b nvme-pci: 512 byte aligned dma pool segment quirk
[ Upstream commit ebefac5647 ]

We initially introduced a quick fix limiting the queue depth to 1 as
experimentation showed that it fixed data corruption on 64GB steamdecks.

Further experimentation revealed corruption only happens when the last
PRP data element aligns to the end of the page boundary. The device
appears to treat this as a PRP chain to a new list instead of the data
element that it actually is. This implementation is in violation of the
spec. Encountering this errata with the Linux driver requires the host
request a 128k transfer and coincidently be handed the last small pool
dma buffer within a page.

The QD1 quirk effectly works around this because the last data PRP
always was at a 248 byte offset from the page start, so it never
appeared at the end of the page, but comes at the expense of throttling
IO and wasting the remainder of the PRP page beyond 256 bytes. Also to
note, the MDTS on these devices is small enough that the "large" prp
pool can hold enough PRP elements to never reach the end, so that pool
is not a problem either.

Introduce a new quirk to ensure the small pool is always aligned such
that the last PRP element can't appear a the end of the page. This comes
at the expense of wasting 256 bytes per small pool page allocated.

Link: https://lore.kernel.org/linux-nvme/20241113043151.GA20077@lst.de/T/#u
Fixes: 83bdfcbdbe ("nvme-pci: qdepth 1 quirk")
Cc: Paweł Anikiel <panikiel@google.com>
Signed-off-by: Robert Beckett <bob.beckett@collabora.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2025-01-09 13:31:56 +01:00
..
apple.c nvme: apple: fix device reference counting 2024-12-09 10:31:42 +01:00
auth.c nvme-auth: set explanation code for failure2 msgs 2023-12-20 17:01:57 +01:00
constants.c nvme fixes for Linux 6.5 2023-06-30 14:04:08 -06:00
core.c Revert "nvme: make keep-alive synchronous operation" 2025-01-09 13:31:47 +01:00
fabrics.c nvme: blank out authentication fabrics options if not configured 2023-12-03 07:33:06 +01:00
fabrics.h nvme: fix reconnection fail due to reserved tag allocation 2024-03-26 18:20:09 -04:00
fault_inject.c nvme: fix parameter check in nvme_fault_inject_init() 2023-07-12 08:48:33 -07:00
fc.c nvme-fc: do not wait in vain when unloading module 2024-03-01 13:34:52 +01:00
fc.h nvme-fc: Update header and host for common definitions for LS handling 2020-05-09 16:18:33 -06:00
hwmon.c nvme: host: hwmon: constify pointers to hwmon_channel_info 2023-08-21 12:54:02 -07:00
ioctl.c nvme: fix metadata handling in nvme-passthrough 2024-12-09 10:32:39 +01:00
Kconfig nvme-auth: Diffie-Hellman key exchange support 2022-08-02 17:14:49 -06:00
Makefile SCSI misc on 20230629 2023-06-30 11:57:07 -07:00
multipath.c nvme/multipath: Fix RCU list traversal to use SRCU primitive 2024-12-09 10:32:56 +01:00
nvme.h nvme-pci: 512 byte aligned dma pool segment quirk 2025-01-09 13:31:56 +01:00
pci.c nvme-pci: 512 byte aligned dma pool segment quirk 2025-01-09 13:31:56 +01:00
pr.c nvme: fix nvme_pr_* status code parsing 2024-06-21 14:38:29 +02:00
rdma.c nvme: ensure reset state check ordering 2024-01-20 11:51:41 +01:00
sysfs.c nvme: warn only once for legacy uuid attribute 2023-07-12 08:48:19 -07:00
tcp.c nvme: tcp: avoid race between queue_lock lock and destroy 2024-11-17 15:08:56 +01:00
trace.c nvme: implement In-Band authentication 2022-08-02 17:14:49 -06:00
trace.h nvme: fix async event trace event 2023-04-13 08:59:04 +02:00
zns.c scsi: nvme: zns: Set zone limits before revalidating zones 2023-07-05 21:58:10 -04:00