nvme: update node paths after adding new path
authorKeith Busch <keith.busch@intel.com>
Fri, 5 Oct 2018 15:49:37 +0000 (09:49 -0600)
committerChristoph Hellwig <hch@lst.de>
Wed, 17 Oct 2018 06:58:22 +0000 (08:58 +0200)
The nvme namespace paths were being updated only when the current path
was not set or nonoptimized. If a new path comes online that is a better
path for its NUMA node, the multipath selector may continue using the
previously set path on a potentially further node.

This patch re-runs the path assignment after successfully adding a new
optimized path.

Signed-off-by: Keith Busch <keith.busch@intel.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/multipath.c

index 52987052b7fc0f17fee9587a01d5dea3e5f41467..5e3cc8c59a394fce6ba25f1c621b26903185963d 100644 (file)
@@ -321,6 +321,15 @@ static void nvme_mpath_set_live(struct nvme_ns *ns)
                device_add_disk(&head->subsys->dev, head->disk,
                                nvme_ns_id_attr_groups);
 
+       if (nvme_path_is_optimized(ns)) {
+               int node, srcu_idx;
+
+               srcu_idx = srcu_read_lock(&head->srcu);
+               for_each_node(node)
+                       __nvme_find_path(head, node);
+               srcu_read_unlock(&head->srcu, srcu_idx);
+       }
+
        kblockd_schedule_work(&ns->head->requeue_work);
 }