Oliver O'Halloran <ooh...@gmail.com> writes:

> When adding and removing a CPU from the system the per-cpu masks that
> are used by the scheduler to construct scheduler domains need to be updated
> to account for the cpu entering or exiting the system. Currently logic this
> is open-coded for the thread sibling mask and shared for the core mask.

"logic this is"

> This patch moves all the logic for rebuilding these masks into a single
> function and simplifies the logic which determines which CPUs are within
> a "core".

The diff is hard to read but I think it's OK. Other than ...

> diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
> index 1c531887ca51..3922cace927e 100644
> --- a/arch/powerpc/kernel/smp.c
> +++ b/arch/powerpc/kernel/smp.c
> @@ -630,14 +630,20 @@ int cpu_first_thread_of_core(int core)
>  }
>  EXPORT_SYMBOL_GPL(cpu_first_thread_of_core);
>  
> -static void traverse_siblings_chip_id(int cpu, bool add, int chipid)
> +static bool update_core_mask_by_chip_id(int cpu, bool add)
                                                         ^
                                                         call it
                                                         onlining like below

>  {
>       const struct cpumask *mask = add ? cpu_online_mask : cpu_present_mask;
> +     int chipid = cpu_to_chip_id(cpu);
>       int i;
>  
> +     if (chipid == -1)
> +             return false;
> +
>       for_each_cpu(i, mask)
>               if (cpu_to_chip_id(i) == chipid)
>                       set_cpus_related(cpu, i, add, cpu_core_mask);
> +
> +     return true;
>  }
>  
>  /* Must be called when no change can occur to cpu_present_mask,
> @@ -662,42 +668,72 @@ static struct device_node *cpu_to_l2cache(int cpu)
>       return cache;
>  }
>  
> -static void traverse_core_siblings(int cpu, bool add)
> +static bool update_core_mask_by_l2(int cpu, bool onlining)
>  {
> +     const struct cpumask *mask = onlining ? cpu_online_mask : 
> cpu_present_mask;
>       struct device_node *l2_cache, *np;
> -     const struct cpumask *mask;
> -     int chip_id;
>       int i;
>  
> -     /* threads that share a chip-id are considered siblings (same die) */
> -     chip_id = cpu_to_chip_id(cpu);
> -
> -     if (chip_id >= 0) {
> -             traverse_siblings_chip_id(cpu, add, chip_id);
> -             return;
> -     }
> -
> -     /* if the chip-id fails then group siblings by the L2 cache */
>       l2_cache = cpu_to_l2cache(cpu);
> -     mask = add ? cpu_online_mask : cpu_present_mask;
> +     if (l2_cache == NULL)
> +             return false;
> +
>       for_each_cpu(i, mask) {
>               np = cpu_to_l2cache(i);
>               if (!np)
>                       continue;
>  
>               if (np == l2_cache)
> -                     set_cpus_related(cpu, i, add, cpu_core_mask);
> +                     set_cpus_related(cpu, i, onlining, cpu_core_mask);
>  
>               of_node_put(np);
>       }
>       of_node_put(l2_cache);
> +
> +     return true;
> +}
> +
> +static void update_thread_mask(int cpu, bool onlining)
> +{
> +     int base = cpu_first_thread_sibling(cpu);
> +     int i;
> +
> +     pr_info("CPUDEBUG: onlining cpu %d, base %d, thread_per_core %d",
> +             cpu, base, threads_per_core);

That's too spammy for cpu hotplug. Make it pr_debug() at most.

cheers

Reply via email to