From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1762492AbdEWJBi (ORCPT ); Tue, 23 May 2017 05:01:38 -0400 Received: from terminus.zytor.com ([65.50.211.136]:54323 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760149AbdEWJB2 (ORCPT ); Tue, 23 May 2017 05:01:28 -0400 Date: Tue, 23 May 2017 01:56:49 -0700 From: tip-bot for Thomas Gleixner Message-ID: Cc: gregkh@linuxfoundation.org, torvalds@linux-foundation.org, mingo@kernel.org, mark.rutland@arm.com, tglx@linutronix.de, hpa@zytor.com, linux-kernel@vger.kernel.org, rostedt@goodmis.org, peterz@infradead.org Reply-To: gregkh@linuxfoundation.org, tglx@linutronix.de, mark.rutland@arm.com, torvalds@linux-foundation.org, mingo@kernel.org, rostedt@goodmis.org, peterz@infradead.org, linux-kernel@vger.kernel.org, hpa@zytor.com In-Reply-To: <20170516184736.272225698@linutronix.de> References: <20170516184736.272225698@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:sched/core] sched/core: Enable might_sleep() and smp_processor_id() checks early Git-Commit-ID: 1c3c5eab171590f86edd8d31389d61dd1efe3037 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 1c3c5eab171590f86edd8d31389d61dd1efe3037 Gitweb: http://git.kernel.org/tip/1c3c5eab171590f86edd8d31389d61dd1efe3037 Author: Thomas Gleixner AuthorDate: Tue, 16 May 2017 20:42:48 +0200 Committer: Ingo Molnar CommitDate: Tue, 23 May 2017 10:01:38 +0200 sched/core: Enable might_sleep() and smp_processor_id() checks early 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. Tested-by: Mark Rutland Signed-off-by: Thomas Gleixner Signed-off-by: Peter Zijlstra (Intel) Acked-by: Mark Rutland Cc: Greg Kroah-Hartman Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Steven Rostedt Link: http://lkml.kernel.org/r/20170516184736.272225698@linutronix.de Signed-off-by: Ingo Molnar --- init/main.c | 10 ++++++++++ kernel/sched/core.c | 4 +++- lib/smp_processor_id.c | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/init/main.c b/init/main.c index badae3b..df58a41 100644 --- a/init/main.c +++ b/init/main.c @@ -414,6 +414,16 @@ static noinline void __ref rest_init(void) 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); /* diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 877241e..c3e50ca 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -6238,8 +6238,10 @@ void ___might_sleep(const char *file, int line, int preempt_offset) 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; diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c index 690d75b..2fb007b 100644 --- a/lib/smp_processor_id.c +++ b/lib/smp_processor_id.c @@ -28,7 +28,7 @@ notrace static unsigned int check_preemption_disabled(const char *what1, /* * It is valid to assume CPU-locality during early bootup: */ - if (system_state != SYSTEM_RUNNING) + if (system_state < SYSTEM_SCHEDULING) goto out; /*