On Sun, 14 May 2017 20:27:33 +0200 Thomas Gleixner <t...@linutronix.de> wrote:
> might_sleep() checks are enabled after the boot process is done. That hides > bugs in the smp bringup and driver initialization code. > > Enable it right when the scheduler starts working, i.e. when init task and > kthreadd have been created and right before the idle task enables > preemption. Looking at commit b433c3d4549ae749, it appears that on very slow machines, there is a possibility that the init task can start running. Should system_state be updated before that complete() is called? -- Steve > > Signed-off-by: Thomas Gleixner <t...@linutronix.de> > --- > init/main.c | 2 ++ > kernel/sched/core.c | 4 +++- > 2 files changed, 5 insertions(+), 1 deletion(-) > > --- a/init/main.c > +++ b/init/main.c > @@ -410,6 +410,8 @@ static noinline void __ref rest_init(voi > * at least once to get things moving: > */ > init_idle_bootup_task(current); > + /* Enable might_sleep() checks */ > + system_state = SYSTEM_BOOTING_UP; > schedule_preempt_disabled(); > /* Call into cpu_idle with preempt disabled */ > cpu_startup_entry(CPUHP_ONLINE); > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -6226,8 +6226,10 @@ void ___might_sleep(const char *file, in > > if ((preempt_count_equals(preempt_offset) && !irqs_disabled() && > !is_idle_task(current)) || > - system_state != SYSTEM_RUNNING || oops_in_progress) > + system_state == SYSTEM_BOOTING || system_state > SYSTEM_RUNNING || > + oops_in_progress) > return; > + > if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) > return; > prev_jiffy = jiffies; >