lkml.org 
[lkml]   [2018]   [Aug]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 045/107] x86/cpu/topology: Provide detect_extended_topology_early()
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Thomas Gleixner <tglx@linutronix.de>

    commit 95f3d39ccf7aaea79d1ffdac1c887c2e100ec1b6 upstream

    To support force disabling of SMT it's required to know the number of
    thread siblings early. detect_extended_topology() cannot be called before
    the APIC driver is selected, so split out the part which initializes
    smp_num_siblings.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Acked-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/kernel/cpu/cpu.h | 1 +
    arch/x86/kernel/cpu/topology.c | 30 ++++++++++++++++++++++++------
    2 files changed, 25 insertions(+), 6 deletions(-)

    --- a/arch/x86/kernel/cpu/cpu.h
    +++ b/arch/x86/kernel/cpu/cpu.h
    @@ -46,6 +46,7 @@ extern const struct cpu_dev *const __x86

    extern void get_cpu_cap(struct cpuinfo_x86 *c);
    extern void cpu_detect_cache_sizes(struct cpuinfo_x86 *c);
    +extern int detect_extended_topology_early(struct cpuinfo_x86 *c);
    extern int detect_ht_early(struct cpuinfo_x86 *c);

    extern void x86_spec_ctrl_setup_ap(void);
    --- a/arch/x86/kernel/cpu/topology.c
    +++ b/arch/x86/kernel/cpu/topology.c
    @@ -26,15 +26,13 @@
    * exists, use it for populating initial_apicid and cpu topology
    * detection.
    */
    -void detect_extended_topology(struct cpuinfo_x86 *c)
    +int detect_extended_topology_early(struct cpuinfo_x86 *c)
    {
    #ifdef CONFIG_SMP
    - unsigned int eax, ebx, ecx, edx, sub_index;
    - unsigned int ht_mask_width, core_plus_mask_width;
    - unsigned int core_select_mask, core_level_siblings;
    + unsigned int eax, ebx, ecx, edx;

    if (c->cpuid_level < 0xb)
    - return;
    + return -1;

    cpuid_count(0xb, SMT_LEVEL, &eax, &ebx, &ecx, &edx);

    @@ -42,7 +40,7 @@ void detect_extended_topology(struct cpu
    * check if the cpuid leaf 0xb is actually implemented.
    */
    if (ebx == 0 || (LEAFB_SUBTYPE(ecx) != SMT_TYPE))
    - return;
    + return -1;

    set_cpu_cap(c, X86_FEATURE_XTOPOLOGY);

    @@ -50,10 +48,30 @@ void detect_extended_topology(struct cpu
    * initial apic id, which also represents 32-bit extended x2apic id.
    */
    c->initial_apicid = edx;
    + smp_num_siblings = LEVEL_MAX_SIBLINGS(ebx);
    +#endif
    + return 0;
    +}
    +
    +/*
    + * Check for extended topology enumeration cpuid leaf 0xb and if it
    + * exists, use it for populating initial_apicid and cpu topology
    + * detection.
    + */
    +void detect_extended_topology(struct cpuinfo_x86 *c)
    +{
    +#ifdef CONFIG_SMP
    + unsigned int eax, ebx, ecx, edx, sub_index;
    + unsigned int ht_mask_width, core_plus_mask_width;
    + unsigned int core_select_mask, core_level_siblings;
    +
    + if (detect_extended_topology_early(c) < 0)
    + return;

    /*
    * Populate HT related information from sub-leaf level 0.
    */
    + cpuid_count(0xb, SMT_LEVEL, &eax, &ebx, &ecx, &edx);
    core_level_siblings = smp_num_siblings = LEVEL_MAX_SIBLINGS(ebx);
    core_plus_mask_width = ht_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);


    \
     
     \ /
      Last update: 2018-08-14 19:58    [W:4.251 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site