linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
To: tglx@linutronix.de, peterz@infradead.org, paulmck@linux.vnet.ibm.com
Cc: rusty@rustcorp.com.au, mingo@kernel.org, yong.zhang0@gmail.com,
	akpm@linux-foundation.org, vatsa@linux.vnet.ibm.com, rjw@sisk.pl,
	linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org,
	srivatsa.bhat@linux.vnet.ibm.com, nikunj@linux.vnet.ibm.com,
	"Nikunj A. Dadhania" <nikunj@linux.vnet.ibm.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Suresh Siddha <suresh.b.siddha@intel.com>,
	Venkatesh Pallipadi <venki@google.com>
Subject: [PATCH 01/27] smpboot: Provide a generic method to boot secondary processors
Date: Fri, 01 Jun 2012 14:40:18 +0530	[thread overview]
Message-ID: <20120601091008.31979.93586.stgit@srivatsabhat.in.ibm.com> (raw)
In-Reply-To: <20120601090952.31979.24799.stgit@srivatsabhat.in.ibm.com>

From: Nikunj A. Dadhania <nikunj@linux.vnet.ibm.com>

The smp booting and cpu hotplug related code is heavily duplicated in various
architectures. To solve that problem, provide a generic framework to boot
secondary CPUs which can then be used by the architecture code.

For now, there is no functional change in the smp boot or hotplug sequence.
Just plain consolidation of common code from various architectures.

Signed-off-by: Nikunj A. Dadhania <nikunj@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
Cc: Venkatesh Pallipadi <venki@google.com>
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
---

 include/linux/smpboot.h |   10 ++++++
 kernel/smpboot.c        |   78 +++++++++++++++++++++++++++++++++++++++++++++++
 kernel/smpboot.h        |    4 +-
 3 files changed, 90 insertions(+), 2 deletions(-)
 create mode 100644 include/linux/smpboot.h

diff --git a/include/linux/smpboot.h b/include/linux/smpboot.h
new file mode 100644
index 0000000..63bbedd
--- /dev/null
+++ b/include/linux/smpboot.h
@@ -0,0 +1,10 @@
+/*
+ * Generic SMP CPU booting framework
+ */
+
+#ifndef SMPBOOT_H
+#define SMPBOOT_H
+
+extern void smpboot_start_secondary(void *arg);
+
+#endif
diff --git a/kernel/smpboot.c b/kernel/smpboot.c
index 98f60c5..6c26133 100644
--- a/kernel/smpboot.c
+++ b/kernel/smpboot.c
@@ -6,6 +6,7 @@
 #include <linux/init.h>
 #include <linux/sched.h>
 #include <linux/percpu.h>
+#include <linux/cpu.h>
 
 #include "smpboot.h"
 
@@ -65,3 +66,80 @@ void __init idle_threads_init(void)
 	}
 }
 #endif
