From: Alexander Duyck <alexander.duyck@gmail.com>
To: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
linux-nvdimm@lists.01.org
Cc: pavel.tatashin@microsoft.com, mhocko@suse.com,
dave.hansen@intel.com, jglisse@redhat.com,
akpm@linux-foundation.org, mingo@kernel.org,
kirill.shutemov@linux.intel.com
Subject: [PATCH 4/4] nvdimm: Trigger the device probe on a cpu local to the device
Date: Mon, 10 Sep 2018 16:44:00 -0700 [thread overview]
Message-ID: <20180910234400.4068.15541.stgit@localhost.localdomain> (raw)
In-Reply-To: <20180910232615.4068.29155.stgit@localhost.localdomain>
From: Alexander Duyck <alexander.h.duyck@intel.com>
This patch is based off of the pci_call_probe function used to initialize
PCI devices. The general idea here is to move the probe call to a location
that is local to the memory being initialized. By doing this we can shave
significant time off of the total time needed for initialization.
With this patch applied I see a significant reduction in overall init time
as without it the init varied between 23 and 37 seconds to initialize a 3GB
node. With this patch applied the variance is only between 23 and 26
seconds to initialize each node.
I hope to refine this further in the future by combining this logic into
the async_schedule_domain code that is already in use. By doing that it
would likely make this functionality redundant.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
---
drivers/nvdimm/bus.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)
diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
index 8aae6dcc839f..5b73953176b1 100644
--- a/drivers/nvdimm/bus.c
+++ b/drivers/nvdimm/bus.c
@@ -27,6 +27,7 @@
#include <linux/io.h>
#include <linux/mm.h>
#include <linux/nd.h>
+#include <linux/cpu.h>
#include "nd-core.h"
#include "nd.h"
#include "pfn.h"
@@ -90,6 +91,48 @@ static void nvdimm_bus_probe_end(struct nvdimm_bus *nvdimm_bus)
nvdimm_bus_unlock(&nvdimm_bus->dev);
}
+struct nvdimm_drv_dev {
+ struct nd_device_driver *nd_drv;
+ struct device *dev;
+};
+
+static long __nvdimm_call_probe(void *_nddd)
+{
+ struct nvdimm_drv_dev *nddd = _nddd;
+ struct nd_device_driver *nd_drv = nddd->nd_drv;
+
+ return nd_drv->probe(nddd->dev);
+}
+
+static int nvdimm_call_probe(struct nd_device_driver *nd_drv,
+ struct device *dev)
+{
+ struct nvdimm_drv_dev nddd = { nd_drv, dev };
+ int rc, node, cpu;
+
+ /*
+ * Execute driver initialization on node where the device is
+ * attached. This way the driver will be able to access local
+ * memory instead of having to initialize memory across nodes.
+ */
+ node = dev_to_node(dev);
+
+ cpu_hotplug_disable();
+
+ if (node < 0 || node >= MAX_NUMNODES || !node_online(node))
+ cpu = nr_cpu_ids;
+ else
+ cpu = cpumask_any_and(cpumask_of_node(node), cpu_online_mask);
+
+ if (cpu < nr_cpu_ids)
+ rc = work_on_cpu(cpu, __nvdimm_call_probe, &nddd);
+ else
+ rc = __nvdimm_call_probe(&nddd);
+
+ cpu_hotplug_enable();
+ return rc;
+}
+
static int nvdimm_bus_probe(struct device *dev)
{
struct nd_device_driver *nd_drv = to_nd_device_driver(dev->driver);
@@ -104,7 +147,7 @@ static int nvdimm_bus_probe(struct device *dev)
dev->driver->name, dev_name(dev));
nvdimm_bus_probe_start(nvdimm_bus);
- rc = nd_drv->probe(dev);
+ rc = nvdimm_call_probe(nd_drv, dev);
if (rc == 0)
nd_region_probe_success(nvdimm_bus, dev);
else
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
WARNING: multiple messages have this Message-ID (diff)
From: Alexander Duyck <alexander.duyck@gmail.com>
To: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
linux-nvdimm@lists.01.org
Cc: pavel.tatashin@microsoft.com, mhocko@suse.com,
dave.jiang@intel.com, mingo@kernel.org, dave.hansen@intel.com,
jglisse@redhat.com, akpm@linux-foundation.org,
logang@deltatee.com, dan.j.williams@intel.com,
kirill.shutemov@linux.intel.com
Subject: [PATCH 4/4] nvdimm: Trigger the device probe on a cpu local to the device
Date: Mon, 10 Sep 2018 16:44:00 -0700 [thread overview]
Message-ID: <20180910234400.4068.15541.stgit@localhost.localdomain> (raw)
In-Reply-To: <20180910232615.4068.29155.stgit@localhost.localdomain>
From: Alexander Duyck <alexander.h.duyck@intel.com>
This patch is based off of the pci_call_probe function used to initialize
PCI devices. The general idea here is to move the probe call to a location
that is local to the memory being initialized. By doing this we can shave
significant time off of the total time needed for initialization.
With this patch applied I see a significant reduction in overall init time
as without it the init varied between 23 and 37 seconds to initialize a 3GB
node. With this patch applied the variance is only between 23 and 26
seconds to initialize each node.
I hope to refine this further in the future by combining this logic into
the async_schedule_domain code that is already in use. By doing that it
would likely make this functionality redundant.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
---
drivers/nvdimm/bus.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)
diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
index 8aae6dcc839f..5b73953176b1 100644
--- a/drivers/nvdimm/bus.c
+++ b/drivers/nvdimm/bus.c
@@ -27,6 +27,7 @@
#include <linux/io.h>
#include <linux/mm.h>
#include <linux/nd.h>
+#include <linux/cpu.h>
#include "nd-core.h"
#include "nd.h"
#include "pfn.h"
@@ -90,6 +91,48 @@ static void nvdimm_bus_probe_end(struct nvdimm_bus *nvdimm_bus)
nvdimm_bus_unlock(&nvdimm_bus->dev);
}
+struct nvdimm_drv_dev {
+ struct nd_device_driver *nd_drv;
+ struct device *dev;
+};
+
+static long __nvdimm_call_probe(void *_nddd)
+{
+ struct nvdimm_drv_dev *nddd = _nddd;
+ struct nd_device_driver *nd_drv = nddd->nd_drv;
+
+ return nd_drv->probe(nddd->dev);
+}
+
+static int nvdimm_call_probe(struct nd_device_driver *nd_drv,
+ struct device *dev)
+{
+ struct nvdimm_drv_dev nddd = { nd_drv, dev };
+ int rc, node, cpu;
+
+ /*
+ * Execute driver initialization on node where the device is
+ * attached. This way the driver will be able to access local
+ * memory instead of having to initialize memory across nodes.
+ */
+ node = dev_to_node(dev);
+
+ cpu_hotplug_disable();
+
+ if (node < 0 || node >= MAX_NUMNODES || !node_online(node))
+ cpu = nr_cpu_ids;
+ else
+ cpu = cpumask_any_and(cpumask_of_node(node), cpu_online_mask);
+
+ if (cpu < nr_cpu_ids)
+ rc = work_on_cpu(cpu, __nvdimm_call_probe, &nddd);
+ else
+ rc = __nvdimm_call_probe(&nddd);
+
+ cpu_hotplug_enable();
+ return rc;
+}
+
static int nvdimm_bus_probe(struct device *dev)
{
struct nd_device_driver *nd_drv = to_nd_device_driver(dev->driver);
@@ -104,7 +147,7 @@ static int nvdimm_bus_probe(struct device *dev)
dev->driver->name, dev_name(dev));
nvdimm_bus_probe_start(nvdimm_bus);
- rc = nd_drv->probe(dev);
+ rc = nvdimm_call_probe(nd_drv, dev);
if (rc == 0)
nd_region_probe_success(nvdimm_bus, dev);
else
next prev parent reply other threads:[~2018-09-10 23:44 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-10 23:43 [PATCH 0/4] Address issues slowing persistent memory initialization Alexander Duyck
2018-09-10 23:43 ` Alexander Duyck
2018-09-10 23:43 ` [PATCH 1/4] mm: Provide kernel parameter to allow disabling page init poisoning Alexander Duyck
2018-09-10 23:43 ` Alexander Duyck
2018-09-11 0:35 ` Alexander Duyck
2018-09-11 0:35 ` Alexander Duyck
2018-09-11 16:50 ` Dan Williams
2018-09-11 16:50 ` Dan Williams
2018-09-11 20:01 ` Alexander Duyck
2018-09-11 20:01 ` Alexander Duyck
2018-09-11 20:24 ` Dan Williams
2018-09-11 20:24 ` Dan Williams
2018-09-12 13:24 ` Pasha Tatashin
2018-09-12 14:10 ` Michal Hocko
2018-09-12 14:10 ` Michal Hocko
2018-09-12 14:49 ` Alexander Duyck
2018-09-12 14:49 ` Alexander Duyck
2018-09-12 15:23 ` Dave Hansen
2018-09-12 15:23 ` Dave Hansen
2018-09-12 16:36 ` Alexander Duyck
2018-09-12 16:43 ` Dave Hansen
2018-09-12 16:43 ` Dave Hansen
2018-09-10 23:43 ` [PATCH 2/4] mm: Create non-atomic version of SetPageReserved for init use Alexander Duyck
2018-09-10 23:43 ` Alexander Duyck
2018-09-12 13:28 ` Pasha Tatashin
2018-09-10 23:43 ` [PATCH 3/4] mm: Defer ZONE_DEVICE page initialization to the point where we init pgmap Alexander Duyck
2018-09-10 23:43 ` Alexander Duyck
2018-09-11 7:49 ` kbuild test robot
2018-09-11 7:49 ` kbuild test robot
2018-09-11 7:54 ` kbuild test robot
2018-09-11 7:54 ` kbuild test robot
2018-09-11 22:35 ` Dan Williams
2018-09-11 22:35 ` Dan Williams
2018-09-12 0:51 ` Alexander Duyck
2018-09-12 0:51 ` Alexander Duyck
2018-09-12 0:59 ` Dan Williams
2018-09-12 0:59 ` Dan Williams
2018-09-12 13:59 ` Pasha Tatashin
2018-09-12 15:48 ` Alexander Duyck
2018-09-12 15:48 ` Alexander Duyck
2018-09-12 15:54 ` Pasha Tatashin
2018-09-12 16:44 ` Alexander Duyck
2018-09-12 16:44 ` Alexander Duyck
2018-09-12 16:50 ` Dan Williams
2018-09-12 16:50 ` Dan Williams
2018-09-12 17:46 ` Pasha Tatashin
2018-09-12 19:11 ` Dan Williams
2018-09-12 19:11 ` Dan Williams
2018-09-10 23:44 ` Alexander Duyck [this message]
2018-09-10 23:44 ` [PATCH 4/4] nvdimm: Trigger the device probe on a cpu local to the device Alexander Duyck
2018-09-11 0:37 ` Alexander Duyck
2018-09-11 0:37 ` Alexander Duyck
2018-09-12 5:48 ` Dan Williams
2018-09-12 5:48 ` Dan Williams
2018-09-12 13:44 ` Pasha Tatashin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180910234400.4068.15541.stgit@localhost.localdomain \
--to=alexander.duyck@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=dave.hansen@intel.com \
--cc=jglisse@redhat.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-nvdimm@lists.01.org \
--cc=mhocko@suse.com \
--cc=mingo@kernel.org \
--cc=pavel.tatashin@microsoft.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.