LKML Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH RFC] driver core: ensure a device has valid node id in device_add()
@ 2019-09-05  1:33 Yunsheng Lin
  2019-09-05  5:57 ` Greg KH
  0 siblings, 1 reply; 12+ messages in thread
From: Yunsheng Lin @ 2019-09-05  1:33 UTC (permalink / raw)
  To: gregkh, rafael; +Cc: linux-kernel, peterz, mingo, mhocko, linuxarm

Currently a device does not belong to any of the numa nodes
(dev->numa_node is NUMA_NO_NODE) when the FW does not provide
the node id and the device has not no parent device.

According to discussion in [1]:
Even if a device's numa node is not set by fw, the device
really does belong to a node.

This patch sets the device node to node 0 in device_add() if
the fw has not specified the node id and it either has no
parent device, or the parent device also does not have a valid
node id.

There may be explicit handling out there relying on NUMA_NO_NODE,
like in nvme_probe().

[1] https://lkml.org/lkml/2019/9/2/466

Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
---
 drivers/base/core.c  | 17 ++++++++++++++---
 include/linux/numa.h |  2 ++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/base/core.c b/drivers/base/core.c
index 1669d41..466b8ff 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -2107,9 +2107,20 @@ int device_add(struct device *dev)
 	if (kobj)
 		dev->kobj.parent = kobj;
 
-	/* use parent numa_node */
-	if (parent && (dev_to_node(dev) == NUMA_NO_NODE))
-		set_dev_node(dev, dev_to_node(parent));
+	/* use parent numa_node or default node 0 */
+	if (!numa_node_valid(dev_to_node(dev))) {
+		int nid = parent ? dev_to_node(parent) : NUMA_NO_NODE;
+
+		if (numa_node_valid(nid)) {
+			set_dev_node(dev, nid);
+		} else {
+			if (nr_node_ids > 1U)
+				pr_err("device: '%s': has invalid NUMA node(%d)\n",
+				       dev_name(dev), dev_to_node(dev));
+
+			set_dev_node(dev, 0);
+		}
+	}
 
 	/* first, register with generic layer. */
 	/* we require the name to be set before, and pass NULL */
diff --git a/include/linux/numa.h b/include/linux/numa.h
index 110b0e5..eccc757 100644
--- a/include/linux/numa.h
+++ b/include/linux/numa.h
@@ -13,4 +13,6 @@
 
 #define	NUMA_NO_NODE	(-1)
 
+#define numa_node_valid(node)	((unsigned int)(node) < nr_node_ids)
+
 #endif /* _LINUX_NUMA_H */
-- 
2.8.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, back to index

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-05  1:33 [PATCH RFC] driver core: ensure a device has valid node id in device_add() Yunsheng Lin
2019-09-05  5:57 ` Greg KH
2019-09-05  6:48   ` Yunsheng Lin
2019-09-05  7:33     ` Greg KH
2019-09-05  8:57       ` Yunsheng Lin
2019-09-05  9:02         ` Greg KH
2019-09-05  9:07           ` Yunsheng Lin
2019-09-06  6:41       ` Yunsheng Lin
2019-09-06  6:52         ` Greg KH
2019-09-06  8:21           ` Yunsheng Lin
2019-09-06 14:00             ` Greg KH
2019-09-07  2:10               ` Yunsheng Lin

LKML Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/lkml/0 lkml/git/0.git
	git clone --mirror https://lore.kernel.org/lkml/1 lkml/git/1.git
	git clone --mirror https://lore.kernel.org/lkml/2 lkml/git/2.git
	git clone --mirror https://lore.kernel.org/lkml/3 lkml/git/3.git
	git clone --mirror https://lore.kernel.org/lkml/4 lkml/git/4.git
	git clone --mirror https://lore.kernel.org/lkml/5 lkml/git/5.git
	git clone --mirror https://lore.kernel.org/lkml/6 lkml/git/6.git
	git clone --mirror https://lore.kernel.org/lkml/7 lkml/git/7.git
	git clone --mirror https://lore.kernel.org/lkml/8 lkml/git/8.git
	git clone --mirror https://lore.kernel.org/lkml/9 lkml/git/9.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 lkml lkml/ https://lore.kernel.org/lkml \
		linux-kernel@vger.kernel.org
	public-inbox-index lkml

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-kernel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git