diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/core.c | 13 | 
1 files changed, 12 insertions, 1 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index e8b335016c5..5b582cabd31 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -7093,13 +7093,24 @@ static inline int preempt_count_equals(int preempt_offset)  	return (nested == preempt_offset);  } +static int __might_sleep_init_called; +int __init __might_sleep_init(void) +{ +	__might_sleep_init_called = 1; +	return 0; +} +early_initcall(__might_sleep_init); +  void __might_sleep(const char *file, int line, int preempt_offset)  {  	static unsigned long prev_jiffy;	/* ratelimiting */  	rcu_sleep_check(); /* WARN_ON_ONCE() by default, no rate limit reqd. */  	if ((preempt_count_equals(preempt_offset) && !irqs_disabled()) || -	    system_state != SYSTEM_RUNNING || oops_in_progress) +	    oops_in_progress) +		return; +	if (system_state != SYSTEM_RUNNING && +	    (!__might_sleep_init_called || system_state != SYSTEM_BOOTING))  		return;  	if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy)  		return;  |