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>,
	Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	x86@kernel.org, Suresh Siddha <suresh.b.siddha@intel.com>,
	Joerg Roedel <joerg.roedel@amd.com>,
	Yinghai Lu <yinghai@kernel.org>,
	Naga Chumbalkar <nagananda.chumbalkar@hp.com>,
	Don Zickus <dzickus@redhat.com>,
	Paul Gortmaker <paul.gortmaker@windriver.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH 07/27] x86, smpboot: Use generic SMP booting infrastructure
Date: Fri, 01 Jun 2012 14:41:56 +0530	[thread overview]
Message-ID: <20120601091148.31979.53116.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>

Convert x86 to use the generic framework to boot secondary CPUs.

Notes:
1. x86 manipulates the cpu_online_mask under vector_lock. So, while
converting over to the generic smp booting code, override arch_vector_lock()
and arch_vector_unlock() to lock_vector_lock() and unlock_vector_lock()
respectively.

2. In smp_callin(), we allow the master to continue as soon as the physical
booting of the secondary processor is done. That is, we don't wait till the
CPU_STARTING notifications are sent.

Implications:
 - This does not alter the order in which the notifications are sent (i.e.,
   still CPU_STARTING is followed by CPU_ONLINE) because the master waits till
   the new cpu is set in the cpu_online_mask before returning to generic code.

 - This approach is better because of 2 reasons:
   a. It makes more sense: the master has a timeout for waiting on the
      cpu_callin_map - which means we should report back as soon as possible.
      The whole idea of having a timeout is to estimate the maximum time that
      could be taken for physical booting. This approach separates out the
      physical booting vs running CPU hotplug callbacks and reports back to
      the master as soon as physical booting is done.

   b. Because we send out CPU_STARTING notifications *after* reporting to the
      master, we don't risk the chance of the master wrongly concluding a boot
      failure if we happen to add more callbacks to the CPU_STARTING
      notification.

Signed-off-by: Nikunj A. Dadhania <nikunj@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
Cc: Joerg Roedel <joerg.roedel@amd.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Naga Chumbalkar <nagananda.chumbalkar@hp.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
---

 arch/x86/include/asm/smp.h     |    3 +++
 arch/x86/kernel/apic/io_apic.c |   15 +++++++++++++++
 arch/x86/kernel/smp.c          |    4 ++++
 arch/x86/kernel/smpboot.c      |   39 ++++++++++++++-------------------------
 4 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h
index ac1f3eb..b081b90 100644
--- a/arch/x86/include/asm/smp.h
+++ b/arch/x86/include/asm/smp.h
@@ -176,6 +176,9 @@ void cpu_disable_common(void);
 void native_smp_prepare_boot_cpu(void);
 void native_smp_prepare_cpus(unsigned int max_cpus);
 void native_smp_cpus_done(unsigned int max_cpus);
+void native_cpu_pre_starting(void *arg);
+void native_cpu_pre_online(void *arg);
+void native_cpu_post_online(void *arg);
 int native_cpu_up(unsigned int cpunum, struct task_struct *tidle);
 int native_cpu_disable(void);
 void native_cpu_die(unsigned int cpu);
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index ac96561..a7d0037 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1084,6 +1084,21 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin,
 }
 EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector);
 
