| From cd52e17ea8278f8449b6174a8e5ed439a2e44ffb Mon Sep 17 00:00:00 2001 |
| From: Ian Campbell <ian.campbell@citrix.com> |
| Date: Wed, 19 May 2010 16:19:25 +0100 |
| Subject: xen: ensure timer tick is resumed even on CPU driving the resume |
| |
| From: Ian Campbell <ian.campbell@citrix.com> |
| |
| commit cd52e17ea8278f8449b6174a8e5ed439a2e44ffb upstream. |
| |
| The core suspend/resume code is run from stop_machine on CPU0 but |
| parts of the suspend/resume machinery (including xen_arch_resume) are |
| run on whichever CPU happened to schedule the xenwatch kernel thread. |
| |
| As part of the non-core resume code xen_arch_resume is called in order |
| to restart the timer tick on non-boot processors. The boot processor |
| itself is taken care of by core timekeeping code. |
| |
| xen_arch_resume uses smp_call_function which does not call the given |
| function on the current processor. This means that we can end up with |
| one CPU not receiving timer ticks if the xenwatch thread happened to |
| be scheduled on CPU > 0. |
| |
| Use on_each_cpu instead of smp_call_function to ensure the timer tick |
| is resumed everywhere. |
| |
| Signed-off-by: Ian Campbell <ian.campbell@citrix.com> |
| Acked-by: Jeremy Fitzhardinge <jeremy@goop.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/xen/suspend.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/xen/suspend.c |
| +++ b/arch/x86/xen/suspend.c |
| @@ -60,6 +60,6 @@ static void xen_vcpu_notify_restore(void |
| |
| void xen_arch_resume(void) |
| { |
| - smp_call_function(xen_vcpu_notify_restore, |
| - (void *)CLOCK_EVT_NOTIFY_RESUME, 1); |
| + on_each_cpu(xen_vcpu_notify_restore, |
| + (void *)CLOCK_EVT_NOTIFY_RESUME, 1); |
| } |