[PATCH Xenial SRU] UBUNTU: SAUCE: nvme: Don't suspend admin queue that wasn't created

Tim Gardner tim.gardner at canonical.com
Tue Sep 13 13:39:06 UTC 2016


From: Gabriel Krisman Bertazi <krisman at linux.vnet.ibm.com>

Pending 4.8-rc merge.
BugLink: http://bugs.launchpad.net/bugs/1602724

This fixes a regression in my previous commit c21377f8366c ("nvme:
Suspend all queues before deletion"), which provoked an Oops in the
removal path when removing a device that became IO incapable very early
at probe (i.e. after a failed EEH recovery).

Turns out, if the error occurred very early at the probe path, before
even configuring the admin queue, we might try to suspend the
uninitialized admin queue, accessing bad memory.

Fixes: c21377f8366c ("nvme: Suspend all queues before deletion")
Signed-off-by: Gabriel Krisman Bertazi <krisman at linux.vnet.ibm.com>
Reviewed-by: Jay Freyensee <james_p_freyensee at linux.intel.com>
Signed-off-by: Jens Axboe <axboe at fb.com>
Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
---
 drivers/nvme/host/pci.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index d7a3c93..122725f 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -1834,7 +1834,12 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown)
 		nvme_suspend_queue(dev->queues[i]);
 
 	if (csts & NVME_CSTS_CFS || !(csts & NVME_CSTS_RDY)) {
-		nvme_suspend_queue(dev->queues[0]);
+		/* A device might become IO incapable very soon during
+		 * probe, before the admin queue is configured. Thus,
+		 * queue_count can be 0 here.
+		 */
+		if (dev->queue_count)
+			nvme_suspend_queue(dev->queues[0]);
 	} else {
 		nvme_disable_io_queues(dev);
 		nvme_disable_admin_queue(dev, shutdown);
-- 
2.7.4





More information about the kernel-team mailing list