mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andi Kleen <ak@suse.de>
To: Jeremy Fitzhardinge <jeremy@goop.org>, Andi Kleen <ak@suse.de>,
	Ingo Molnar <mingo@elte.hu>,
	James Bottomley <James.Bottomley@HansenPartnership.com>,
	patches@x86-64.org, linux-kernel@vger.kernel.org
Subject: [PATCH] [1/26] i386: Add smp_ops interface
Date: Mon, 30 Apr 2007 01:46:09 +0200 (CEST)	[thread overview]
Message-ID: <20070429234609.BE731151C5@wotan.suse.de> (raw)
In-Reply-To: <20070430146.588463000@suse.de>


From: Jeremy Fitzhardinge <jeremy@goop.org>
Subject: Add smp_ops interface

Add a smp_ops interface.  This abstracts the API defined by
<linux/smp.h> for use within arch/i386.  The primary intent is that it
be used by a paravirtualizing hypervisor to implement SMP, but it
could also be used by non-APIC-using sub-architectures.

This is related to CONFIG_PARAVIRT, but is implemented unconditionally
since it is simpler that way and not a highly performance-sensitive
interface.

Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: Andi Kleen <ak@suse.de>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>

---
 arch/i386/kernel/smp.c     |   21 +++++++++++++----
 arch/i386/kernel/smpboot.c |    8 +++---
 include/asm-i386/smp.h     |   53 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 73 insertions(+), 9 deletions(-)

===================================================================
Index: linux/arch/i386/kernel/smp.c
===================================================================
--- linux.orig/arch/i386/kernel/smp.c
+++ linux/arch/i386/kernel/smp.c
@@ -483,7 +483,7 @@ void flush_tlb_all(void)
  * it goes straight through and wastes no time serializing
  * anything. Worst case is that we lose a reschedule ...
  */
