All of lore.kernel.org
 help / color / mirror / Atom feed
From: Toshi Kani <toshi.kani@hp.com>
To: rjw@rjwysocki.net, dan.j.williams@intel.com
Cc: linux-acpi@vger.kernel.org, linux-nvdimm@lists.01.org,
	linux-kernel@vger.kernel.org, Toshi Kani <toshi.kani@hp.com>
Subject: [PATCH v2 1/3] acpi: Add acpi_map_pxm_to_online_node()
Date: Tue,  9 Jun 2015 17:10:38 -0600	[thread overview]
Message-ID: <1433891440-3515-2-git-send-email-toshi.kani@hp.com> (raw)
In-Reply-To: <1433891440-3515-1-git-send-email-toshi.kani@hp.com>

The kernel initializes CPU & memory's NUMA topology from ACPI
SRAT table.  Some other ACPI tables, such as NFIT and DMAR,
also contain proximity IDs for their device's NUMA topology.
This information can be used to improve performance of these
devices.

This patch introduces acpi_map_pxm_to_online_node(), which maps
a given pxm to an online node.  This allows ACPI device driver
modules to obtain a node from a device proximity ID.  Unlike
acpi_map_pxm_to_node(), this interface is guaranteed to return
an online node so that the caller module can use the node without
dealing with the node status.  A node may be offline when a device
proximity ID is unique, SRAT memory entry does not exist, or
NUMA is disabled (ex. numa_off on x86).

This patch also moves the pxm range check from acpi_get_node()
to acpi_map_pxm_to_node().

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/numa.c  |   40 +++++++++++++++++++++++++++++++++++++---
 include/linux/acpi.h |    5 +++++
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
index 1333cbdc..a64947e 100644
--- a/drivers/acpi/numa.c
+++ b/drivers/acpi/numa.c
@@ -29,6 +29,8 @@
 #include <linux/errno.h>
 #include <linux/acpi.h>
 #include <linux/numa.h>
+#include <linux/nodemask.h>
+#include <linux/topology.h>
 
 #define PREFIX "ACPI: "
 
@@ -70,7 +72,12 @@ static void __acpi_map_pxm_to_node(int pxm, int node)
 
 int acpi_map_pxm_to_node(int pxm)
 {
-	int node = pxm_to_node_map[pxm];
+	int node;
+
+	if (pxm < 0 || pxm >= MAX_PXM_DOMAINS)
+		return NUMA_NO_NODE;
+
+	node = pxm_to_node_map[pxm];
 
 	if (node == NUMA_NO_NODE) {
 		if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
@@ -83,6 +90,35 @@ int acpi_map_pxm_to_node(int pxm)
 	return node;
 }
 
+/*
+ * Return an online node from a pxm.  This interface is intended for ACPI
+ * device drivers that obtain device NUMA topology from ACPI table, but
+ * do not initialize the node status.
+ */
+int acpi_map_pxm_to_online_node(int pxm)
+{
+	int node, n, dist, min_dist;
+
+	node = acpi_map_pxm_to_node(pxm);
+
+	if (node == NUMA_NO_NODE)
+		node = 0;
+
+	if (!node_online(node)) {
+		min_dist = INT_MAX;
+		for_each_online_node(n) {
+			dist = node_distance(node, n);
+			if (dist < min_dist) {
+				min_dist = dist;
+				node = n;
+			}
+		}
+	}
+
+	return node;
+}
+EXPORT_SYMBOL(acpi_map_pxm_to_online_node);
+
 static void __init
 acpi_table_print_srat_entry(struct acpi_subtable_header *header)
 {
@@ -328,8 +364,6 @@ int acpi_get_node(acpi_handle handle)
 	int pxm;
 
 	pxm = acpi_get_pxm(handle);
-	if (pxm < 0 || pxm >= MAX_PXM_DOMAINS)
-		return NUMA_NO_NODE;
 
 	return acpi_map_pxm_to_node(pxm);
 }
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index e4da5e3..1b3bbb1 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -289,8 +289,13 @@ extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d);
 extern void acpi_osi_setup(char *str);
 
 #ifdef CONFIG_ACPI_NUMA
+int acpi_map_pxm_to_online_node(int pxm);
 int acpi_get_node(acpi_handle handle);
 #else
