powerpc/vphn: Fix numa update end-loop bug
authorMichael Bringmann <mwb@linux.vnet.ibm.com>
Fri, 8 Sep 2017 20:47:56 +0000 (15:47 -0500)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 16 Oct 2017 12:12:05 +0000 (23:12 +1100)
powerpc/vphn: On Power systems with shared configurations of CPUs
and memory, there are some issues with the association of additional
CPUs and memory to nodes when hot-adding resources.  This patch
fixes an end-of-updates processing problem observed occasionally
in numa_update_cpu_topology().

Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/numa.c

index 32f5f8d..ec098b3 100644 (file)
@@ -1401,16 +1401,22 @@ int numa_update_cpu_topology(bool cpus_locked)
 
                for_each_cpu(sibling, cpu_sibling_mask(cpu)) {
                        ud = &updates[i++];
+                       ud->next = &updates[i];
                        ud->cpu = sibling;
                        ud->new_nid = new_nid;
                        ud->old_nid = numa_cpu_lookup_table[sibling];
                        cpumask_set_cpu(sibling, &updated_cpus);
-                       if (i < weight)
-                               ud->next = &updates[i];
                }
                cpu = cpu_last_thread_sibling(cpu);
        }
 
+       /*
+        * Prevent processing of 'updates' from overflowing array
+        * where last entry filled in a 'next' pointer.
+        */
+       if (i)
+               updates[i-1].next = NULL;
+
        pr_debug("Topology update for the following CPUs:\n");
        if (cpumask_weight(&updated_cpus)) {
                for (ud = &updates[0]; ud; ud = ud->next) {