From: Fan Du <fan...@intel.com>

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...@intel.com>

---
 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;


Reply via email to