Skip to content

Commit

Permalink
powerpc/smp: Use cpu_to_chip_id() to find core siblings
Browse files Browse the repository at this point in the history
When building the CPU scheduler topology the kernel uses the ibm,chipid
property from the devicetree to group logical CPUs. Currently the DT
search for this property is open-coded in smp.c and this functionality
is a duplication of what's in cpu_to_chip_id() already. This patch
removes the existing search in favor of that.

It's worth mentioning that the semantics of the search are different
in cpu_to_chip_id(). When there is no ibm,chipid in the CPUs node it
will also search /cpus and / for the property, but this should not
effect the output topology.

Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
  • Loading branch information
Oliver O'Halloran authored and Michael Ellerman committed Aug 31, 2017
1 parent 197267d commit e3d8b67
Showing 1 changed file with 11 additions and 26 deletions.
37 changes: 11 additions & 26 deletions arch/powerpc/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -830,19 +830,11 @@ EXPORT_SYMBOL_GPL(cpu_first_thread_of_core);

static void traverse_siblings_chip_id(int cpu, bool add, int chipid)
{
const struct cpumask *mask;
struct device_node *np;
int i, plen;
const __be32 *prop;
const struct cpumask *mask = add ? cpu_online_mask : cpu_present_mask;
int i;

mask = add ? cpu_online_mask : cpu_present_mask;
for_each_cpu(i, mask) {
np = of_get_cpu_node(i, NULL);
if (!np)
continue;
prop = of_get_property(np, "ibm,chip-id", &plen);
if (prop && plen == sizeof(int) &&
of_read_number(prop, 1) == chipid) {
if (cpu_to_chip_id(i) == chipid) {
if (add) {
cpumask_set_cpu(cpu, cpu_core_mask(i));
cpumask_set_cpu(i, cpu_core_mask(cpu));
Expand All @@ -851,7 +843,6 @@ static void traverse_siblings_chip_id(int cpu, bool add, int chipid)
cpumask_clear_cpu(i, cpu_core_mask(cpu));
}
}
of_node_put(np);
}
}

Expand Down Expand Up @@ -881,21 +872,15 @@ static void traverse_core_siblings(int cpu, bool add)
{
struct device_node *l2_cache, *np;
const struct cpumask *mask;
int i, chip, plen;
const __be32 *prop;
int chip_id;
int i;

/* First see if we have ibm,chip-id properties in cpu nodes */
np = of_get_cpu_node(cpu, NULL);
if (np) {
chip = -1;
prop = of_get_property(np, "ibm,chip-id", &plen);
if (prop && plen == sizeof(int))
chip = of_read_number(prop, 1);
of_node_put(np);
if (chip >= 0) {
traverse_siblings_chip_id(cpu, add, chip);
return;
}
/* threads that share a chip-id are considered siblings */
chip_id = cpu_to_chip_id(cpu);

if (chip_id >= 0) {
traverse_siblings_chip_id(cpu, add, chip_id);
return;
}

l2_cache = cpu_to_l2cache(cpu);
Expand Down

0 comments on commit e3d8b67

Please sign in to comment.