+static inline int acpi_map_pxm_to_online_node(int pxm)
+{
+	return 0;
+}
 static inline int acpi_get_node(acpi_handle handle)
 {
 	return 0;

WARNING: multiple messages have this Message-ID (diff)
From: Toshi Kani <toshi.kani@hp.com>
To: rjw@rjwysocki.net, dan.j.williams@intel.com
Cc: linux-acpi@vger.kernel.org, linux-nvdimm@ml01.01.org,
	linux-kernel@vger.kernel.org, Toshi Kani <toshi.kani@hp.com>
Subject: [PATCH v2 1/3] acpi: Add acpi_map_pxm_to_online_node()
Date: Tue,  9 Jun 2015 17:10:38 -0600	[thread overview]
Message-ID: <1433891440-3515-2-git-send-email-toshi.kani@hp.com> (raw)
In-Reply-To: <1433891440-3515-1-git-send-email-toshi.kani@hp.com>

The kernel initializes CPU & memory's NUMA topology from ACPI
SRAT table.  Some other ACPI tables, such as NFIT and DMAR,
also contain proximity IDs for their device's NUMA topology.
This information can be used to improve performance of these
devices.

This patch introduces acpi_map_pxm_to_online_node(), which maps
a given pxm to an online node.  This allows ACPI device driver
modules to obtain a node from a device proximity ID.  Unlike
acpi_map_pxm_to_node(), this interface is guaranteed to return
an online node so that the caller module can use the node without
dealing with the node status.  A node may be offline when a device
proximity ID is unique, SRAT memory entry does not exist, or
NUMA is disabled (ex. numa_off on x86).

This patch also moves the pxm range check from acpi_get_node()
to acpi_map_pxm_to_node().

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/numa.c  |   40 +++++++++++++++++++++++++++++++++++++---
 include/linux/acpi.h |    5 +++++
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
index 1333cbdc..a64947e 100644
--- a/drivers/acpi/numa.c
+++ b/drivers/acpi/numa.c
@@ -29,6 +29,8 @@
 #include <linux/errno.h>
 #include <linux/acpi.h>
 #include <linux/numa.h>
+#include <linux/nodemask.h>
+#include <linux/topology.h>
 
 #define PREFIX "ACPI: "
 
@@ -70,7 +72,12 @@ static void __acpi_map_pxm_to_node(int pxm, int node)
 
 int acpi_map_pxm_to_node(int pxm)
 {
-	int node = pxm_to_node_map[pxm];
+	int node;
+
+	if (pxm < 0 || pxm >= MAX_PXM_DOMAINS)
+		return NUMA_NO_NODE;
+
+	node = pxm_to_node_map[pxm];
 
 	if (node == NUMA_NO_NODE) {
 		if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
@@ -83,6 +90,35 @@ int acpi_map_pxm_to_node(int pxm)
 	return node;
 }
 
+/*
+ * Return an online node from a pxm.  This interface is intended for ACPI
+ * device drivers that obtain device NUMA topology from ACPI table, but
+ * do not initialize the node status.
+ */
+int acpi_map_pxm_to_online_node(int pxm)
+{
+	int node, n, dist, min_dist;
+
+	node = acpi_map_pxm_to_node(pxm);
+
+	if (node == NUMA_NO_NODE)
+		node = 0;
+
+	if (!node_online(node)) {
+		min_dist = INT_MAX;
+		for_each_online_node(n) {
+			dist = node_distance(node, n);
+			if (dist < min_dist) {
+				min_dist = dist;
+				node = n;
+			}
+		}
+	}
+
+	return node;
+}
+EXPORT_SYMBOL(acpi_map_pxm_to_online_node);
+
 static void __init
 acpi_table_print_srat_entry(struct acpi_subtable_header *header)
 {
@@ -328,8 +364,6 @@ int acpi_get_node(acpi_handle handle)
 	int pxm;
 
 	pxm = acpi_get_pxm(handle);
-	if (pxm < 0 || pxm >= MAX_PXM_DOMAINS)
-		return NUMA_NO_NODE;
 
 	return acpi_map_pxm_to_node(pxm);
 }
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index e4da5e3..1b3bbb1 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -289,8 +289,13 @@ extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d);
 extern void acpi_osi_setup(char *str);
 
 #ifdef CONFIG_ACPI_NUMA
+int acpi_map_pxm_to_online_node(int pxm);
 int acpi_get_node(acpi_handle handle);
 #else
+static inline int acpi_map_pxm_to_online_node(int pxm)
+{
+	return 0;
+}
 static inline int acpi_get_node(acpi_handle handle)
 {
 	return 0;

  reply	other threads:[~2015-06-09 23:10 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-09 23:10 [PATCH v2 0/3] Add NUMA support for NVDIMM devices Toshi Kani
2015-06-09 23:10 ` Toshi Kani
2015-06-09 23:10 ` Toshi Kani [this message]
2015-06-09 23:10   ` [PATCH v2 1/3] acpi: Add acpi_map_pxm_to_online_node() Toshi Kani
2015-06-19  0:42   ` Rafael J. Wysocki
2015-06-19  0:42     ` Rafael J. Wysocki
2015-06-19  1:16     ` Toshi Kani
2015-06-19  1:16       ` Toshi Kani
2015-06-09 23:10 ` [PATCH v2 2/3] libnvdimm: Set numa_node to NVDIMM devices Toshi Kani
2015-06-09 23:10   ` Toshi Kani
2015-06-09 23:10 ` [PATCH v2 3/3] libnvdimm: Add sysfs " Toshi Kani
2015-06-09 23:10   ` Toshi Kani
2015-06-10 15:54 ` [PATCH v2 0/3] Add NUMA support for " Jeff Moyer
2015-06-10 15:57   ` Dan Williams
2015-06-10 16:11     ` Jeff Moyer
2015-06-10 16:11       ` Jeff Moyer
2015-06-10 16:20     ` Elliott, Robert (Server Storage)
2015-06-10 16:37       ` Dan Williams
2015-06-10 16:20     ` Toshi Kani
2015-06-11 15:38 ` Dan Williams
2015-06-11 15:38   ` Dan Williams
2015-06-11 15:45   ` Toshi Kani
2015-06-11 15:45     ` Toshi Kani
2015-06-18 20:24 ` Dan Williams
2015-06-18 20:24   ` Dan Williams
2015-06-19  0:43   ` Rafael J. Wysocki
2015-06-19  0:43     ` Rafael J. Wysocki

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=1433891440-3515-2-git-send-email-toshi.kani@hp.com \
    --to=toshi.kani@hp.com \
    --cc=dan.j.williams@intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvdimm@lists.01.org \
    --cc=rjw@rjwysocki.net \
    /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.