lkml.org 
[lkml]   [2020]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 07/10] Powerpc/numa: Detect support for coregroup
    Date
    Add support for grouping cores based on the device-tree classification.
    - The last domain in the associativity domains always refers to the
    core.
    - If primary reference domain happens to be the penultimate domain in
    the associativity domains device-tree property, then there are no
    coregroups. However if its not a penultimate domain, then there are
    coregroups. There can be more than one coregroup. For now we would be
    interested in the last or the smallest coregroups.

    Cc: linuxppc-dev <linuxppc-dev@lists.ozlabs.org>
    Cc: LKML <linux-kernel@vger.kernel.org>
    Cc: Michael Ellerman <michaele@au1.ibm.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Valentin Schneider <valentin.schneider@arm.com>
    Cc: Nick Piggin <npiggin@au1.ibm.com>
    Cc: Oliver OHalloran <oliveroh@au1.ibm.com>
    Cc: Nathan Lynch <nathanl@linux.ibm.com>
    Cc: Michael Neuling <mikey@linux.ibm.com>
    Cc: Anton Blanchard <anton@au1.ibm.com>
    Cc: Gautham R Shenoy <ego@linux.vnet.ibm.com>
    Cc: Vaidyanathan Srinivasan <svaidy@linux.ibm.com>
    Cc: Jordan Niethe <jniethe5@gmail.com>
    Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
    Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    ---
    Changelog v1 -> v2:
    Powerpc/numa: Detect support for coregroup
    Explained Coregroup in commit msg (Michael Ellerman)

    arch/powerpc/include/asm/smp.h | 1 +
    arch/powerpc/kernel/smp.c | 1 +
    arch/powerpc/mm/numa.c | 34 +++++++++++++++++++++-------------
    3 files changed, 23 insertions(+), 13 deletions(-)

    diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h
    index 49a25e2400f2..5bdc17a7049f 100644
    --- a/arch/powerpc/include/asm/smp.h
    +++ b/arch/powerpc/include/asm/smp.h
    @@ -28,6 +28,7 @@
    extern int boot_cpuid;
    extern int spinning_secondaries;
    extern u32 *cpu_to_phys_id;
    +extern bool coregroup_enabled;

    extern void cpu_die(void);
    extern int cpu_to_chip_id(int cpu);
    diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
    index 933ebdf97432..320e36a0ec0b 100644
    --- a/arch/powerpc/kernel/smp.c
    +++ b/arch/powerpc/kernel/smp.c
    @@ -74,6 +74,7 @@ static DEFINE_PER_CPU(int, cpu_state) = { 0 };

    struct task_struct *secondary_current;
    bool has_big_cores;
    +bool coregroup_enabled;

    DEFINE_PER_CPU(cpumask_var_t, cpu_sibling_map);
    DEFINE_PER_CPU(cpumask_var_t, cpu_smallcore_map);
    diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
    index bc5b2e8112c8..3248160c0327 100644
    --- a/arch/powerpc/mm/numa.c
    +++ b/arch/powerpc/mm/numa.c
    @@ -886,7 +886,9 @@ static void __init setup_node_data(int nid, u64 start_pfn, u64 end_pfn)
    static void __init find_possible_nodes(void)
    {
    struct device_node *rtas;
    - u32 numnodes, i;
    + const __be32 *domains;
    + int prop_length, max_nodes;
    + u32 i;

    if (!numa_enabled)
    return;
    @@ -895,25 +897,31 @@ static void __init find_possible_nodes(void)
    if (!rtas)
    return;

    - if (of_property_read_u32_index(rtas, "ibm,current-associativity-domains",
    - min_common_depth, &numnodes)) {
    - /*
    - * ibm,current-associativity-domains is a fairly recent
    - * property. If it doesn't exist, then fallback on
    - * ibm,max-associativity-domains. Current denotes what the
    - * platform can support compared to max which denotes what the
    - * Hypervisor can support.
    - */
    - if (of_property_read_u32_index(rtas, "ibm,max-associativity-domains",
    - min_common_depth, &numnodes))
    + /*
    + * ibm,current-associativity-domains is a fairly recent property. If
    + * it doesn't exist, then fallback on ibm,max-associativity-domains.
    + * Current denotes what the platform can support compared to max
    + * which denotes what the Hypervisor can support.
    + */
    + domains = of_get_property(rtas, "ibm,current-associativity-domains",
    + &prop_length);
    + if (!domains) {
    + domains = of_get_property(rtas, "ibm,max-associativity-domains",
    + &prop_length);
    + if (!domains)
    goto out;
    }

    - for (i = 0; i < numnodes; i++) {
    + max_nodes = of_read_number(&domains[min_common_depth], 1);
    + for (i = 0; i < max_nodes; i++) {
    if (!node_possible(i))
    node_set(i, node_possible_map);
    }

    + prop_length /= sizeof(int);
    + if (prop_length > min_common_depth + 2)
    + coregroup_enabled = 1;
    +
    out:
    of_node_put(rtas);
    }
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-07-21 13:40    [W:2.931 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site