[RFC][PATCH v2 03/21] x86/numa_emulation: fix fake NUMA in uniform case

From: Fengguang Wu
Date: Wed Dec 26 2018 - 08:39:30 EST


From: Fan Du <fan.du@xxxxxxxxx>

The index of numa_meminfo is expected to the same as of numa_meminfo.blk[].
and numa_remove_memblk_from break the expectation.

2S system does not break, because

before numa_remove_memblk_from
index nid
0 0
1 1

after numa_remove_memblk_from

index nid
0 1
1 1

If you try to configure uniform fake node in 4S system.
index nid
0 0
1 1
2 2
3 3

node 3 will be removed by numa_remove_memblk_from when iterate index 2.
so we only create fake node for 3 physcial node, and a portion of memroy
wasted as much as it hit lost pages checking in numa_meminfo_cover_memory.

Signed-off-by: Fan Du <fan.du@xxxxxxxxx>

---
arch/x86/mm/numa_emulation.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)

--- linux.orig/arch/x86/mm/numa_emulation.c 2018-12-23 19:20:51.570664269 +0800
+++ linux/arch/x86/mm/numa_emulation.c 2018-12-23 19:20:51.566664364 +0800
@@ -381,7 +381,21 @@ void __init numa_emulation(struct numa_m
goto no_emu;

memset(&ei, 0, sizeof(ei));
- pi = *numa_meminfo;
+
+ {
+ /* Make sure the index is identical with nid */
+ struct numa_meminfo *mi = numa_meminfo;
+ int nid;
+
+ for (i = 0; i < mi->nr_blks; i++) {
+ nid = mi->blk[i].nid;
+ pi.blk[nid].nid = nid;
+ pi.blk[nid].start = mi->blk[i].start;
+ pi.blk[nid].end = mi->blk[i].end;
+ }
+ pi.nr_blks = mi->nr_blks;
+
+ }

for (i = 0; i < MAX_NUMNODES; i++)
emu_nid_to_phys[i] = NUMA_NO_NODE;