powerpc: Pull out cpu_core_mask updates into a separate function
This factors out the details of updating cpu_core_mask into a separate function, to make it easier to change how the mask is calculated later. This makes no functional change. Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
630573c1da
commit
a8a5356cd5
@ -631,11 +631,36 @@ static struct device_node *cpu_to_l2cache(int cpu)
|
|||||||
return cache;
|
return cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void traverse_core_siblings(int cpu, bool add)
|
||||||
|
{
|
||||||
|
struct device_node *l2_cache;
|
||||||
|
const struct cpumask *mask;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
l2_cache = cpu_to_l2cache(cpu);
|
||||||
|
mask = add ? cpu_online_mask : cpu_present_mask;
|
||||||
|
for_each_cpu(i, mask) {
|
||||||
|
struct device_node *np = cpu_to_l2cache(i);
|
||||||
|
if (!np)
|
||||||
|
continue;
|
||||||
|
if (np == l2_cache) {
|
||||||
|
if (add) {
|
||||||
|
cpumask_set_cpu(cpu, cpu_core_mask(i));
|
||||||
|
cpumask_set_cpu(i, cpu_core_mask(cpu));
|
||||||
|
} else {
|
||||||
|
cpumask_clear_cpu(cpu, cpu_core_mask(i));
|
||||||
|
cpumask_clear_cpu(i, cpu_core_mask(cpu));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
of_node_put(np);
|
||||||
|
}
|
||||||
|
of_node_put(l2_cache);
|
||||||
|
}
|
||||||
|
|
||||||
/* Activate a secondary processor. */
|
/* Activate a secondary processor. */
|
||||||
void start_secondary(void *unused)
|
void start_secondary(void *unused)
|
||||||
{
|
{
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = smp_processor_id();
|
||||||
struct device_node *l2_cache;
|
|
||||||
int i, base;
|
int i, base;
|
||||||
|
|
||||||
atomic_inc(&init_mm.mm_count);
|
atomic_inc(&init_mm.mm_count);
|
||||||
@ -674,18 +699,7 @@ void start_secondary(void *unused)
|
|||||||
cpumask_set_cpu(cpu, cpu_core_mask(base + i));
|
cpumask_set_cpu(cpu, cpu_core_mask(base + i));
|
||||||
cpumask_set_cpu(base + i, cpu_core_mask(cpu));
|
cpumask_set_cpu(base + i, cpu_core_mask(cpu));
|
||||||
}
|
}
|
||||||
l2_cache = cpu_to_l2cache(cpu);
|
traverse_core_siblings(cpu, true);
|
||||||
for_each_online_cpu(i) {
|
|
||||||
struct device_node *np = cpu_to_l2cache(i);
|
|
||||||
if (!np)
|
|
||||||
continue;
|
|
||||||
if (np == l2_cache) {
|
|
||||||
cpumask_set_cpu(cpu, cpu_core_mask(i));
|
|
||||||
cpumask_set_cpu(i, cpu_core_mask(cpu));
|
|
||||||
}
|
|
||||||
of_node_put(np);
|
|
||||||
}
|
|
||||||
of_node_put(l2_cache);
|
|
||||||
|
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
notify_cpu_starting(cpu);
|
notify_cpu_starting(cpu);
|
||||||
@ -741,7 +755,6 @@ int arch_sd_sibling_asym_packing(void)
|
|||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
int __cpu_disable(void)
|
int __cpu_disable(void)
|
||||||
{
|
{
|
||||||
struct device_node *l2_cache;
|
|
||||||
int cpu = smp_processor_id();
|
int cpu = smp_processor_id();
|
||||||
int base, i;
|
int base, i;
|
||||||
int err;
|
int err;
|
||||||
@ -761,20 +774,7 @@ int __cpu_disable(void)
|
|||||||
cpumask_clear_cpu(cpu, cpu_core_mask(base + i));
|
cpumask_clear_cpu(cpu, cpu_core_mask(base + i));
|
||||||
cpumask_clear_cpu(base + i, cpu_core_mask(cpu));
|
cpumask_clear_cpu(base + i, cpu_core_mask(cpu));
|
||||||
}
|
}
|
||||||
|
traverse_core_siblings(cpu, false);
|
||||||
l2_cache = cpu_to_l2cache(cpu);
|
|
||||||
for_each_present_cpu(i) {
|
|
||||||
struct device_node *np = cpu_to_l2cache(i);
|
|
||||||
if (!np)
|
|
||||||
continue;
|
|
||||||
if (np == l2_cache) {
|
|
||||||
cpumask_clear_cpu(cpu, cpu_core_mask(i));
|
|
||||||
cpumask_clear_cpu(i, cpu_core_mask(cpu));
|
|
||||||
}
|
|
||||||
of_node_put(np);
|
|
||||||
}
|
|
||||||
of_node_put(l2_cache);
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user