nvme-pci: split out a nvme_pci_ctrl_is_dead helper
authorChristoph Hellwig <hch@lst.de>
Wed, 16 Nov 2022 08:09:48 +0000 (09:09 +0100)
committerChristoph Hellwig <hch@lst.de>
Tue, 6 Dec 2022 13:38:19 +0000 (14:38 +0100)
Clean up nvme_dev_disable by splitting the logic to detect if a
controller is dead into a separate helper.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
drivers/nvme/host/pci.c

index 02940b4..d613b42 100644 (file)
@@ -2654,36 +2654,39 @@ static void nvme_dev_unmap(struct nvme_dev *dev)
        pci_release_mem_regions(to_pci_dev(dev->dev));
 }
 
-static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown)
+static bool nvme_pci_ctrl_is_dead(struct nvme_dev *dev)
 {
-       bool dead = true, freeze = false;
        struct pci_dev *pdev = to_pci_dev(dev->dev);
+       u32 csts;
 
-       mutex_lock(&dev->shutdown_lock);
-       if (pci_is_enabled(pdev)) {
-               u32 csts;
+       if (!pci_is_enabled(pdev) || !pci_device_is_present(pdev))
+               return true;
+       if (pdev->error_state != pci_channel_io_normal)
+               return true;
 
-               if (pci_device_is_present(pdev))
-                       csts = readl(dev->bar + NVME_REG_CSTS);
-               else
-                       csts = ~0;
+       csts = readl(dev->bar + NVME_REG_CSTS);
+       return (csts & NVME_CSTS_CFS) || !(csts & NVME_CSTS_RDY);
+}
+
+static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown)
+{
+       struct pci_dev *pdev = to_pci_dev(dev->dev);
+       bool dead;
 
-               if (dev->ctrl.state == NVME_CTRL_LIVE ||
-                   dev->ctrl.state == NVME_CTRL_RESETTING) {
-                       freeze = true;
+       mutex_lock(&dev->shutdown_lock);
+       dead = nvme_pci_ctrl_is_dead(dev);
+       if (dev->ctrl.state == NVME_CTRL_LIVE ||
+           dev->ctrl.state == NVME_CTRL_RESETTING) {
+               if (pci_is_enabled(pdev))
                        nvme_start_freeze(&dev->ctrl);
-               }
-               dead = !!((csts & NVME_CSTS_CFS) || !(csts & NVME_CSTS_RDY) ||
-                       pdev->error_state  != pci_channel_io_normal);
+               /*
+                * Give the controller a chance to complete all entered requests
+                * if doing a safe shutdown.
+                */
+               if (!dead && shutdown)
+                       nvme_wait_freeze_timeout(&dev->ctrl, NVME_IO_TIMEOUT);
        }
 
-       /*
-        * Give the controller a chance to complete all entered requests if
-        * doing a safe shutdown.
-        */
-       if (!dead && shutdown && freeze)
-               nvme_wait_freeze_timeout(&dev->ctrl, NVME_IO_TIMEOUT);
-
        nvme_quiesce_io_queues(&dev->ctrl);
 
        if (!dead && dev->ctrl.queue_count > 0) {