aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2008-05-30 20:33:03 -0400
committerIngo Molnar <mingo@elte.hu>2008-06-02 07:25:44 -0400
commitd07af1f0e3a3e378074fc36322dd7b0e72d9a3e2 (patch)
tree03bdfcd4bc079704eae010e6006301f801c9eefc
parent9c7a794209f8a91f47697c3be20597eb60531e6d (diff)
xen: resume timers on all vcpus
On resume, the vcpu timer modes will not be restored. The timer infrastructure doesn't do this for us, since it assumes the cpus are offline. We can just poke the other vcpus into the right mode directly though. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/xen/suspend.c1
-rw-r--r--arch/x86/xen/time.c13
-rw-r--r--arch/x86/xen/xen-ops.h1
3 files changed, 15 insertions, 0 deletions
diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c
index 7ab10f6b39a5..251669a932d4 100644
--- a/arch/x86/xen/suspend.c
+++ b/arch/x86/xen/suspend.c
@@ -38,6 +38,7 @@ void xen_post_suspend(int suspend_cancelled)
38 xen_cpu_initialized_map = cpu_online_map; 38 xen_cpu_initialized_map = cpu_online_map;
39#endif 39#endif
40 xen_vcpu_restore(); 40 xen_vcpu_restore();
41 xen_timer_resume();
41 } 42 }
42 43
43} 44}
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
index c39e1a5aa241..ea137fb660c0 100644
--- a/arch/x86/xen/time.c
+++ b/arch/x86/xen/time.c
@@ -572,6 +572,19 @@ void xen_setup_cpu_clockevents(void)
572 clockevents_register_device(&__get_cpu_var(xen_clock_events)); 572 clockevents_register_device(&__get_cpu_var(xen_clock_events));
573} 573}
574 574
575void xen_timer_resume(void)
576{
577 int cpu;
578
579 if (xen_clockevent != &xen_vcpuop_clockevent)
580 return;
581
582 for_each_online_cpu(cpu) {
583 if (HYPERVISOR_vcpu_op(VCPUOP_stop_periodic_timer, cpu, NULL))
584 BUG();
585 }
586}
587
575__init void xen_time_init(void) 588__init void xen_time_init(void)
576{ 589{
577 int cpu = smp_processor_id(); 590 int cpu = smp_processor_id();
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
index a457e03e1b21..9a055592a307 100644
--- a/arch/x86/xen/xen-ops.h
+++ b/arch/x86/xen/xen-ops.h
@@ -37,6 +37,7 @@ void __init xen_time_init(void);
37unsigned long xen_get_wallclock(void); 37unsigned long xen_get_wallclock(void);
38int xen_set_wallclock(unsigned long time); 38int xen_set_wallclock(unsigned long time);
39unsigned long long xen_sched_clock(void); 39unsigned long long xen_sched_clock(void);
40void xen_timer_resume(void);
40 41
41irqreturn_t xen_debug_interrupt(int irq, void *dev_id); 42irqreturn_t xen_debug_interrupt(int irq, void *dev_id);
42 43