lkml.org 
[lkml]   [2019]   [May]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 08/18] x86 topology: Define topology_logical_die_id()
    Date
    From: Len Brown <len.brown@intel.com>

    Define topology_logical_die_id() ala
    existing topology_logical_package_id()

    Tested-by: Zhang Rui <rui.zhang@intel.com>
    Signed-off-by: Len Brown <len.brown@intel.com>
    ---
    arch/x86/include/asm/processor.h | 1 +
    arch/x86/include/asm/topology.h | 5 ++++
    arch/x86/kernel/cpu/common.c | 1 +
    arch/x86/kernel/smpboot.c | 45 ++++++++++++++++++++++++++++++++
    4 files changed, 52 insertions(+)

    diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
    index 5f45488b1a9d..def963d0b805 100644
    --- a/arch/x86/include/asm/processor.h
    +++ b/arch/x86/include/asm/processor.h
    @@ -118,6 +118,7 @@ struct cpuinfo_x86 {
    /* Core id: */
    u16 cpu_core_id;
    u16 cpu_die_id;
    + u16 logical_die_id;
    /* Index into per_cpu list: */
    u16 cpu_index;
    u32 microcode;
    diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h
    index 3777dbe9c0ff..9de16b4f6023 100644
    --- a/arch/x86/include/asm/topology.h
    +++ b/arch/x86/include/asm/topology.h
    @@ -106,6 +106,7 @@ extern const struct cpumask *cpu_coregroup_mask(int cpu);

    #define topology_logical_package_id(cpu) (cpu_data(cpu).logical_proc_id)
    #define topology_physical_package_id(cpu) (cpu_data(cpu).phys_proc_id)
    +#define topology_logical_die_id(cpu) (cpu_data(cpu).logical_die_id)
    #define topology_die_id(cpu) (cpu_data(cpu).cpu_die_id)
    #define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id)

    @@ -131,13 +132,17 @@ static inline int topology_max_smt_threads(void)
    }

    int topology_update_package_map(unsigned int apicid, unsigned int cpu);
    +int topology_update_die_map(unsigned int dieid, unsigned int cpu);
    int topology_phys_to_logical_pkg(unsigned int pkg);
    +int topology_phys_to_logical_die(unsigned int die, unsigned int cpu);
    bool topology_is_primary_thread(unsigned int cpu);
    bool topology_smt_supported(void);
    #else
    #define topology_max_packages() (1)
    static inline int
    topology_update_package_map(unsigned int apicid, unsigned int cpu) { return 0; }
    +static inline int
    +topology_update_die_map(unsigned int dieid, unsigned int cpu) { return 0; }
    static inline int topology_phys_to_logical_pkg(unsigned int pkg) { return 0; }
    static inline int topology_phys_to_logical_die(unsigned int die,
    unsigned int cpu) { return 0; }
    diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
    index cb28e98a0659..24f96c9771af 100644
    --- a/arch/x86/kernel/cpu/common.c
    +++ b/arch/x86/kernel/cpu/common.c
    @@ -1285,6 +1285,7 @@ static void validate_apic_and_package_id(struct cpuinfo_x86 *c)
    cpu, apicid, c->initial_apicid);
    }
    BUG_ON(topology_update_package_map(c->phys_proc_id, cpu));
    + BUG_ON(topology_update_die_map(c->cpu_die_id, cpu));
    #else
    c->logical_proc_id = 0;
    #endif
    diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
    index 05f9cfdddffd..a114375e14f7 100644
    --- a/arch/x86/kernel/smpboot.c
    +++ b/arch/x86/kernel/smpboot.c
    @@ -101,6 +101,7 @@ EXPORT_PER_CPU_SYMBOL(cpu_info);
    unsigned int __max_logical_packages __read_mostly;
    EXPORT_SYMBOL(__max_logical_packages);
    static unsigned int logical_packages __read_mostly;
    +static unsigned int logical_die __read_mostly;

    /* Maximum number of SMT threads on any online core */
    int __read_mostly __max_smt_threads = 1;
    @@ -302,6 +303,26 @@ int topology_phys_to_logical_pkg(unsigned int phys_pkg)
    return -1;
    }
    EXPORT_SYMBOL(topology_phys_to_logical_pkg);
    +/**
    + * topology_phys_to_logical_die - Map a physical die id to logical
    + *
    + * Returns logical die id or -1 if not found
    + */
    +int topology_phys_to_logical_die(unsigned int die_id, unsigned int cur_cpu)
    +{
    + int cpu;
    + int proc_id = cpu_data(cur_cpu).phys_proc_id;
    +
    + for_each_possible_cpu(cpu) {
    + struct cpuinfo_x86 *c = &cpu_data(cpu);
    +
    + if (c->initialized && c->cpu_die_id == die_id &&
    + c->phys_proc_id == proc_id)
    + return c->logical_die_id;
    + }
    + return -1;
    +}
    +EXPORT_SYMBOL(topology_phys_to_logical_die);

    /**
    * topology_update_package_map - Update the physical to logical package map
    @@ -326,6 +347,29 @@ int topology_update_package_map(unsigned int pkg, unsigned int cpu)
    cpu_data(cpu).logical_proc_id = new;
    return 0;
    }
    +/**
    + * topology_update_die_map - Update the physical to logical die map
    + * @die: The die id as retrieved via CPUID
    + * @cpu: The cpu for which this is updated
    + */
    +int topology_update_die_map(unsigned int die, unsigned int cpu)
    +{
    + int new;
    +
    + /* Already available somewhere? */
    + new = topology_phys_to_logical_die(die, cpu);
    + if (new >= 0)
    + goto found;
    +
    + new = logical_die++;
    + if (new != die) {
    + pr_info("CPU %u Converting physical %u to logical die %u\n",
    + cpu, die, new);
    + }
    +found:
    + cpu_data(cpu).logical_die_id = new;
    + return 0;
    +}

    void __init smp_store_boot_cpu_info(void)
    {
    @@ -335,6 +379,7 @@ void __init smp_store_boot_cpu_info(void)
    *c = boot_cpu_data;
    c->cpu_index = id;
    topology_update_package_map(c->phys_proc_id, id);
    + topology_update_die_map(c->cpu_die_id, id);
    c->initialized = true;
    }

    --
    2.18.0-rc0
    \
     
     \ /
      Last update: 2019-05-01 06:26    [W:3.323 / U:2.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site