ARM: 7462/1: topology: factorize the update of sibling masks
authorVincent Guittot <vincent.guittot@linaro.org>
Tue, 10 Jul 2012 13:11:11 +0000 (14:11 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 12 Jul 2012 19:38:11 +0000 (15:38 -0400)
This factorization has also been proposed in another patch that has not been
merged yet:
http://lists.infradead.org/pipermail/linux-arm-kernel/2012-January/080873.html
So, this patch could be dropped depending of the state of the other one.

Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
Reviewed-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/topology.c

index 51f23b3..eb5fc81 100644 (file)
@@ -82,6 +82,32 @@ const struct cpumask *cpu_coregroup_mask(int cpu)
        return &cpu_topology[cpu].core_sibling;
 }
 
+void update_siblings_masks(unsigned int cpuid)
+{
+       struct cputopo_arm *cpu_topo, *cpuid_topo = &cpu_topology[cpuid];
+       int cpu;
+
+       /* update core and thread sibling masks */
+       for_each_possible_cpu(cpu) {
+               cpu_topo = &cpu_topology[cpu];
+
+               if (cpuid_topo->socket_id != cpu_topo->socket_id)
+                       continue;
+
+               cpumask_set_cpu(cpuid, &cpu_topo->core_sibling);
+               if (cpu != cpuid)
+                       cpumask_set_cpu(cpu, &cpuid_topo->core_sibling);
+
+               if (cpuid_topo->core_id != cpu_topo->core_id)
+                       continue;
+
+               cpumask_set_cpu(cpuid, &cpu_topo->thread_sibling);
+               if (cpu != cpuid)
+                       cpumask_set_cpu(cpu, &cpuid_topo->thread_sibling);
+       }
+       smp_wmb();
+}
+
 /*
  * store_cpu_topology is called at boot when only one cpu is running
  * and with the mutex cpu_hotplug.lock locked, when several cpus have booted,
@@ -91,7 +117,6 @@ void store_cpu_topology(unsigned int cpuid)
 {
        struct cputopo_arm *cpuid_topo = &cpu_topology[cpuid];
        unsigned int mpidr;
-       unsigned int cpu;
 
        /* If the cpu topology has been already set, just return */
        if (cpuid_topo->core_id != -1)
@@ -133,26 +158,7 @@ void store_cpu_topology(unsigned int cpuid)
                cpuid_topo->socket_id = -1;
        }
 
-       /* update core and thread sibling masks */
-       for_each_possible_cpu(cpu) {
-               struct cputopo_arm *cpu_topo = &cpu_topology[cpu];
-
-               if (cpuid_topo->socket_id == cpu_topo->socket_id) {
-                       cpumask_set_cpu(cpuid, &cpu_topo->core_sibling);
-                       if (cpu != cpuid)
-                               cpumask_set_cpu(cpu,
-                                       &cpuid_topo->core_sibling);
-
-                       if (cpuid_topo->core_id == cpu_topo->core_id) {
-                               cpumask_set_cpu(cpuid,
-                                       &cpu_topo->thread_sibling);
-                               if (cpu != cpuid)
-                                       cpumask_set_cpu(cpu,
-                                               &cpuid_topo->thread_sibling);
-                       }
-               }
-       }
-       smp_wmb();
+       update_siblings_masks(cpuid);
 
        printk(KERN_INFO "CPU%u: thread %d, cpu %d, socket %d, mpidr %x\n",
                cpuid, cpu_topology[cpuid].thread_id,