nvme-pci: Sync queues on reset
authorKeith Busch <keith.busch@intel.com>
Tue, 14 May 2019 20:46:09 +0000 (14:46 -0600)
committerKeith Busch <keith.busch@intel.com>
Fri, 17 May 2019 17:04:34 +0000 (11:04 -0600)
A controller with multiple namespaces may have multiple request_queues with
their own timeout work. If a controller fails with IO outstanding to
diffent namespaces, each request queue may attempt to handle it, so
ensure there is no previously scheduled timeout work executing prior to
starting controller initialization by synchronizing with each queue.

Reviewed-by: Minwoo Im <minwoo.im.dev@gmail.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <keith.busch@intel.com>
drivers/nvme/host/core.c
drivers/nvme/host/nvme.h
drivers/nvme/host/pci.c

index 7da80f3753156d90af62e1eab21b9c351d4efe30..f6879e41738678d27e0d0045866e9bc2247109b9 100644 (file)
@@ -3880,6 +3880,18 @@ void nvme_start_queues(struct nvme_ctrl *ctrl)
 }
 EXPORT_SYMBOL_GPL(nvme_start_queues);
 
+
+void nvme_sync_queues(struct nvme_ctrl *ctrl)
+{
+       struct nvme_ns *ns;
+
+       down_read(&ctrl->namespaces_rwsem);
+       list_for_each_entry(ns, &ctrl->namespaces, list)
+               blk_sync_queue(ns->queue);
+       up_read(&ctrl->namespaces_rwsem);
+}
+EXPORT_SYMBOL_GPL(nvme_sync_queues);
+
 /*
  * Check we didn't inadvertently grow the command structure sizes:
  */
index 5ee75b5ff83f416ca1d0c1e242a7140241a47800..55553d293a98ae5069702dfb7898eb8aa7ed4bc7 100644 (file)
@@ -441,6 +441,7 @@ void nvme_complete_async_event(struct nvme_ctrl *ctrl, __le16 status,
 void nvme_stop_queues(struct nvme_ctrl *ctrl);
 void nvme_start_queues(struct nvme_ctrl *ctrl);
 void nvme_kill_queues(struct nvme_ctrl *ctrl);
+void nvme_sync_queues(struct nvme_ctrl *ctrl);
 void nvme_unfreeze(struct nvme_ctrl *ctrl);
 void nvme_wait_freeze(struct nvme_ctrl *ctrl);
 void nvme_wait_freeze_timeout(struct nvme_ctrl *ctrl, long timeout);
index 8df176ffcbc1420f6e54d7fbdd07173d932f0820..599065ed6a321c54a4ec021814cb497c033a245f 100644 (file)
@@ -2492,6 +2492,7 @@ static void nvme_reset_work(struct work_struct *work)
         */
        if (dev->ctrl.ctrl_config & NVME_CC_ENABLE)
                nvme_dev_disable(dev, false);
+       nvme_sync_queues(&dev->ctrl);
 
        mutex_lock(&dev->shutdown_lock);
        result = nvme_pci_enable(dev);