mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	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
					
				
					 4 changed files with 26 additions and 3 deletions
				
			
		|  | @ -3853,10 +3853,10 @@ | ||||||
| 	nosmp		[SMP] Tells an SMP kernel to act as a UP kernel, | 	nosmp		[SMP] Tells an SMP kernel to act as a UP kernel, | ||||||
| 			and disable the IO APIC.  legacy for "maxcpus=0". | 			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. | 			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 | 			nosmt=force: Force disable SMT, cannot be undone | ||||||
| 				     via the sysfs control file. | 				     via the sysfs control file. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -272,6 +272,8 @@ config PPC | ||||||
| 	select HAVE_SYSCALL_TRACEPOINTS | 	select HAVE_SYSCALL_TRACEPOINTS | ||||||
| 	select HAVE_VIRT_CPU_ACCOUNTING | 	select HAVE_VIRT_CPU_ACCOUNTING | ||||||
| 	select HAVE_VIRT_CPU_ACCOUNTING_GEN | 	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 HUGETLB_PAGE_SIZE_VARIABLE	if PPC_BOOK3S_64 && HUGETLB_PAGE | ||||||
| 	select IOMMU_HELPER			if PPC64 | 	select IOMMU_HELPER			if PPC64 | ||||||
| 	select IRQ_DOMAIN | 	select IRQ_DOMAIN | ||||||
|  |  | ||||||
|  | @ -143,5 +143,20 @@ static inline int cpu_to_coregroup_id(int cpu) | ||||||
| #endif | #endif | ||||||
| #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 /* __KERNEL__ */ | ||||||
| #endif	/* _ASM_POWERPC_TOPOLOGY_H */ | #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) | void __init smp_prepare_cpus(unsigned int max_cpus) | ||||||
| { | { | ||||||
| 	unsigned int cpu; | 	unsigned int cpu, num_threads; | ||||||
| 
 | 
 | ||||||
| 	DBG("smp_prepare_cpus\n"); | 	DBG("smp_prepare_cpus\n"); | ||||||
| 
 | 
 | ||||||
|  | @ -1154,6 +1154,12 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | ||||||
| 
 | 
 | ||||||
| 	if (smp_ops && smp_ops->probe) | 	if (smp_ops && smp_ops->probe) | ||||||
| 		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) | void smp_prepare_boot_cpu(void) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Michael Ellerman
						Michael Ellerman