Skip to content

Commit 88f8d11

Browse files
author
CKI KWF Bot
committed
Merge: x86/topology: Implement topology_is_core_online() to address SMT regression
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/7606 JIRA: https://issues.redhat.com/browse/RHEL-125289 commit 2066f00 Author: Thomas Gleixner <tglx@linutronix.de> Date: Sun Sep 21 10:56:40 2025 +0200 x86/topology: Implement topology_is_core_online() to address SMT regression Christian reported that commit a430c11 ("intel_idle: Rescan "dead" SMT siblings during initialization") broke the use case in which both 'nosmt' and 'maxcpus' are on the kernel command line because it onlines primary threads, which were offline due to the maxcpus limit. The initially proposed fix to skip primary threads in the loop is inconsistent. While it prevents the primary thread to be onlined, it then onlines the corresponding hyperthread(s), which does not really make sense. The CPU iterator in cpuhp_smt_enable() contains a check which excludes all threads of a core, when the primary thread is offline. The default implementation is a NOOP and therefore not effective on x86. Implement topology_is_core_online() on x86 to address this issue. This makes the behaviour consistent between x86 and PowerPC. Fixes: a430c11 ("intel_idle: Rescan "dead" SMT siblings during initialization") Fixes: f694481 ("ACPI: processor: Rescan "dead" SMT siblings during initialization") Closes: https://lore.kernel.org/linux-pm/724616a2-6374-4ba3-8ce3-ea9c45e2ae3b@arm.com/ Reported-by: Christian Loehle <christian.loehle@arm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Rafael J. Wysocki (Intel) <rafael@kernel.org> Tested-by: Christian Loehle <christian.loehle@arm.com> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/12740505.O9o76ZdvQC@rafael.j.wysocki Signed-off-by: David Arcari <darcari@redhat.com> Approved-by: Tony Camuso <tcamuso@redhat.com> Approved-by: Steve Best <sbest@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 1bd2d1f + 45d2aeb commit 88f8d11

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

arch/x86/include/asm/topology.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,16 @@ static inline bool topology_is_primary_thread(unsigned int cpu)
225225
return cpumask_test_cpu(cpu, cpu_primary_thread_mask);
226226
}
227227

228+
int topology_get_primary_thread(unsigned int cpu);
229+
230+
static inline bool topology_is_core_online(unsigned int cpu)
231+
{
232+
int pcpu = topology_get_primary_thread(cpu);
233+
234+
return pcpu >= 0 ? cpu_online(pcpu) : false;
235+
}
236+
#define topology_is_core_online topology_is_core_online
237+
228238
#else /* CONFIG_SMP */
229239
static inline int topology_phys_to_logical_pkg(unsigned int pkg) { return 0; }
230240
static inline int topology_max_smt_threads(void) { return 1; }

arch/x86/kernel/cpu/topology.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,19 @@ unsigned int topology_unit_count(u32 apicid, enum x86_topology_domains which_uni
371371
return topo_unit_count(lvlid, at_level, apic_maps[which_units].map);
372372
}
373373

374+
#ifdef CONFIG_SMP
375+
int topology_get_primary_thread(unsigned int cpu)
376+
{
377+
u32 apic_id = cpuid_to_apicid[cpu];
378+
379+
/*
380+
* Get the core domain level APIC id, which is the primary thread
381+
* and return the CPU number assigned to it.
382+
*/
383+
return topo_lookup_cpuid(topo_apicid(apic_id, TOPO_CORE_DOMAIN));
384+
}
385+
#endif
386+
374387
#ifdef CONFIG_ACPI_HOTPLUG_CPU
375388
/**
376389
* topology_hotplug_apic - Handle a physical hotplugged APIC after boot

0 commit comments

Comments
 (0)