On 24/05/2023 17:56:29, Michael Ellerman wrote: > 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. Hi Michael, It seems that there is now a conflict between with the PPC 'smt-enabled' boot option. Booting the patched kernel with 'smt-enabled=4', later, change to the SMT level (for instance to 6) done through /sys/devices/system/cpu/smt/control are not applied. Nothing happens. Based on my early debug, I think the reasons is that cpu_smt_num_threads=8 when entering __store_smt_control(). But I need to dig further. BTW, should the 'smt-enabled' PPC specific option remain? Cheers, Laurent. > 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@xxxxxxxxxxxxxx> > --- > arch/powerpc/Kconfig | 1 + > arch/powerpc/include/asm/topology.h | 25 +++++++++++++++++++++++++ > arch/powerpc/kernel/smp.c | 3 +++ > 3 files changed, 29 insertions(+) > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index 539d1f03ff42..5cf87ca10a9c 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -273,6 +273,7 @@ config PPC > select HAVE_SYSCALL_TRACEPOINTS > select HAVE_VIRT_CPU_ACCOUNTING > select HAVE_VIRT_CPU_ACCOUNTING_GEN > + select HOTPLUG_SMT if HOTPLUG_CPU > select HUGETLB_PAGE_SIZE_VARIABLE if PPC_BOOK3S_64 && HUGETLB_PAGE > select IOMMU_HELPER if PPC64 > select IRQ_DOMAIN > diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h > index 8a4d4f4d9749..1e9117a22d14 100644 > --- a/arch/powerpc/include/asm/topology.h > +++ b/arch/powerpc/include/asm/topology.h > @@ -143,5 +143,30 @@ 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_smt_supported(void) > +{ > + return threads_per_core > 1; > +} > + > +static inline bool topology_smt_threads_supported(unsigned int num_threads) > +{ > + return num_threads <= threads_per_core; > +} > + > +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 */ > diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c > index 265801a3e94c..eed20b9253b7 100644 > --- a/arch/powerpc/kernel/smp.c > +++ b/arch/powerpc/kernel/smp.c > @@ -1154,6 +1154,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus) > > if (smp_ops && smp_ops->probe) > smp_ops->probe(); > + > + // Initalise the generic SMT topology support > + cpu_smt_check_topology(threads_per_core); > } > > void smp_prepare_boot_cpu(void)