Skip to contentSkip to conversation

nvme: temporary fix for Apple NVMe controller reset

PATCH Superseded Stephan Günther 2 participants 3 messages Nov 20, 2015 – Nov 21, 2015 NVMe

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 nvme: temporary fix for Apple NVMe controller reset

Recent patches added basic support for the Apple NVMe controller but still cause controller resets and data corruption when a specific pattern of read/flush commands occurs on that controller.

This patch prevents that and was tested for a weeek by myself running 4.4-rc1. It is also confirmed to work around that problem by at least one other guy.

Maybe this hotfix can be done in a more elegant way, but something like that should definitely go into 4.4 as the controller will otherwise destroy file systems.

Signed-off-by Stephan G?nther <guenther at tum.de>
Signed-off-by Maurice Leclaure <leclaire at in.tum.de
---
 drivers/nvme/host/pci.c | 8 ++++++++
 1 file changed, 8 insertions(+)
drivers/nvme/host/pci.c +8 -0
index 8187df2..15bbedb 100644
@@ -2701,6 +2701,14 @@ static int nvme_dev_map(struct nvme_dev *dev)
 	dev->q_depth = min_t(int, NVME_CAP_MQES(cap) + 1, NVME_Q_DEPTH);
 	dev->db_stride = 1 << NVME_CAP_STRIDE(cap);
 	dev->dbs = ((void __iomem *)dev->bar) + 4096;
+
+	/*
+	 * Temporary fix for the Apple controller found in the MacBook8,1 and
+	 * some MacBook7,1 to avoid controller resets and data loss.
+	 */
+	if (pdev->vendor == PCI_VENDOR_ID_APPLE && pdev->device == 0x2001)
+		dev->q_depth = 2;
+
 	if (readl(&dev->bar->vs) >= NVME_VS(1, 2))
 		dev->cmb = nvme_map_cmb(dev);
#1 lore raw

PATCH 1/1 nvme: temporary fix for Apple NVMe controller reset

Hi Stephan,

drivers/nvme/host/pci.c static int nvme_dev_map(struct nvme_dev *dev) · line 2710

Quoted 6 lines
drivers/nvme/host/pci.c +6 -0
+	/*
+	 * Temporary fix for the Apple controller found in the MacBook8,1 and
+	 * some MacBook7,1 to avoid controller resets and data loss.
+	 */
+	if (pdev->vendor == PCI_VENDOR_ID_APPLE && pdev->device == 0x2001)
+		dev->q_depth = 2;

Can you add a dev_warn() here? A NVMe device with queue depth is going to perform bady, and we should tell people that we're applying a crude workaround.

Otherwise this looks fine to me to get you guys going, but I really hope we'll find the root cause soon.

#2 lore raw

PATCH 1/1 nvme: temporary fix for Apple NVMe controller reset

Quoted 12 lines · Christoph Hellwig

Hi Stephan,

drivers/nvme/host/pci.c static int nvme_dev_map(struct nvme_dev *dev) · line 2710

Quoted 6 lines
drivers/nvme/host/pci.c +6 -0
+	/*
+	 * Temporary fix for the Apple controller found in the MacBook8,1 and
+	 * some MacBook7,1 to avoid controller resets and data loss.
+	 */
+	if (pdev->vendor == PCI_VENDOR_ID_APPLE && pdev->device == 0x2001)
+		dev->q_depth = 2;

Can you add a dev_warn() here? A NVMe device with queue depth is going to perform bady, and we should tell people that we're applying a crude workaround.

I'll resend the patch with an updated commit message and dev_warn().

Interestingly, I cannot really complain about performance with that patch applied. That little notebook behaves really well. But that queue depth cannot be the solution of course.

Quoted 3 lines

Otherwise this looks fine to me to get you guys going, but I really hope we'll find the root cause soon.

I wish Apple would show any interest in that matter...