-void smp_send_reschedule(int cpu)
+void native_smp_send_reschedule(int cpu)
 {
 	WARN_ON(cpu_is_offline(cpu));
 	send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
@@ -560,9 +560,9 @@ static void __smp_call_function(void (*f
  * You must not call this function with disabled interrupts or from a
  * hardware interrupt handler or from a bottom half handler.
  */
-int smp_call_function_mask(cpumask_t mask,
-			   void (*func)(void *), void *info,
-			   int wait)
+int native_smp_call_function_mask(cpumask_t mask,
+				  void (*func)(void *), void *info,
+				  int wait)
 {
 	struct call_data_struct data;
 	cpumask_t allbutself;
@@ -681,7 +681,7 @@ static void stop_this_cpu (void * dummy)
  * this function calls the 'stop' function on all other CPUs in the system.
  */
 
-void smp_send_stop(void)
+void native_smp_send_stop(void)
 {
 	/* Don't deadlock on the call lock in panic */
 	int nolock = !spin_trylock(&call_lock);
@@ -757,3 +757,14 @@ int safe_smp_processor_id(void)
 
 	return cpuid >= 0 ? cpuid : 0;
 }
+
+struct smp_ops smp_ops = {
+	.smp_prepare_boot_cpu = native_smp_prepare_boot_cpu,
+	.smp_prepare_cpus = native_smp_prepare_cpus,
+	.cpu_up = native_cpu_up,
+	.smp_cpus_done = native_smp_cpus_done,
+
+	.smp_send_stop = native_smp_send_stop,
+	.smp_send_reschedule = native_smp_send_reschedule,
+	.smp_call_function_mask = native_smp_call_function_mask,
+};
Index: linux/arch/i386/kernel/smpboot.c
===================================================================
--- linux.orig/arch/i386/kernel/smpboot.c
+++ linux/arch/i386/kernel/smpboot.c
@@ -1171,7 +1171,7 @@ static void __init smp_boot_cpus(unsigne
 
 /* These are wrappers to interface to the new boot process.  Someone
    who understands all this stuff should rewrite it properly. --RR 15/Jul/02 */
-void __init smp_prepare_cpus(unsigned int max_cpus)
+void __init native_smp_prepare_cpus(unsigned int max_cpus)
 {
 	smp_commenced_mask = cpumask_of_cpu(0);
 	cpu_callin_map = cpumask_of_cpu(0);
@@ -1191,7 +1191,7 @@ static inline void switch_to_new_gdt(voi
 	asm volatile ("mov %0, %%fs" : : "r" (__KERNEL_PDA) : "memory");
 }
 
-void __init smp_prepare_boot_cpu(void)
+void __init native_smp_prepare_boot_cpu(void)
 {
 	unsigned int cpu = smp_processor_id();
 
@@ -1292,7 +1292,7 @@ void __cpu_die(unsigned int cpu)
 }
 #endif /* CONFIG_HOTPLUG_CPU */
 
-int __cpuinit __cpu_up(unsigned int cpu)
+int __cpuinit native_cpu_up(unsigned int cpu)
 {
 	unsigned long flags;
 #ifdef CONFIG_HOTPLUG_CPU
@@ -1337,7 +1337,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
 	return 0;
 }
 
-void __init smp_cpus_done(unsigned int max_cpus)
+void __init native_smp_cpus_done(unsigned int max_cpus)
 {
 #ifdef CONFIG_X86_IO_APIC
 	setup_ioapic_dest();
Index: linux/include/asm-i386/smp.h
===================================================================
--- linux.orig/include/asm-i386/smp.h
+++ linux/include/asm-i386/smp.h
@@ -49,6 +49,59 @@ extern void cpu_exit_clear(void);
 extern void cpu_uninit(void);
 #endif
 
+struct smp_ops
+{
+	void (*smp_prepare_boot_cpu)(void);
+	void (*smp_prepare_cpus)(unsigned max_cpus);
+	int (*cpu_up)(unsigned cpu);
+	void (*smp_cpus_done)(unsigned max_cpus);
+
+	void (*smp_send_stop)(void);
+	void (*smp_send_reschedule)(int cpu);
+	int (*smp_call_function_mask)(cpumask_t mask,
+				      void (*func)(void *info), void *info,
+				      int wait);
+};
+
+extern struct smp_ops smp_ops;
+
+static inline void smp_prepare_boot_cpu(void)
+{
+	smp_ops.smp_prepare_boot_cpu();
+}
+static inline void smp_prepare_cpus(unsigned int max_cpus)
+{
+	smp_ops.smp_prepare_cpus(max_cpus);
+}
+static inline int __cpu_up(unsigned int cpu)
+{
+	return smp_ops.cpu_up(cpu);
+}
+static inline void smp_cpus_done(unsigned int max_cpus)
+{
+	smp_ops.smp_cpus_done(max_cpus);
+}
+
+static inline void smp_send_stop(void)
+{
+	smp_ops.smp_send_stop();
+}
+static inline void smp_send_reschedule(int cpu)
+{
+	smp_ops.smp_send_reschedule(cpu);
+}
+static inline int smp_call_function_mask(cpumask_t mask,
+					 void (*func) (void *info), void *info,
+					 int wait)
+{
+	return smp_ops.smp_call_function_mask(mask, func, info, wait);
+}
+
+void native_smp_prepare_boot_cpu(void);
+void native_smp_prepare_cpus(unsigned int max_cpus);
+int native_cpu_up(unsigned int cpunum);
+void native_smp_cpus_done(unsigned int max_cpus);
+
 #ifndef CONFIG_PARAVIRT
 #define startup_ipi_hook(phys_apicid, start_eip, start_esp) 		\
 do { } while (0)

  reply	other threads:[~2007-04-29 23:51 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-29 23:46 [PATCH] [0/26] x86 candidate patches for review IV: more misc patches Andi Kleen
2007-04-29 23:46 ` Andi Kleen [this message]
2007-04-29 23:46 ` [PATCH] [2/26] i386: Add machine_ops interface to abstract halting and rebooting Andi Kleen
2007-04-29 23:46 ` [PATCH] [4/26] i386: Remove unneeded externs in nmi.c Andi Kleen
2007-04-29 23:46 ` [PATCH] [6/26] x86: fix amd64-agp aperture validation Andi Kleen
2007-04-29 23:46 ` [PATCH] [7/26] x86_64: Use X86_EFLAGS_IF in x86-64/irqflags.h Andi Kleen
2007-04-29 23:46 ` [PATCH] [8/26] x86_64: fix arithmetic in comment Andi Kleen
2007-04-29 23:46 ` [PATCH] [9/26] x86_64: Fix vmalloc_32 to really allocate <4GB on 64bit platforms Andi Kleen
2007-04-30  5:01   ` Borislav Petkov
2007-04-30  5:49     ` Borislav Petkov
2007-04-30  8:59     ` Andi Kleen
2007-04-29 23:46 ` [PATCH] [10/26] i386: Clean up asm-i386/bugs.h Andi Kleen
2007-04-29 23:46 ` [PATCH] [11/26] i386: clean up identify_cpu Andi Kleen
2007-04-29 23:46 ` [PATCH] [14/26] x86_64: Clean up asm-x86_64/bugs.h Andi Kleen
2007-04-29 23:46 ` [PATCH] [15/26] x86: Don't use MWAIT on AMD Family 10 Andi Kleen
2007-04-29 23:46 ` [PATCH] [16/26] i386: Enable machine check for " Andi Kleen
2007-04-29 23:46 ` [PATCH] [17/26] i386: Use menuconfig objects - APM Andi Kleen
2007-04-29 23:46 ` [PATCH] [18/26] i386: Update smp_call_function* comments Andi Kleen
2007-04-29 23:46 ` [PATCH] [19/26] i386: Enable bank 0 on non K7 Athlon Andi Kleen
2007-04-30  0:09   ` Dave Jones
2007-04-29 23:46 ` [PATCH] [20/26] x86: Allow percpu variables to be page-aligned Andi Kleen
2007-04-29 23:46 ` [PATCH] [21/26] x86: Clean up x86 control register and MSR macros (corrected) Andi Kleen
2007-04-29 23:46 ` [PATCH] [22/26] i386: Remove smp_alt_instructions Andi Kleen
2007-04-29 23:46 ` [PATCH] [23/26] i386: Allow boot-time disable of SMP altinstructions Andi Kleen
2007-04-29 23:46 ` [PATCH] [24/26] x86_64: Fix x86_64 compilation with DEBUG_SIG on Andi Kleen
2007-04-29 23:46 ` [PATCH] [25/26] x86_64: x86-64 system crashes when no memory populating Node 0 Andi Kleen
2007-04-29 23:46 ` [PATCH] [26/26] i386: i386 separate hardware-defined TSS from Linux additions Andi Kleen

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=20070429234609.BE731151C5@wotan.suse.de \
    --to=ak@suse.de \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=jeremy@goop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=patches@x86-64.org \
    /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

all inboxes | Powered by JetHome®