Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1359521
| From | Zhu Guihua <zhugh.fnst@cn.fujitsu.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH v6 1/5] x86, memhp, numa: Online memory-less nodes at boot time. |
| Date | 2016-03-17 02:40 +0100 |
| Message-ID | <rdv4S-rL-17@gated-at.bofh.it> (permalink) |
| References | <rdv4R-rL-5@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
From: Tang Chen <tangchen@cn.fujitsu.com>
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 1-1 mapping. It means the
cpu will be mapped to the node 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.
This patch 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@cn.fujitsu.com>
---
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 f70c1ff..257dd56 100644
--- a/arch/x86/mm/numa.c
+++ b/arch/x86/mm/numa.c
@@ -725,22 +725,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.
+ */
}
/*
@@ -769,8 +766,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);
}
}
--
1.9.3
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH v6 0/5] Make cpuid <-> nodeid mapping persistent Zhu Guihua <zhugh.fnst@cn.fujitsu.com> - 2016-03-17 02:40 +0100
[PATCH v6 5/5] x86, acpi, cpu-hotplug: Set persistent cpuid <-> nodeid mapping when booting. Zhu Guihua <zhugh.fnst@cn.fujitsu.com> - 2016-03-17 02:40 +0100
[PATCH v6 3/5] x86, acpi, cpu-hotplug: Introduce cpuid_to_apicid[] array to store persistent cpuid <-> apicid mapping. Zhu Guihua <zhugh.fnst@cn.fujitsu.com> - 2016-03-17 02:40 +0100
[PATCH v6 2/5] x86, acpi, cpu-hotplug: Enable acpi to register all possible cpus at boot time. Zhu Guihua <zhugh.fnst@cn.fujitsu.com> - 2016-03-17 02:40 +0100
[PATCH v6 4/5] x86, acpi, cpu-hotplug: Enable MADT APIs to return disabled apicid. Zhu Guihua <zhugh.fnst@cn.fujitsu.com> - 2016-03-17 02:40 +0100
[PATCH v6 1/5] x86, memhp, numa: Online memory-less nodes at boot time. Zhu Guihua <zhugh.fnst@cn.fujitsu.com> - 2016-03-17 02:40 +0100
Re: [PATCH v6 0/5] Make cpuid <-> nodeid mapping persistent "Rafael J. Wysocki" <rafael@kernel.org> - 2016-03-17 02:50 +0100
Re: [PATCH v6 0/5] Make cpuid <-> nodeid mapping persistent Thomas Gleixner <tglx@linutronix.de> - 2016-03-18 11:40 +0100
csiph-web