+/*
+ * We need to hold vector_lock while manipulating cpu_online_mask so that the
+ * set of online cpus does not change while we are assigning vectors to cpus.
+ * Holding this lock ensures we don't half assign or remove an irq from a cpu.
+ */
+void arch_vector_lock(void)
+{
+	lock_vector_lock();
+}
+
+void arch_vector_unlock(void)
+{
+	unlock_vector_lock();
+}
+
 void lock_vector_lock(void)
 {
 	/* Used to the online set of cpus does not change
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
index 48d2b7d..4a9748e 100644
--- a/arch/x86/kernel/smp.c
+++ b/arch/x86/kernel/smp.c
@@ -293,6 +293,10 @@ struct smp_ops smp_ops = {
 	.stop_other_cpus	= native_stop_other_cpus,
 	.smp_send_reschedule	= native_smp_send_reschedule,
 
+	.cpu_pre_starting	= native_cpu_pre_starting,
+	.cpu_pre_online		= native_cpu_pre_online,
+	.cpu_post_online	= native_cpu_post_online,
+
 	.cpu_up			= native_cpu_up,
 	.cpu_die		= native_cpu_die,
 	.cpu_disable		= native_cpu_disable,
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 269bc1f..202be43 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -189,7 +189,7 @@ static void __cpuinit smp_callin(void)
 	/*
 	 * Need to setup vector mappings before we enable interrupts.
 	 */
-	setup_vector_irq(smp_processor_id());
+	setup_vector_irq(cpuid);
 
 	/*
 	 * Save our processor parameters. Note: this information
@@ -211,14 +211,10 @@ static void __cpuinit smp_callin(void)
 	 * This must be done before setting cpu_online_mask
 	 * or calling notify_cpu_starting.
 	 */
-	set_cpu_sibling_map(raw_smp_processor_id());
+	set_cpu_sibling_map(cpuid);
 	wmb();
 
-	notify_cpu_starting(cpuid);
-
-	/*
-	 * Allow the master to continue.
-	 */
+	/* Allow the master to continue. */
 	cpumask_set_cpu(cpuid, cpu_callin_mask);
 }
 
@@ -227,6 +223,11 @@ static void __cpuinit smp_callin(void)
  */
 notrace static void __cpuinit start_secondary(void *unused)
 {
+	smpboot_start_secondary(unused);
+}
+
+void __cpuinit native_cpu_pre_starting(void *unused)
+{
 	/*
 	 * Don't put *anything* before cpu_init(), SMP booting is too
 	 * fragile that we want to limit the things done here to the
@@ -234,43 +235,31 @@ notrace static void __cpuinit start_secondary(void *unused)
 	 */
 	cpu_init();
 	x86_cpuinit.early_percpu_clock_init();
-	preempt_disable();
 	smp_callin();
+}
 
+void __cpuinit native_cpu_pre_online(void *unused)
+{
 #ifdef CONFIG_X86_32
 	/* switch away from the initial page table */
 	load_cr3(swapper_pg_dir);
 	__flush_tlb_all();
 #endif
 
-	/* otherwise gcc will move up smp_processor_id before the cpu_init */
-	barrier();
 	/*
 	 * Check TSC synchronization with the BP:
 	 */
 	check_tsc_sync_target();
+}
 
-	/*
-	 * We need to hold vector_lock so there the set of online cpus
-	 * does not change while we are assigning vectors to cpus.  Holding
-	 * this lock ensures we don't half assign or remove an irq from a cpu.
-	 */
-	lock_vector_lock();
-	set_cpu_online(smp_processor_id(), true);
-	unlock_vector_lock();
-	per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
+void __cpuinit native_cpu_post_online(void *unused)
+{
 	x86_platform.nmi_init();
 
-	/* enable local interrupts */
-	local_irq_enable();
-
 	/* to prevent fake stack check failure in clock setup */
 	boot_init_stack_canary();
 
 	x86_cpuinit.setup_percpu_clockev();
-
-	wmb();
-	cpu_idle();
 }
 
 /*


  parent reply	other threads:[~2012-06-01  9:12 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 ` [PATCH 01/27] smpboot: Provide a generic method to boot secondary processors Srivatsa S. Bhat
2012-06-01 12:09   ` 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 ` Srivatsa S. Bhat [this message]
2012-06-04 14:29   ` [PATCH 07/27] x86, " 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=20120601091148.31979.53116.stgit@srivatsabhat.in.ibm.com \
    --to=srivatsa.bhat@linux.vnet.ibm.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@linux-foundation.org \
    --cc=dzickus@redhat.com \
    --cc=hpa@zytor.com \
    --cc=joerg.roedel@amd.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mingo@redhat.com \
    --cc=nagananda.chumbalkar@hp.com \
    --cc=nikunj@linux.vnet.ibm.com \
    --cc=paul.gortmaker@windriver.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=x86@kernel.org \
    --cc=yinghai@kernel.org \
    --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).