aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/apic
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2018-05-29 11:50:22 -0400
committerThomas Gleixner <tglx@linutronix.de>2018-06-21 08:20:57 -0400
commit6a4d2657e048f096c7ffcad254010bd94891c8c0 (patch)
tree20d72fc0fdc2d6a5903ed7f0681dbc50e5c93d66 /arch/x86/kernel/apic
parentba2591a5993eabcc8e874e30f361d8ffbb10d6d4 (diff)
x86/smp: Provide topology_is_primary_thread()
If the CPU is supporting SMT then the primary thread can be found by checking the lower APIC ID bits for zero. smp_num_siblings is used to build the mask for the APIC ID bits which need to be taken into account. This uses the MPTABLE or ACPI/MADT supplied APIC ID, which can be different than the initial APIC ID in CPUID. But according to AMD the lower bits have to be consistent. Intel gave a tentative confirmation as well. Preparatory patch to support disabling SMT at boot/runtime. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Acked-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/kernel/apic')
-rw-r--r--arch/x86/kernel/apic/apic.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 2aabd4cb0e3f..8703caa9d6db 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -2189,6 +2189,21 @@ static int cpuid_to_apicid[] = {
2189 [0 ... NR_CPUS - 1] = -1, 2189 [0 ... NR_CPUS - 1] = -1,
2190}; 2190};
2191 2191
2192/**
2193 * apic_id_is_primary_thread - Check whether APIC ID belongs to a primary thread
2194 * @id: APIC ID to check
2195 */
2196bool apic_id_is_primary_thread(unsigned int apicid)
2197{
2198 u32 mask;
2199
2200 if (smp_num_siblings == 1)
2201 return true;
2202 /* Isolate the SMT bit(s) in the APICID and check for 0 */
2203 mask = (1U << (fls(smp_num_siblings) - 1)) - 1;
2204 return !(apicid & mask);
2205}
2206
2192/* 2207/*
2193 * Should use this API to allocate logical CPU IDs to keep nr_logical_cpuids 2208 * Should use this API to allocate logical CPU IDs to keep nr_logical_cpuids
2194 * and cpuid_to_apicid[] synchronized. 2209 * and cpuid_to_apicid[] synchronized.