lkml.org 
[lkml]   [2020]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 09/10] Powerpc/smp: Create coregroup domain
    Date
    Add percpu coregroup maps and masks to create coregroup domain.
    If a coregroup doesn't exist, the coregroup domain will be degenerated
    in favour of SMT/CACHE domain.

    Cc: linuxppc-dev <linuxppc-dev@lists.ozlabs.org>
    Cc: LKML <linux-kernel@vger.kernel.org>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Anton Blanchard <anton@ozlabs.org>
    Cc: Oliver O'Halloran <oohall@gmail.com>
    Cc: Nathan Lynch <nathanl@linux.ibm.com>
    Cc: Michael Neuling <mikey@neuling.org>
    Cc: Gautham R Shenoy <ego@linux.vnet.ibm.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Valentin Schneider <valentin.schneider@arm.com>
    Cc: Jordan Niethe <jniethe5@gmail.com>
    Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    ---
    Changelog v3 ->v4:
    if coregroup_support doesn't exist, update MC mask to the next
    smaller domain mask.

    Changelog v2 -> v3:
    Add optimization for mask updation under coregroup_support

    Changelog v1 -> v2:
    Moved coregroup topology fixup to fixup_topology (Gautham)

    arch/powerpc/include/asm/topology.h | 10 ++++++
    arch/powerpc/kernel/smp.c | 48 +++++++++++++++++++++++++++++
    arch/powerpc/mm/numa.c | 5 +++
    3 files changed, 63 insertions(+)

    diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
    index f0b6300e7dd3..6609174918ab 100644
    --- a/arch/powerpc/include/asm/topology.h
    +++ b/arch/powerpc/include/asm/topology.h
    @@ -88,12 +88,22 @@ static inline int cpu_distance(__be32 *cpu1_assoc, __be32 *cpu2_assoc)

    #if defined(CONFIG_NUMA) && defined(CONFIG_PPC_SPLPAR)
    extern int find_and_online_cpu_nid(int cpu);
    +extern int cpu_to_coregroup_id(int cpu);
    #else
    static inline int find_and_online_cpu_nid(int cpu)
    {
    return 0;
    }

    +static inline int cpu_to_coregroup_id(int cpu)
    +{
    +#ifdef CONFIG_SMP
    + return cpu_to_core_id(cpu);
    +#else
    + return 0;
    +#endif
    +}
    +
    #endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */

    #include <asm-generic/topology.h>
    diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
    index dab96a1203ec..95f0bf72e283 100644
    --- a/arch/powerpc/kernel/smp.c
    +++ b/arch/powerpc/kernel/smp.c
    @@ -80,6 +80,7 @@ DEFINE_PER_CPU(cpumask_var_t, cpu_sibling_map);
    DEFINE_PER_CPU(cpumask_var_t, cpu_smallcore_map);
    DEFINE_PER_CPU(cpumask_var_t, cpu_l2_cache_map);
    DEFINE_PER_CPU(cpumask_var_t, cpu_core_map);
    +DEFINE_PER_CPU(cpumask_var_t, cpu_coregroup_map);

    EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);
    EXPORT_PER_CPU_SYMBOL(cpu_l2_cache_map);
    @@ -91,6 +92,7 @@ enum {
    smt_idx,
    #endif
    bigcore_idx,
    + mc_idx,
    die_idx,
    };

    @@ -869,6 +871,21 @@ static const struct cpumask *smallcore_smt_mask(int cpu)
    }
    #endif

    +static struct cpumask *cpu_coregroup_mask(int cpu)
    +{
    + return per_cpu(cpu_coregroup_map, cpu);
    +}
    +
    +static bool has_coregroup_support(void)
    +{
    + return coregroup_enabled;
    +}
    +
    +static const struct cpumask *cpu_mc_mask(int cpu)
    +{
    + return cpu_coregroup_mask(cpu);
    +}
    +
    static const struct cpumask *cpu_bigcore_mask(int cpu)
    {
    return per_cpu(cpu_sibling_map, cpu);
    @@ -879,6 +896,7 @@ static struct sched_domain_topology_level powerpc_topology[] = {
    { cpu_smt_mask, powerpc_smt_flags, SD_INIT_NAME(SMT) },
    #endif
    { cpu_bigcore_mask, SD_INIT_NAME(BIGCORE) },
    + { cpu_mc_mask, SD_INIT_NAME(MC) },
    { cpu_cpu_mask, SD_INIT_NAME(DIE) },
    { NULL, },
    };
    @@ -925,6 +943,10 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
    GFP_KERNEL, cpu_to_node(cpu));
    zalloc_cpumask_var_node(&per_cpu(cpu_core_map, cpu),
    GFP_KERNEL, cpu_to_node(cpu));
    + if (has_coregroup_support())
    + zalloc_cpumask_var_node(&per_cpu(cpu_coregroup_map, cpu),
    + GFP_KERNEL, cpu_to_node(cpu));
    +
    #ifdef CONFIG_NEED_MULTIPLE_NODES
    /*
    * numa_node_id() works after this.
    @@ -942,6 +964,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
    cpumask_set_cpu(boot_cpuid, cpu_l2_cache_mask(boot_cpuid));
    cpumask_set_cpu(boot_cpuid, cpu_core_mask(boot_cpuid));

    + if (has_coregroup_support())
    + cpumask_set_cpu(boot_cpuid, cpu_coregroup_mask(boot_cpuid));
    +
    init_big_cores();
    if (has_big_cores) {
    cpumask_set_cpu(boot_cpuid,
    @@ -1233,6 +1258,8 @@ static void remove_cpu_from_masks(int cpu)
    set_cpus_unrelated(cpu, i, cpu_sibling_mask);
    if (has_big_cores)
    set_cpus_unrelated(cpu, i, cpu_smallcore_mask);
    + if (has_coregroup_support())
    + set_cpus_unrelated(cpu, i, cpu_coregroup_mask);
    }
    }
    #endif
    @@ -1293,6 +1320,20 @@ static void add_cpu_to_masks(int cpu)
    add_cpu_to_smallcore_masks(cpu);
    update_mask_by_l2(cpu, cpu_l2_cache_mask);

    + if (has_coregroup_support()) {
    + int coregroup_id = cpu_to_coregroup_id(cpu);
    +
    + cpumask_set_cpu(cpu, cpu_coregroup_mask(cpu));
    + for_each_cpu_and(i, cpu_online_mask, cpu_cpu_mask(cpu)) {
    + int fcpu = cpu_first_thread_sibling(i);
    +
    + if (fcpu == first_thread)
    + set_cpus_related(cpu, i, cpu_coregroup_mask);
    + else if (coregroup_id == cpu_to_coregroup_id(i))
    + set_cpus_related(cpu, i, cpu_coregroup_mask);
    + }
    + }
    +
    if (pkg_id == -1) {
    struct cpumask *(*mask)(int) = cpu_sibling_mask;

    @@ -1398,6 +1439,9 @@ static void fixup_topology(void)
    powerpc_topology[bigcore_idx].name = "CACHE";
    #endif
    }
    +
    + if (!has_coregroup_support())
    + powerpc_topology[mc_idx].mask = powerpc_topology[bigcore_idx].mask;
    }

    void __init smp_cpus_done(unsigned int max_cpus)
    diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
    index 51cb672f113b..0d57779e7942 100644
    --- a/arch/powerpc/mm/numa.c
    +++ b/arch/powerpc/mm/numa.c
    @@ -1216,6 +1216,11 @@ int find_and_online_cpu_nid(int cpu)
    return new_nid;
    }

    +int cpu_to_coregroup_id(int cpu)
    +{
    + return cpu_to_core_id(cpu);
    +}
    +
    static int topology_update_init(void)
    {
    topology_inited = 1;
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-07-27 07:19    [W:3.428 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site