FAILED: patch "[PATCH] powerpc/64: Initialise thread_info for emergency stacks" failed to apply to 4.9-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
34f19ff1b5a0d11e46df479623d6936460105c9fMon Sep 17 00:00:00 2001
From: Nicholas Piggin <[email protected]>
Date: Wed, 21 Jun 2017 15:58:29 +1000
Subject: [PATCH] powerpc/64: Initialise thread_info for emergency stacks
Emergency stacks have their thread_info mostly uninitialised, which in particular means garbage preempt_count values.
Emergency stack code runs with interrupts disabled entirely, and is used very rarely, so this has been unnoticed so far. It was found by a proposed new powerpc watchdog that takes a soft-NMI directly from the masked_interrupt handler and using the emergency stack. That crashed at BUG_ON(in_nmi()) in nmi_enter(). preempt_count()s were found to be garbage.
To fix this, zero the entire THREAD_SIZE allocation, and initialize the thread_info.
[mpe: Move it all into setup_64.c, use a function not a macro. Fix
crashes on Cell by setting preempt_count to 0 not HARDIRQ_OFFSET]
arch/powerpc/kernel/setup_64.c +28 -3
@@ -616,6 +616,24 @@ void __init exc_lvl_early_init(void)#endif /* +* Emergency stacks are used for a range of things, from asynchronous +* NMIs (system reset, machine check) to synchronous, process context. +* We set preempt_count to zero, even though that isn't necessarily correct. To +* get the right value we'd need to copy it from the previous thread_info, but +* doing that might fault causing more problems. +* TODO: what to do with accounting? +*/ +static void emerg_stack_init_thread_info (struct thread_info *ti,int cpu) +{ + ti->task =NULL ; + ti->cpu = cpu; + ti->preempt_count =0 ; + ti->local_flags =0 ; + ti->flags =0 ; +klp_init_thread_info (ti); +} + +/* * Stack space used when we detect a bad kernel stack pointer, and * early in SMP boots before relocation is enabled. Exclusive emergency * stack for machine checks.
@@ -633,24 +651,31 @@ void __init emergency_stack_init(void)* Since we use these as temporary stacks during secondary CPU * bringup, we need to get at them in real mode. This means they * must also be within the RMO region. +* +* The IRQ stacks allocated elsewhere in this file are zeroed and +* initialized in kernel/irq.c. These are initialized here in order +* to have emergency stacks available as early as possible. */ limit =min (safe_stack_limit (), ppc64_rma_size);for_each_possible_cpu (i) {struct thread_info *ti; ti =__va (memblock_alloc_base (THREAD_SIZE ,THREAD_SIZE , limit)); -klp_init_thread_info (ti); +memset (ti,0 ,THREAD_SIZE ); +emerg_stack_init_thread_info (ti, i); paca[i].emergency_sp = (void *)ti +THREAD_SIZE ;#ifdef CONFIG_PPC_BOOK3S_64 /* emergency stack for NMI exception handling. */ ti =__va (memblock_alloc_base (THREAD_SIZE ,THREAD_SIZE , limit)); -klp_init_thread_info (ti); +memset (ti,0 ,THREAD_SIZE ); +emerg_stack_init_thread_info (ti, i); paca[i].nmi_emergency_sp = (void *)ti +THREAD_SIZE ;/* emergency stack for machine check exception handling. */ ti =__va (memblock_alloc_base (THREAD_SIZE ,THREAD_SIZE , limit)); -klp_init_thread_info (ti); +memset (ti,0 ,THREAD_SIZE ); +emerg_stack_init_thread_info (ti, i); paca[i].mc_emergency_sp = (void *)ti +THREAD_SIZE ;#endif }