+
+
+/* Implement the following functions in your architecture, as appropriate. */
+
+/**
+ * __cpu_pre_starting()
+ *
+ * Implement whatever you need to do before the CPU_STARTING notifiers are
+ * invoked. Note that the CPU_STARTING callbacks run *on* the cpu that is
+ * coming up. So that cpu better be prepared! IOW, implement all the early
+ * boot/init code for the cpu here. And do NOT enable interrupts.
+ */
+#ifndef __cpu_pre_starting
+void __weak __cpu_pre_starting(void *arg) {}
+#endif
+
+/**
+ *  __cpu_pre_online()
+ *
+ * Implement whatever you need to do before the upcoming CPU is set in the
+ * cpu_online_mask. (Setting the cpu in the cpu_online_mask is like an
+ * announcement that the cpu has come up, because it would be publicly
+ * visible now). Again, don't enable interrupts.
+ */
+#ifndef __cpu_pre_online
+void __weak __cpu_pre_online(void *arg) {}
+#endif
+
+/**
+ * __cpu_post_online()
+ *
+ * Implement whatever you need to do after the CPU has been set in the
+ * cpu_online_mask, and before enabling interrupts and calling cpu_idle().
+ * Ideally, it is preferable if you don't have anything to do here.
+ * We want to move to a model where setting cpu_online_mask is pretty
+ * much the final step. Again, don't enable interrupts.
+ */
+#ifndef __cpu_post_online
+void __weak __cpu_post_online(void *arg) {}
+#endif
+
+
+/**
+ * smpboot_start_secondary - Generic way to boot secondary processors
+ */
+void __cpuinit smpboot_start_secondary(void *arg)
+{
+	unsigned int cpu;
+
+	/*
+	 * SMP booting is extremely fragile in some architectures. So run
+	 * the cpu initialization code first before anything else.
+	 */
+	__cpu_pre_starting(arg);
+
+	preempt_disable();
+	cpu = smp_processor_id();
+
+	/* Invoke the CPU_STARTING notifier callbacks */
+	notify_cpu_starting(cpu);
+
+	__cpu_pre_online(arg);
+
+	/* Set the CPU in the cpu_online_mask */
+	set_cpu_online(cpu, true);
+
+	__cpu_post_online(arg);
+
+	/* Enable local interrupts now */
+	local_irq_enable();
+
+	wmb();
+	cpu_idle();
+
+	/* We should never reach here! */
+	BUG();
+}
diff --git a/kernel/smpboot.h b/kernel/smpboot.h
index 80c0acf..9753cc0 100644
--- a/kernel/smpboot.h
+++ b/kernel/smpboot.h
@@ -1,5 +1,5 @@
-#ifndef SMPBOOT_H
-#define SMPBOOT_H
+#ifndef __SMPBOOT_H
+#define __SMPBOOT_H
 
 struct task_struct;
 


  reply	other threads:[~2012-06-01  9:11 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-01  9:10 [PATCH 00/27] Generic framework for SMP booting/CPU hotplug related code Srivatsa S. Bhat
2012-06-01  9:10 ` Srivatsa S. Bhat [this message]
2012-06-01 12:09   ` [PATCH 01/27] smpboot: Provide a generic method to boot secondary processors Srivatsa S. Bhat
2012-06-03  8:51     ` Yong Zhang
2012-06-03 11:22       ` Srivatsa S. Bhat
2012-06-04  2:18         ` Yong Zhang
2012-06-03  8:53     ` Yong Zhang
2012-06-03 11:33       ` Srivatsa S. Bhat
2012-06-03 11:39         ` Russell King - ARM Linux
2012-06-03 12:05           ` Srivatsa S. Bhat
2012-06-01 16:51   ` Sam Ravnborg
2012-06-01 22:29     ` Srivatsa S. Bhat
2012-06-04 10:32       ` Thomas Gleixner
2012-06-04 13:07         ` Srivatsa S. Bhat
2012-06-04 13:18           ` Thomas Gleixner
2012-06-04 16:53             ` Srivatsa S. Bhat
2012-06-05  5:11           ` Yong Zhang
2012-06-05  6:07             ` Srivatsa S. Bhat
2012-06-01 16:53   ` Sam Ravnborg
2012-06-01 22:41     ` Srivatsa S. Bhat
2012-06-02 15:16       ` Sam Ravnborg
2012-06-02 15:34         ` Srivatsa S. Bhat
2012-06-01  9:10 ` [PATCH 02/27] smpboot: Add provisions for arch-specific locking around cpu_online_mask Srivatsa S. Bhat
2012-06-01 12:12   ` Srivatsa S. Bhat
2012-06-01  9:11 ` [PATCH 04/27] smpboot, x86, xen: Determine smp booting implementations at run-time Srivatsa S. Bhat
2012-06-01  9:11 ` [PATCH 05/27] xen, cpu hotplug: Don't call cpu_bringup() in xen_play_dead() Srivatsa S. Bhat
2012-06-01 12:59   ` [Xen-devel] " Jan Beulich
2012-06-01 15:13     ` Srivatsa S. Bhat
2012-06-01 15:36       ` Jan Beulich
2012-06-02 18:06         ` Srivatsa S. Bhat
2012-06-05 16:49           ` Konrad Rzeszutek Wilk
2012-06-05 17:36             ` Srivatsa S. Bhat
2012-06-05 17:40           ` Thomas Gleixner
2012-06-05 17:48             ` Srivatsa S. Bhat
2012-06-01  9:11 ` [PATCH 06/27] xen, smpboot: Use generic SMP booting infrastructure Srivatsa S. Bhat
2012-06-01  9:11 ` [PATCH 07/27] x86, " Srivatsa S. Bhat
2012-06-04 14:29   ` Thomas Gleixner
2012-06-04 17:00     ` Srivatsa S. Bhat
2012-06-01  9:12 ` [PATCH 08/27] m32r: Fix horrible logic in smp_prepare_cpus() Srivatsa S. Bhat
2012-06-01  9:12 ` [PATCH 09/27] m32r, smpboot: Use generic SMP booting infrastructure Srivatsa S. Bhat
2012-06-01  9:12 ` [PATCH 10/27] mips, " Srivatsa S. Bhat
2012-06-03  8:25   ` Yong Zhang
2012-06-03 11:48     ` Srivatsa S. Bhat
2012-06-04  2:17       ` Yong Zhang
2012-06-01  9:12 ` [PATCH 11/27] sh, " Srivatsa S. Bhat
2012-06-01  9:12 ` [PATCH 12/27] tile, " Srivatsa S. Bhat
2012-06-01 18:07   ` Chris Metcalf
2012-06-01  9:13 ` [PATCH 13/27] hexagon, " Srivatsa S. Bhat
2012-06-01  9:13 ` [PATCH 14/27] ia64: Move holding of vector_lock to __setup_vector_irq() Srivatsa S. Bhat
2012-06-01  9:13 ` [PATCH 15/27] ia64, smpboot: Use generic SMP booting infrastructure Srivatsa S. Bhat
2012-06-01  9:13 ` [PATCH 16/27] mn10300: Fix horrible logic in smp_prepare_cpus() Srivatsa S. Bhat
2012-06-01  9:14 ` [PATCH 17/27] mn10300, smpboot: Use generic SMP booting infrastructure Srivatsa S. Bhat
2012-06-03  8:33   ` Yong Zhang
2012-06-03 11:50     ` Srivatsa S. Bhat
2012-06-01  9:14 ` [PATCH 18/27] powerpc, " Srivatsa S. Bhat
2012-06-02  6:14   ` Paul Mackerras
2012-06-01  9:14 ` [PATCH 19/27] blackfin, " Srivatsa S. Bhat
2012-06-01  9:14 ` [PATCH 20/27] sparc64, " Srivatsa S. Bhat
2012-06-01 17:55   ` David Miller
2012-06-01 22:44     ` [UPDATED PATCH " Srivatsa S. Bhat
2012-06-01 22:52       ` David Miller
2012-06-01  9:15 ` [PATCH 21/27] sparc32, " Srivatsa S. Bhat
2012-06-01 17:56   ` David Miller
2012-06-01 18:54     ` Sam Ravnborg
2012-06-01 22:47       ` [UPDATED PATCH " Srivatsa S. Bhat
2012-06-01 22:53         ` David Miller
2012-06-01 23:17           ` Srivatsa S. Bhat
2012-06-02  6:52         ` Sam Ravnborg
2012-06-02  7:44           ` Sam Ravnborg
2012-06-02  8:01             ` Srivatsa S. Bhat
2012-06-02  8:14               ` Srivatsa S. Bhat
2012-06-02 15:13               ` Sam Ravnborg
2012-06-02 15:58                 ` Srivatsa S. Bhat
2012-06-02 16:23                   ` Sam Ravnborg
2012-06-02 16:34                     ` Srivatsa S. Bhat
2012-06-03 21:17                       ` [PATCH] sparc32: refactor smp boot Sam Ravnborg
2012-06-04  1:04                         ` David Miller
2012-06-04  6:48                         ` Srivatsa S. Bhat
2012-06-01  9:15 ` [PATCH 22/27] um, smpboot: Use generic SMP booting infrastructure Srivatsa S. Bhat
2012-06-01  9:15 ` [PATCH 23/27] cris, " Srivatsa S. Bhat
2012-06-03  8:41   ` Yong Zhang
2012-06-03 11:52     ` Srivatsa S. Bhat
2012-06-01  9:15 ` [PATCH 24/27] parisc, " Srivatsa S. Bhat
2012-06-01  9:16 ` [PATCH 25/27] s390, " Srivatsa S. Bhat
2012-06-01 10:45   ` Heiko Carstens
2012-06-01  9:16 ` [PATCH 26/27] arm, " Srivatsa S. Bhat
2012-06-01 11:04   ` Russell King - ARM Linux
2012-06-01  9:16 ` [PATCH 27/27] alpha, " Srivatsa S. Bhat
     [not found] ` <20120601091038.31979.67878.stgit@srivatsabhat.in.ibm.com>
2012-06-01 12:19   ` [PATCH 03/27] smpboot: Define and use cpu_state per-cpu variable in generic code Srivatsa S. Bhat
2012-06-01 12:25     ` Russell King - ARM Linux
2012-06-01 12:55       ` Srivatsa S. Bhat

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120601091008.31979.93586.stgit@srivatsabhat.in.ibm.com \
    --to=srivatsa.bhat@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=nikunj@linux.vnet.ibm.com \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=rjw@sisk.pl \
    --cc=rusty@rustcorp.com.au \
    --cc=suresh.b.siddha@intel.com \
    --cc=tglx@linutronix.de \
    --cc=vatsa@linux.vnet.ibm.com \
    --cc=venki@google.com \
    --cc=yong.zhang0@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).