[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Define halt() and safe_halt() properly for Linux-on-Xen. Remove duplicated
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |