[tip:x86/apic] x86/numa: Online memory-less nodes at boot time

From: tip-bot for Tang Chen
Date: Thu Sep 22 2016 - 15:15:37 EST


Commit-ID: 2532fc318db0e1fe68e01407ee27634c76916e44
Gitweb: http://git.kernel.org/tip/2532fc318db0e1fe68e01407ee27634c76916e44
Author: Tang Chen <tangchen@xxxxxxxxxxxxxx>
AuthorDate: Thu, 25 Aug 2016 16:35:14 +0800
Committer: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
CommitDate: Wed, 21 Sep 2016 21:18:38 +0200

x86/numa: Online memory-less nodes at boot time

For now, x86 does not support memory-less node. A node without memory
will not be onlined, and the cpus on it will be mapped to the other
online nodes with memory in init_cpu_to_node(). The reason of doing this
is to ensure each cpu has mapped to a node with memory, so that it will
be able to allocate local memory for that cpu.

But we don't have to do it in this way.

In this series of patches, we are going to construct cpu <-> node mapping
for all possible cpus at boot time, which is a persistent mapping. It means
that the cpu will be mapped to the node which it belongs to, and will never
be changed. If a node has only cpus but no memory, the cpus on it will be
mapped to a memory-less node. And the memory-less node should be onlined.

Allocate pgdats for all memory-less nodes and online them at boot
time. Then build zonelists for these nodes. As a result, when cpus on these
memory-less nodes try to allocate memory from local node, it will
automatically fall back to the proper zones in the zonelists.

Signed-off-by: Zhu Guihua <zhugh.fnst@xxxxxxxxxxxxxx>
Signed-off-by: Dou Liyang <douly.fnst@xxxxxxxxxxxxxx>
Acked-by: Ingo Molnar <mingo@xxxxxxxxxx>
Cc: mika.j.penttila@xxxxxxxxx
Cc: len.brown@xxxxxxxxx
Cc: Tang Chen <tangchen@xxxxxxxxxxxxxx>
Cc: rafael@xxxxxxxxxx
Cc: rjw@xxxxxxxxxxxxx
Cc: yasu.isimatu@xxxxxxxxx
Cc: linux-mm@xxxxxxxxx
Cc: linux-acpi@xxxxxxxxxxxxxxx
Cc: isimatu.yasuaki@xxxxxxxxxxxxxx
Cc: gongzhaogang@xxxxxxxxxx
Cc: tj@xxxxxxxxxx
Cc: izumi.taku@xxxxxxxxxxxxxx
Cc: cl@xxxxxxxxx
Cc: chen.tang@xxxxxxxxxxxx
Cc: akpm@xxxxxxxxxxxxxxxxxxxx
Cc: kamezawa.hiroyu@xxxxxxxxxxxxxx
Cc: lenb@xxxxxxxxxx
Link: http://lkml.kernel.org/r/1472114120-3281-2-git-send-email-douly.fnst@xxxxxxxxxxxxxx
Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>

---
arch/x86/mm/numa.c | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c
index fb68210..3f35b48 100644
--- a/arch/x86/mm/numa.c
+++ b/arch/x86/mm/numa.c
@@ -722,22 +722,19 @@ void __init x86_numa_init(void)
numa_init(dummy_numa_init);
}

-static __init int find_near_online_node(int node)
+static void __init init_memory_less_node(int nid)
{
- int n, val;
- int min_val = INT_MAX;
- int best_node = -1;
+ unsigned long zones_size[MAX_NR_ZONES] = {0};
+ unsigned long zholes_size[MAX_NR_ZONES] = {0};

- for_each_online_node(n) {
- val = node_distance(node, n);
+ /* Allocate and initialize node data. Memory-less node is now online.*/
+ alloc_node_data(nid);
+ free_area_init_node(nid, zones_size, 0, zholes_size);

- if (val < min_val) {
- min_val = val;
- best_node = n;
- }
- }
-
- return best_node;
+ /*
+ * All zonelists will be built later in start_kernel() after per cpu
+ * areas are initialized.
+ */
}

/*
@@ -766,8 +763,10 @@ void __init init_cpu_to_node(void)

if (node == NUMA_NO_NODE)
continue;
+
if (!node_online(node))
- node = find_near_online_node(node);
+ init_memory_less_node(node);
+
numa_set_node(cpu, node);
}
}