x86/topology: Define topology_logical_die_id()
authorLen Brown <len.brown@intel.com>
Mon, 13 May 2019 17:58:49 +0000 (13:58 -0400)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 23 May 2019 08:08:32 +0000 (10:08 +0200)
Define topology_logical_die_id() ala existing topology_logical_package_id()

Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Zhang Rui <rui.zhang@intel.com>
Reviewed-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/2f3526e25ae14fbeff26fb26e877d159df8946d9.1557769318.git.len.brown@intel.com
arch/x86/include/asm/processor.h
arch/x86/include/asm/topology.h
arch/x86/kernel/cpu/common.c
arch/x86/kernel/smpboot.c

index 7c17343946dd56dea0cf4207d6c4d469164f8bfd..6aba36bde57f28084d042ef43eeb73f12a007c4b 100644 (file)
@@ -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;
index 3777dbe9c0ffd3c63577bf8bc0b2b558ca0f3b8c..9de16b4f60234a1c01fa3ed3d8c5f1a7e567f476 100644 (file)
@@ -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; }
index d7f55ad2dfb1f153fbd95ef6dca7f5d817d26e51..8cdca1223b0f25e88193814fae315693b99fb5a3 100644 (file)
@@ -1298,6 +1298,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
index 40ffe23249c06bc78055e6c2b0c0a8b64e0809ab..a6e01b6c27092be154d748c1bae757a1ccfdb6b2 100644 (file)
@@ -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 @@ found:
        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;
 }