# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID e58e04589d11429132d8abe12d19e64484970f62
# Parent 6a34629933201ac88dd7b02472b7303b05744d3e
Define halt() and safe_halt() properly for Linux-on-Xen. Remove duplicated
code for initial bringup of secondary VCPUs.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c | 14 +------
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c | 20 +++++++++-
linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c | 15 ++-----
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c | 9 +++-
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/system.h | 4 +-
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h | 4 +-
linux-2.6-xen-sparse/include/xen/cpu_hotplug.h | 2 +
7 files changed, 38 insertions(+), 30 deletions(-)
diff -r 6a3462993320 -r e58e04589d11
linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c Tue May 30
12:37:49 2006 +0100
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c Tue May 30
13:29:29 2006 +0100
@@ -55,6 +55,7 @@
#include <xen/interface/physdev.h>
#include <xen/interface/vcpu.h>
+#include <xen/cpu_hotplug.h>
#include <linux/err.h>
@@ -101,8 +102,6 @@ EXPORT_SYMBOL(enable_hlt);
EXPORT_SYMBOL(enable_hlt);
/* XXX XEN doesn't use default_idle(), poll_idle(). Use xen_idle() instead. */
-extern void stop_hz_timer(void);
-extern void start_hz_timer(void);
void xen_idle(void)
{
local_irq_disable();
@@ -112,10 +111,7 @@ void xen_idle(void)
else {
clear_thread_flag(TIF_POLLING_NRFLAG);
smp_mb__after_clear_bit();
- stop_hz_timer();
- /* Blocking includes an implicit local_irq_enable(). */
- HYPERVISOR_block();
- start_hz_timer();
+ safe_halt();
set_thread_flag(TIF_POLLING_NRFLAG);
}
}
@@ -132,11 +128,7 @@ static inline void play_dead(void)
cpu_clear(smp_processor_id(), cpu_initialized);
preempt_enable_no_resched();
HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
- /* Same as drivers/xen/core/smpboot.c:cpu_bringup(). */
- cpu_init();
- touch_softlockup_watchdog();
- preempt_disable();
- local_irq_enable();
+ cpu_bringup();
}
#else
static inline void play_dead(void)
diff -r 6a3462993320 -r e58e04589d11
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Tue May 30 12:37:49
2006 +0100
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Tue May 30 13:29:29
2006 +0100
@@ -973,7 +973,7 @@ EXPORT_SYMBOL(jiffies_to_st);
* stop_hz_timer / start_hz_timer - enter/exit 'tickless mode' on an idle cpu
* These functions are based on implementations from arch/s390/kernel/time.c
*/
-void stop_hz_timer(void)
+static void stop_hz_timer(void)
{
unsigned int cpu = smp_processor_id();
unsigned long j;
@@ -993,10 +993,26 @@ void stop_hz_timer(void)
BUG_ON(HYPERVISOR_set_timer_op(jiffies_to_st(j)) != 0);
}
-void start_hz_timer(void)
+static void start_hz_timer(void)
{
cpu_clear(smp_processor_id(), nohz_cpu_mask);
}
+
+void safe_halt(void)
+{
+ stop_hz_timer();
+ /* Blocking includes an implicit local_irq_enable(). */
+ HYPERVISOR_block();
+ start_hz_timer();
+}
+EXPORT_SYMBOL(safe_halt);
+
+void halt(void)
+{
+ if (irqs_disabled())
+ HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
+}
+EXPORT_SYMBOL(halt);
/* No locking required. We are only CPU running, and interrupts are off. */
void time_resume(void)
diff -r 6a3462993320 -r e58e04589d11
linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c Tue May 30
12:37:49 2006 +0100
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c Tue May 30
13:29:29 2006 +0100
@@ -60,6 +60,8 @@
#include <asm/ia32.h>
#include <asm/idle.h>
+#include <xen/cpu_hotplug.h>
+
asmlinkage extern void ret_from_fork(void);
unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED;
@@ -118,8 +120,6 @@ void exit_idle(void)
}
/* XXX XEN doesn't use default_idle(), poll_idle(). Use xen_idle() instead. */
-extern void stop_hz_timer(void);
-extern void start_hz_timer(void);
void xen_idle(void)
{
local_irq_disable();
@@ -129,10 +129,7 @@ void xen_idle(void)
else {
clear_thread_flag(TIF_POLLING_NRFLAG);
smp_mb__after_clear_bit();
- stop_hz_timer();
- /* Blocking includes an implicit local_irq_enable(). */
- HYPERVISOR_block();
- start_hz_timer();
+ safe_halt();
set_thread_flag(TIF_POLLING_NRFLAG);
}
}
@@ -145,11 +142,7 @@ static inline void play_dead(void)
cpu_clear(smp_processor_id(), cpu_initialized);
preempt_enable_no_resched();
HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
- /* Same as drivers/xen/core/smpboot.c:cpu_bringup(). */
- cpu_init();
- touch_softlockup_watchdog();
- preempt_disable();
- local_irq_enable();
+ cpu_bringup();
}
#else
static inline void play_dead(void)
diff -r 6a3462993320 -r e58e04589d11
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c Tue May 30 12:37:49
2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c Tue May 30 13:29:29
2006 +0100
@@ -150,12 +150,17 @@ static void xen_smp_intr_exit(unsigned i
}
#endif
-static void cpu_bringup(void)
+void cpu_bringup(void)
{
cpu_init();
touch_softlockup_watchdog();
preempt_disable();
local_irq_enable();
+}
+
+static void cpu_bringup_and_idle(void)
+{
+ cpu_bringup();
cpu_idle();
}
@@ -180,7 +185,7 @@ void cpu_initialize_context(unsigned int
ctxt.user_regs.fs = 0;
ctxt.user_regs.gs = 0;
ctxt.user_regs.ss = __KERNEL_DS;
- ctxt.user_regs.eip = (unsigned long)cpu_bringup;
+ ctxt.user_regs.eip = (unsigned long)cpu_bringup_and_idle;
ctxt.user_regs.eflags = X86_EFLAGS_IF | 0x1000; /* IOPL_RING1 */
memset(&ctxt.fpu_ctxt, 0, sizeof(ctxt.fpu_ctxt));
diff -r 6a3462993320 -r e58e04589d11
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/system.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/system.h Tue May
30 12:37:49 2006 +0100
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/system.h Tue May
30 13:29:29 2006 +0100
@@ -625,8 +625,8 @@ do {
\
preempt_enable_no_resched(); \
} while (0)
-#define safe_halt() ((void)0)
-#define halt() ((void)0)
+void safe_halt(void);
+void halt(void);
#define __save_and_cli(x) \
do { \
diff -r 6a3462993320 -r e58e04589d11
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h Tue May
30 12:37:49 2006 +0100
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h Tue May
30 13:29:29 2006 +0100
@@ -424,8 +424,8 @@ do {
\
preempt_enable_no_resched(); \
___x; })
-#define safe_halt() ((void)0)
-#define halt() ((void)0)
+void safe_halt(void);
+void halt(void);
void cpu_idle_wait(void);
diff -r 6a3462993320 -r e58e04589d11
linux-2.6-xen-sparse/include/xen/cpu_hotplug.h
--- a/linux-2.6-xen-sparse/include/xen/cpu_hotplug.h Tue May 30 12:37:49
2006 +0100
+++ b/linux-2.6-xen-sparse/include/xen/cpu_hotplug.h Tue May 30 13:29:29
2006 +0100
@@ -17,6 +17,8 @@ void init_xenbus_allowed_cpumask(void);
void init_xenbus_allowed_cpumask(void);
int smp_suspend(void);
void smp_resume(void);
+
+void cpu_bringup(void);
#else /* !defined(CONFIG_HOTPLUG_CPU) */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|