powerpc: Add HOTPLUG_SMT support
Add support for HOTPLUG_SMT, which enables the generic sysfs SMT support files in /sys/devices/system/cpu/smt, as well as the "nosmt" boot parameter. Implement the recently added hooks to allow partial SMT states, allow any number of threads per core. Tie the config symbol to HOTPLUG_CPU, which enables it on the major platforms that support SMT. If there are other platforms that want the SMT support that can be tweaked in future. Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> [ldufour: remove topology_smt_supported] [ldufour: remove topology_smt_threads_supported] [ldufour: select CONFIG_SMT_NUM_THREADS_DYNAMIC] [ldufour: update kernel-parameters.txt] Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com> Link: https://msgid.link/20230705145143.40545-10-ldufour@linux.ibm.com
This commit is contained in:
parent
3b3a4d0fe5
commit
73c58e7e14
@ -3853,10 +3853,10 @@
|
||||
nosmp [SMP] Tells an SMP kernel to act as a UP kernel,
|
||||
and disable the IO APIC. legacy for "maxcpus=0".
|
||||
|
||||
nosmt [KNL,MIPS,S390] Disable symmetric multithreading (SMT).
|
||||
nosmt [KNL,MIPS,PPC,S390] Disable symmetric multithreading (SMT).
|
||||
Equivalent to smt=1.
|
||||
|
||||
[KNL,X86] Disable symmetric multithreading (SMT).
|
||||
[KNL,X86,PPC] Disable symmetric multithreading (SMT).
|
||||
nosmt=force: Force disable SMT, cannot be undone
|
||||
via the sysfs control file.
|
||||
|
||||
|
@ -272,6 +272,8 @@ config PPC
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_VIRT_CPU_ACCOUNTING
|
||||
select HAVE_VIRT_CPU_ACCOUNTING_GEN
|
||||
select HOTPLUG_SMT if HOTPLUG_CPU
|
||||
select SMT_NUM_THREADS_DYNAMIC
|
||||
select HUGETLB_PAGE_SIZE_VARIABLE if PPC_BOOK3S_64 && HUGETLB_PAGE
|
||||
select IOMMU_HELPER if PPC64
|
||||
select IRQ_DOMAIN
|
||||
|
@ -143,5 +143,20 @@ static inline int cpu_to_coregroup_id(int cpu)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_SMT
|
||||
#include <linux/cpu_smt.h>
|
||||
#include <asm/cputhreads.h>
|
||||
|
||||
static inline bool topology_is_primary_thread(unsigned int cpu)
|
||||
{
|
||||
return cpu == cpu_first_thread_sibling(cpu);
|
||||
}
|
||||
|
||||
static inline bool topology_smt_thread_allowed(unsigned int cpu)
|
||||
{
|
||||
return cpu_thread_in_core(cpu) < cpu_smt_num_threads;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_TOPOLOGY_H */
|
||||
|
@ -1087,7 +1087,7 @@ static int __init init_big_cores(void)
|
||||
|
||||
void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
unsigned int cpu;
|
||||
unsigned int cpu, num_threads;
|
||||
|
||||
DBG("smp_prepare_cpus\n");
|
||||
|
||||
@ -1154,6 +1154,12 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
|
||||
if (smp_ops && smp_ops->probe)
|
||||
smp_ops->probe();
|
||||
|
||||
// Initalise the generic SMT topology support
|
||||
num_threads = 1;
|
||||
if (smt_enabled_at_boot)
|
||||
num_threads = smt_enabled_at_boot;
|
||||
cpu_smt_set_num_threads(num_threads, threads_per_core);
|
||||
}
|
||||
|
||||
void smp_prepare_boot_cpu(void)
|
||||
|
Loading…
Reference in New Issue
Block a user