Skip to contentSkip to conversation

nvme-pci: Fix AER reset handling

PATCH New Keith Busch 2 participants 2 messages May 24, 2018 – May 25, 2018 NVMe

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 nvme-pci: Fix AER reset handling

The nvme timeout handling doesn't do anything if the pci channel is offline, which is the case when recovering from PCI error event, so it was a bad idea to sync the controller reset in this state. This patch flushes the reset work in the error_resume callback instead when the channel is back to online. This keeps AER handling serialized and can recover from timeouts.

Fixes cc1d5e749a2e ("nvme/pci: Sync controller reset for AER slot_reset")
Reported-by Alex Gagniuc <mr.nuke.me at gmail.com>
Tested-by Alex Gagniuc <mr.nuke.me at gmail.com>
Signed-off-by Keith Busch <keith.busch at intel.com>
---
 drivers/nvme/host/pci.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)
drivers/nvme/host/pci.c +5 -9
index 62684dda40a8..4f63309e0fe8 100644
@@ -2750,19 +2750,15 @@ static pci_ers_result_t nvme_slot_reset(struct pci_dev *pdev)
 
 	dev_info(dev->ctrl.device, "restart after slot reset\n");
 	pci_restore_state(pdev);
-	nvme_reset_ctrl_sync(&dev->ctrl);
-
-	switch (dev->ctrl.state) {
-	case NVME_CTRL_LIVE:
-	case NVME_CTRL_ADMIN_ONLY:
-		return PCI_ERS_RESULT_RECOVERED;
-	default:
-		return PCI_ERS_RESULT_DISCONNECT;
-	}
+	nvme_reset_ctrl(&dev->ctrl);
+	return PCI_ERS_RESULT_RECOVERED;
 }
 
 static void nvme_error_resume(struct pci_dev *pdev)
 {
+	struct nvme_dev *dev = pci_get_drvdata(pdev);
+	
+	flush_work(&dev->ctrl.reset_work);
 	pci_cleanup_aer_uncorrect_error_status(pdev);
 }
 
Signature · 1 line
2.14.3
maintainer Applied
#1 lore raw

PATCH 1/1 nvme-pci: Fix AER reset handling

Thanks,

applied to nvme-4.18.