]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/kernel/smp.c
powerpc/smp: Replace open coded task affinity logic
[karo-tx-linux.git] / arch / powerpc / kernel / smp.c
index 46f89e66a273bcb8b6c45d1d2d1b1d79fa71bc20..d68ed1f004a3061cf5d3bb978bddf6acdb4e3b20 100644 (file)
@@ -787,24 +787,21 @@ static struct sched_domain_topology_level powerpc_topology[] = {
        { NULL, },
 };
 
-void __init smp_cpus_done(unsigned int max_cpus)
+static __init long smp_setup_cpu_workfn(void *data __always_unused)
 {
-       cpumask_var_t old_mask;
+       smp_ops->setup_cpu(boot_cpuid);
+       return 0;
+}
 
-       /* We want the setup_cpu() here to be called from CPU 0, but our
-        * init thread may have been "borrowed" by another CPU in the meantime
-        * se we pin us down to CPU 0 for a short while
+void __init smp_cpus_done(unsigned int max_cpus)
+{
+       /*
+        * We want the setup_cpu() here to be called on the boot CPU, but
+        * init might run on any CPU, so make sure it's invoked on the boot
+        * CPU.
         */
-       alloc_cpumask_var(&old_mask, GFP_NOWAIT);
-       cpumask_copy(old_mask, &current->cpus_allowed);
-       set_cpus_allowed_ptr(current, cpumask_of(boot_cpuid));
-       
        if (smp_ops && smp_ops->setup_cpu)
-               smp_ops->setup_cpu(boot_cpuid);
-
-       set_cpus_allowed_ptr(current, old_mask);
-
-       free_cpumask_var(old_mask);
+               work_on_cpu_safe(boot_cpuid, smp_setup_cpu_workfn, NULL);
 
        if (smp_ops && smp_ops->bringup_done)
                smp_ops->bringup_done();
@@ -812,7 +809,6 @@ void __init smp_cpus_done(unsigned int max_cpus)
        dump_numa_cpu_topology();
 
        set_sched_topology(powerpc_topology);
-
 }
 
 #ifdef CONFIG_HOTPLUG_CPU