numa_emulation() needs to allocate a space for phys_dist[] temporarily,
while current code may miss to release this when dfl_phys_nid ==
NUMA_NO_NODE. It is observed in code review instead of in a real case.

This patch fixes this by re-order the code path.

Signed-off-by: Wei Yang <richard.weiy...@gmail.com>
---
 arch/x86/mm/numa_emulation.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/arch/x86/mm/numa_emulation.c b/arch/x86/mm/numa_emulation.c
index a8f90ce3dedf..eb017c816de6 100644
--- a/arch/x86/mm/numa_emulation.c
+++ b/arch/x86/mm/numa_emulation.c
@@ -353,6 +353,24 @@ void __init numa_emulation(struct numa_meminfo 
*numa_meminfo, int numa_dist_cnt)
                goto no_emu;
        }
 
+       /*
+        * Determine the max emulated nid and the default phys nid to use
+        * for unmapped nodes.
+        */
+       max_emu_nid = 0;
+       dfl_phys_nid = NUMA_NO_NODE;
+       for (i = 0; i < ARRAY_SIZE(emu_nid_to_phys); i++) {
+               if (emu_nid_to_phys[i] != NUMA_NO_NODE) {
+                       max_emu_nid = i;
+                       if (dfl_phys_nid == NUMA_NO_NODE)
+                               dfl_phys_nid = emu_nid_to_phys[i];
+               }
+       }
+       if (dfl_phys_nid == NUMA_NO_NODE) {
+               pr_warning("NUMA: Warning: can't determine default physical 
node, disabling emulation\n");
+               goto no_emu;
+       }
+
        /* copy the physical distance table */
        if (numa_dist_cnt) {
                u64 phys;
@@ -372,24 +390,6 @@ void __init numa_emulation(struct numa_meminfo 
*numa_meminfo, int numa_dist_cnt)
                                        node_distance(i, j);
        }
 
-       /*
-        * Determine the max emulated nid and the default phys nid to use
-        * for unmapped nodes.
-        */
-       max_emu_nid = 0;
-       dfl_phys_nid = NUMA_NO_NODE;
-       for (i = 0; i < ARRAY_SIZE(emu_nid_to_phys); i++) {
-               if (emu_nid_to_phys[i] != NUMA_NO_NODE) {
-                       max_emu_nid = i;
-                       if (dfl_phys_nid == NUMA_NO_NODE)
-                               dfl_phys_nid = emu_nid_to_phys[i];
-               }
-       }
-       if (dfl_phys_nid == NUMA_NO_NODE) {
-               pr_warning("NUMA: Warning: can't determine default physical 
node, disabling emulation\n");
-               goto no_emu;
-       }
-
        /* commit */
        *numa_meminfo = ei;
 
-- 
2.11.0

Reply via email to