diff options
Diffstat (limited to 'kernel/cpu/idle.c')
| -rw-r--r-- | kernel/cpu/idle.c | 19 | 
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/cpu/idle.c b/kernel/cpu/idle.c index 8b86c0c68edf..e695c0a0bcb5 100644 --- a/kernel/cpu/idle.c +++ b/kernel/cpu/idle.c @@ -5,6 +5,7 @@  #include <linux/cpu.h>  #include <linux/tick.h>  #include <linux/mm.h> +#include <linux/stackprotector.h>  #include <asm/tlb.h> @@ -40,11 +41,13 @@ __setup("hlt", cpu_idle_nopoll_setup);  static inline int cpu_idle_poll(void)  { +	rcu_idle_enter();  	trace_cpu_idle_rcuidle(0, smp_processor_id());  	local_irq_enable();  	while (!need_resched())  		cpu_relax();  	trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id()); +	rcu_idle_exit();  	return 1;  } @@ -56,6 +59,7 @@ void __weak arch_cpu_idle_dead(void) { }  void __weak arch_cpu_idle(void)  {  	cpu_idle_force_poll = 1; +	local_irq_enable();  }  /* @@ -110,6 +114,21 @@ static void cpu_idle_loop(void)  void cpu_startup_entry(enum cpuhp_state state)  { +	/* +	 * This #ifdef needs to die, but it's too late in the cycle to +	 * make this generic (arm and sh have never invoked the canary +	 * init for the non boot cpus!). Will be fixed in 3.11 +	 */ +#ifdef CONFIG_X86 +	/* +	 * If we're the non-boot CPU, nothing set the stack canary up +	 * for us. The boot CPU already has it initialized but no harm +	 * in doing it again. This is a good place for updating it, as +	 * we wont ever return from this function (so the invalid +	 * canaries already on the stack wont ever trigger). +	 */ +	boot_init_stack_canary(); +#endif  	current_set_polling();  	arch_cpu_idle_prepare();  	cpu_idle_loop();  | 
