diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2018-05-29 11:50:22 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-06-21 08:20:57 -0400 |
commit | 6a4d2657e048f096c7ffcad254010bd94891c8c0 (patch) | |
tree | 20d72fc0fdc2d6a5903ed7f0681dbc50e5c93d66 /arch/x86/kernel/apic | |
parent | ba2591a5993eabcc8e874e30f361d8ffbb10d6d4 (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.c | 15 |
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 | */ | ||
2196 | bool 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. |