diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-06-20 07:40:51 -0700 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-06-20 07:40:51 -0700 | 
| commit | bc71c2df45e5a861818b5ee173702883df07471a (patch) | |
| tree | cd008493efad9dc936d0d2574f26dc6c9c7cb785 /kernel/sched/core.c | |
| parent | 76d15c8fba655c9b2d60cf01834858f2c44483dc (diff) | |
| parent | 33688abb2802ff3a230bd2441f765477b94cc89e (diff) | |
Merge 4.7-rc4 into usb-next
We need the 4.7-rc4 fixes in here as well.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'kernel/sched/core.c')
| -rw-r--r-- | kernel/sched/core.c | 29 | 
1 files changed, 23 insertions, 6 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 7f2cae4620c7..017d5394f5dc 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -2253,9 +2253,11 @@ int sysctl_numa_balancing(struct ctl_table *table, int write,  #endif  #endif +#ifdef CONFIG_SCHEDSTATS +  DEFINE_STATIC_KEY_FALSE(sched_schedstats); +static bool __initdata __sched_schedstats = false; -#ifdef CONFIG_SCHEDSTATS  static void set_schedstats(bool enabled)  {  	if (enabled) @@ -2278,11 +2280,16 @@ static int __init setup_schedstats(char *str)  	if (!str)  		goto out; +	/* +	 * This code is called before jump labels have been set up, so we can't +	 * change the static branch directly just yet.  Instead set a temporary +	 * variable so init_schedstats() can do it later. +	 */  	if (!strcmp(str, "enable")) { -		set_schedstats(true); +		__sched_schedstats = true;  		ret = 1;  	} else if (!strcmp(str, "disable")) { -		set_schedstats(false); +		__sched_schedstats = false;  		ret = 1;  	}  out: @@ -2293,6 +2300,11 @@ out:  }  __setup("schedstats=", setup_schedstats); +static void __init init_schedstats(void) +{ +	set_schedstats(__sched_schedstats); +} +  #ifdef CONFIG_PROC_SYSCTL  int sysctl_schedstats(struct ctl_table *table, int write,  			 void __user *buffer, size_t *lenp, loff_t *ppos) @@ -2313,8 +2325,10 @@ int sysctl_schedstats(struct ctl_table *table, int write,  		set_schedstats(state);  	return err;  } -#endif -#endif +#endif /* CONFIG_PROC_SYSCTL */ +#else  /* !CONFIG_SCHEDSTATS */ +static inline void init_schedstats(void) {} +#endif /* CONFIG_SCHEDSTATS */  /*   * fork()/clone()-time setup: @@ -3156,7 +3170,8 @@ static noinline void __schedule_bug(struct task_struct *prev)  static inline void schedule_debug(struct task_struct *prev)  {  #ifdef CONFIG_SCHED_STACK_END_CHECK -	BUG_ON(task_stack_end_corrupted(prev)); +	if (task_stack_end_corrupted(prev)) +		panic("corrupted stack end detected inside scheduler\n");  #endif  	if (unlikely(in_atomic_preempt_off())) { @@ -7487,6 +7502,8 @@ void __init sched_init(void)  #endif  	init_sched_fair_class(); +	init_schedstats(); +  	scheduler_running = 1;  }  | 
