From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S967015AbdEWIwZ (ORCPT ); Tue, 23 May 2017 04:52:25 -0400 Received: from terminus.zytor.com ([65.50.211.136]:46981 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966963AbdEWIwT (ORCPT ); Tue, 23 May 2017 04:52:19 -0400 Date: Tue, 23 May 2017 01:47:41 -0700 From: tip-bot for Thomas Gleixner Message-ID: Cc: mingo@kernel.org, torvalds@linux-foundation.org, tglx@linutronix.de, rostedt@goodmis.org, linux-kernel@vger.kernel.org, mark.rutland@arm.com, hpa@zytor.com, gregkh@linuxfoundation.org, peterz@infradead.org Reply-To: gregkh@linuxfoundation.org, peterz@infradead.org, mark.rutland@arm.com, hpa@zytor.com, tglx@linutronix.de, rostedt@goodmis.org, linux-kernel@vger.kernel.org, mingo@kernel.org, torvalds@linux-foundation.org In-Reply-To: <20170516184734.943149935@linutronix.de> References: <20170516184734.943149935@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:sched/core] init: Pin init task to the boot CPU, initially Git-Commit-ID: 8fb12156b8db61af3d49f3e5e104568494581d1f 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: 8fb12156b8db61af3d49f3e5e104568494581d1f Gitweb: http://git.kernel.org/tip/8fb12156b8db61af3d49f3e5e104568494581d1f Author: Thomas Gleixner AuthorDate: Tue, 16 May 2017 20:42:32 +0200 Committer: Ingo Molnar CommitDate: Tue, 23 May 2017 10:01:34 +0200 init: Pin init task to the boot CPU, initially Some of the boot code in init_kernel_freeable() which runs before SMP bringup assumes (rightfully) that it runs on the boot CPU and therefore can use smp_processor_id() in preemptible context. That works so far because the smp_processor_id() check starts to be effective after smp bringup. That's just wrong. Starting with SMP bringup and the ability to move threads around, smp_processor_id() in preemptible context is broken. Aside of that it does not make sense to allow init to run on all CPUs before sched_smp_init() has been run. Pin the init to the boot CPU so the existing code can continue to use smp_processor_id() without triggering the checks when the enabling of those checks starts earlier. Tested-by: Mark Rutland Signed-off-by: Thomas Gleixner Signed-off-by: Peter Zijlstra (Intel) Cc: Greg Kroah-Hartman Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Steven Rostedt Link: http://lkml.kernel.org/r/20170516184734.943149935@linutronix.de Signed-off-by: Ingo Molnar --- init/main.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/init/main.c b/init/main.c index f866510..badae3b 100644 --- a/init/main.c +++ b/init/main.c @@ -389,6 +389,7 @@ static __initdata DECLARE_COMPLETION(kthreadd_done); static noinline void __ref rest_init(void) { + struct task_struct *tsk; int pid; rcu_scheduler_starting(); @@ -397,7 +398,17 @@ static noinline void __ref rest_init(void) * the init task will end up wanting to create kthreads, which, if * we schedule it before we create kthreadd, will OOPS. */ - kernel_thread(kernel_init, NULL, CLONE_FS); + pid = kernel_thread(kernel_init, NULL, CLONE_FS); + /* + * Pin init on the boot CPU. Task migration is not properly working + * until sched_init_smp() has been run. It will set the allowed + * CPUs for init to the non isolated CPUs. + */ + rcu_read_lock(); + tsk = find_task_by_pid_ns(pid, &init_pid_ns); + set_cpus_allowed_ptr(tsk, cpumask_of(smp_processor_id())); + rcu_read_unlock(); + numa_default_policy(); pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); rcu_read_lock(); @@ -1015,10 +1026,6 @@ static noinline void __init kernel_init_freeable(void) * init can allocate pages on any node */ set_mems_allowed(node_states[N_MEMORY]); - /* - * init can run on any cpu. - */ - set_cpus_allowed_ptr(current, cpu_all_mask); cad_pid = task_pid(current);