From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754554AbdEQLC4 (ORCPT ); Wed, 17 May 2017 07:02:56 -0400 Received: from foss.arm.com ([217.140.101.70]:45920 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752165AbdEQLCw (ORCPT ); Wed, 17 May 2017 07:02:52 -0400 Date: Wed, 17 May 2017 12:02:16 +0100 From: Mark Rutland To: Thomas Gleixner Cc: LKML , Peter Zijlstra , Ingo Molnar , Steven Rostedt , Greg Kroah-Hartman Subject: Re: [patch V2 17/17] sched: Enable might_sleep() and smp_processor_id() checks early Message-ID: <20170517110216.GH14654@leverpostej> References: <20170516184231.564888231@linutronix.de> <20170516184736.272225698@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170516184736.272225698@linutronix.de> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 16, 2017 at 08:42:48PM +0200, Thomas Gleixner wrote: > might_sleep() and smp_processor_id() 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. > > Signed-off-by: Thomas Gleixner Modulo Steve's comments, FWIW: Acked-by: Mark Rutland Mark. > --- > init/main.c | 10 ++++++++++ > kernel/sched/core.c | 4 +++- > lib/smp_processor_id.c | 2 +- > 3 files changed, 14 insertions(+), 2 deletions(-) > > --- a/init/main.c > +++ b/init/main.c > @@ -414,6 +414,16 @@ static noinline void __ref rest_init(voi > rcu_read_lock(); > kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns); > rcu_read_unlock(); > + > + /* > + * Enable might_sleep() and smp_processor_id() checks. > + * They cannot be enabled earlier because with CONFIG_PRREMPT=y > + * kernel_thread() would trigger might_sleep() splats. With > + * CONFIG_PREEMPT_VOLUNTARY=y the init task might have scheduled > + * already, but it's stuck on the kthreadd_done completion. > + */ > + system_state = SYSTEM_SCHEDULING; > + > complete(&kthreadd_done); > > /* > --- 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; > --- a/lib/smp_processor_id.c > +++ b/lib/smp_processor_id.c > @@ -28,7 +28,7 @@ notrace static unsigned int check_preemp > /* > * It is valid to assume CPU-locality during early bootup: > */ > - if (system_state != SYSTEM_RUNNING) > + if (system_state < SYSTEM_SCHEDULING) > goto out; > > /* > >