forked from mirrors/linux
		
	s390/smp: keep the original lowcore for CPU 0
Now that CPU 0 is not hotpluggable, it is not necessary to support freeing its stacks. Delete all the code that migrates it to new stacks and a new lowcore. Suggested-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
		
							parent
							
								
									496bb034f4
								
							
						
					
					
						commit
						3570ee046c
					
				
					 3 changed files with 0 additions and 64 deletions
				
			
		|  | @ -59,7 +59,6 @@ static inline void smp_cpus_done(unsigned int max_cpus) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| extern int smp_reinit_ipl_cpu(void); |  | ||||||
| extern int smp_rescan_cpus(void); | extern int smp_rescan_cpus(void); | ||||||
| extern void __noreturn cpu_die(void); | extern void __noreturn cpu_die(void); | ||||||
| extern void __cpu_die(unsigned int cpu); | extern void __cpu_die(unsigned int cpu); | ||||||
|  |  | ||||||
|  | @ -381,12 +381,6 @@ void stack_free(unsigned long stack) | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void __init __noreturn arch_call_rest_init(void) |  | ||||||
| { |  | ||||||
| 	smp_reinit_ipl_cpu(); |  | ||||||
| 	rest_init(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static unsigned long __init stack_alloc_early(void) | static unsigned long __init stack_alloc_early(void) | ||||||
| { | { | ||||||
| 	unsigned long stack; | 	unsigned long stack; | ||||||
|  |  | ||||||
|  | @ -1256,60 +1256,3 @@ static int __init s390_smp_init(void) | ||||||
| 	return rc; | 	return rc; | ||||||
| } | } | ||||||
| subsys_initcall(s390_smp_init); | subsys_initcall(s390_smp_init); | ||||||
| 
 |  | ||||||
| static __always_inline void set_new_lowcore(struct lowcore *lc) |  | ||||||
| { |  | ||||||
| 	union register_pair dst, src; |  | ||||||
| 	u32 pfx; |  | ||||||
| 
 |  | ||||||
| 	src.even = (unsigned long) &S390_lowcore; |  | ||||||
| 	src.odd  = sizeof(S390_lowcore); |  | ||||||
| 	dst.even = (unsigned long) lc; |  | ||||||
| 	dst.odd  = sizeof(*lc); |  | ||||||
| 	pfx = __pa(lc); |  | ||||||
| 
 |  | ||||||
| 	asm volatile( |  | ||||||
| 		"	mvcl	%[dst],%[src]\n" |  | ||||||
| 		"	spx	%[pfx]\n" |  | ||||||
| 		: [dst] "+&d" (dst.pair), [src] "+&d" (src.pair) |  | ||||||
| 		: [pfx] "Q" (pfx) |  | ||||||
| 		: "memory", "cc"); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int __init smp_reinit_ipl_cpu(void) |  | ||||||
| { |  | ||||||
| 	unsigned long async_stack, nodat_stack, mcck_stack; |  | ||||||
| 	struct lowcore *lc, *lc_ipl; |  | ||||||
| 	unsigned long flags, cr0; |  | ||||||
| 	u64 mcesad; |  | ||||||
| 
 |  | ||||||
| 	lc_ipl = lowcore_ptr[0]; |  | ||||||
| 	lc = (struct lowcore *)	__get_free_pages(GFP_KERNEL | GFP_DMA, LC_ORDER); |  | ||||||
| 	nodat_stack = __get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER); |  | ||||||
| 	async_stack = stack_alloc(); |  | ||||||
| 	mcck_stack = stack_alloc(); |  | ||||||
| 	if (!lc || !nodat_stack || !async_stack || !mcck_stack || nmi_alloc_mcesa(&mcesad)) |  | ||||||
| 		panic("Couldn't allocate memory"); |  | ||||||
| 
 |  | ||||||
| 	local_irq_save(flags); |  | ||||||
| 	local_mcck_disable(); |  | ||||||
| 	set_new_lowcore(lc); |  | ||||||
| 	S390_lowcore.nodat_stack = nodat_stack + STACK_INIT_OFFSET; |  | ||||||
| 	S390_lowcore.async_stack = async_stack + STACK_INIT_OFFSET; |  | ||||||
| 	S390_lowcore.mcck_stack = mcck_stack + STACK_INIT_OFFSET; |  | ||||||
| 	__ctl_store(cr0, 0, 0); |  | ||||||
| 	__ctl_clear_bit(0, 28); /* disable lowcore protection */ |  | ||||||
| 	S390_lowcore.mcesad = mcesad; |  | ||||||
| 	__ctl_load(cr0, 0, 0); |  | ||||||
| 	if (abs_lowcore_map(0, lc, false)) |  | ||||||
| 		panic("Couldn't remap absolute lowcore"); |  | ||||||
| 	lowcore_ptr[0] = lc; |  | ||||||
| 	local_mcck_enable(); |  | ||||||
| 	local_irq_restore(flags); |  | ||||||
| 
 |  | ||||||
| 	memblock_free_late(__pa(lc_ipl->mcck_stack - STACK_INIT_OFFSET), THREAD_SIZE); |  | ||||||
| 	memblock_free_late(__pa(lc_ipl->async_stack - STACK_INIT_OFFSET), THREAD_SIZE); |  | ||||||
| 	memblock_free_late(__pa(lc_ipl->nodat_stack - STACK_INIT_OFFSET), THREAD_SIZE); |  | ||||||
| 	memblock_free_late(__pa(lc_ipl), sizeof(*lc_ipl)); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Ilya Leoshkevich
						Ilya Leoshkevich