powerpc/numa: Convert to hotplug state machine
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Mon, 18 Jul 2016 14:07:28 +0000 (16:07 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 22 Jul 2016 19:53:17 +0000 (21:53 +0200)
Install the callbacks via the state machine. On the boot cpu the callback is
invoked manually because cpuhp is not up yet and everything must be
preinitialized before additional CPUs are up.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Bharata B Rao <bharata@linux.vnet.ibm.com>
Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Christophe Jaillet <christophe.jaillet@wanadoo.fr>
Cc: Anton Blanchard <anton@samba.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: linuxppc-dev@lists.ozlabs.org
Cc: rt@linutronix.de
Link: http://lkml.kernel.org/r/20160718140727.GA13132@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/powerpc/mm/numa.c
include/linux/cpuhotplug.h

index 669a15e7fa76a07ad57c3d2b82712766520a049a..6dc07ddbfd04c11e79d54cff8e8ab60312093388 100644 (file)
@@ -581,30 +581,22 @@ static void verify_cpu_node_mapping(int cpu, int node)
        }
 }
 
-static int cpu_numa_callback(struct notifier_block *nfb, unsigned long action,
-                            void *hcpu)
+/* Must run before sched domains notifier. */
+static int ppc_numa_cpu_prepare(unsigned int cpu)
 {
-       unsigned long lcpu = (unsigned long)hcpu;
-       int ret = NOTIFY_DONE, nid;
+       int nid;
 
-       switch (action) {
-       case CPU_UP_PREPARE:
-       case CPU_UP_PREPARE_FROZEN:
-               nid = numa_setup_cpu(lcpu);
-               verify_cpu_node_mapping((int)lcpu, nid);
-               ret = NOTIFY_OK;
-               break;
+       nid = numa_setup_cpu(cpu);
+       verify_cpu_node_mapping(cpu, nid);
+       return 0;
+}
+
+static int ppc_numa_cpu_dead(unsigned int cpu)
+{
 #ifdef CONFIG_HOTPLUG_CPU
-       case CPU_DEAD:
-       case CPU_DEAD_FROZEN:
-       case CPU_UP_CANCELED:
-       case CPU_UP_CANCELED_FROZEN:
-               unmap_cpu_from_node(lcpu);
-               ret = NOTIFY_OK;
-               break;
+       unmap_cpu_from_node(cpu);
 #endif
-       }
-       return ret;
+       return 0;
 }
 
 /*
@@ -913,11 +905,6 @@ static void __init dump_numa_memory_topology(void)
        }
 }
 
-static struct notifier_block ppc64_numa_nb = {
-       .notifier_call = cpu_numa_callback,
-       .priority = 1 /* Must run before sched domains notifier. */
-};
-
 /* Initialize NODE_DATA for a node on the local memory */
 static void __init setup_node_data(int nid, u64 start_pfn, u64 end_pfn)
 {
@@ -985,15 +972,18 @@ void __init initmem_init(void)
        setup_node_to_cpumask_map();
 
        reset_numa_cpu_lookup_table();
-       register_cpu_notifier(&ppc64_numa_nb);
+
        /*
         * We need the numa_cpu_lookup_table to be accurate for all CPUs,
         * even before we online them, so that we can use cpu_to_{node,mem}
         * early in boot, cf. smp_prepare_cpus().
+        * _nocalls() + manual invocation is used because cpuhp is not yet
+        * initialized for the boot CPU.
         */
-       for_each_present_cpu(cpu) {
-               numa_setup_cpu((unsigned long)cpu);
-       }
+       cpuhp_setup_state_nocalls(CPUHP_POWER_NUMA_PREPARE, "POWER_NUMA_PREPARE",
+                                 ppc_numa_cpu_prepare, ppc_numa_cpu_dead);
+       for_each_present_cpu(cpu)
+               numa_setup_cpu(cpu);
 }
 
 static int __init early_numa(char *p)
index 09ef54bcba391e0f10e4e67e603c7116bfbe67a4..5015f463d314da3b14467cab11693377acba1801 100644 (file)
@@ -15,6 +15,7 @@ enum cpuhp_state {
        CPUHP_X86_HPET_DEAD,
        CPUHP_X86_APB_DEAD,
        CPUHP_WORKQUEUE_PREP,
+       CPUHP_POWER_NUMA_PREPARE,
        CPUHP_HRTIMERS_PREPARE,
        CPUHP_PROFILE_PREPARE,
        CPUHP_X2APIC_PREPARE,