xen: add xen_arch_resume()/xen_timer_resume hook for ia64 support
authorIsaku Yamahata <yamahata@valinux.co.jp>
Tue, 8 Jul 2008 22:06:32 +0000 (15:06 -0700)
committerIngo Molnar <mingo@elte.hu>
Wed, 16 Jul 2008 08:55:50 +0000 (10:55 +0200)
add xen_timer_resume() hook.

Timer resume should be done after event channel is resumed.
add xen_arch_resume() hook when ipi becomes usable after resume.
After resume, some cpu specific resource must be reinitialized
on ia64 that can't be set by another cpu.

However available hooks is run once on only one cpu so that ipi has
to be used.

During stop_machine_run() ipi can't be used because interrupt is masked.
So add another hook after stop_machine_run().
Another approach might be use resume hook which is run by
device_resume(). However device_resume() may be executed on
suspend error recovery path.

So it is necessary to determine whether it is executed on real resume path
or error recovery path.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Cc: Stephen Tweedie <sct@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/xen/suspend.c
arch/x86/xen/xen-ops.h
drivers/xen/manage.c
include/xen/xen-ops.h

index 251669a932d4c440f39cc361374ddf59816d0676..2a234db5949beb39e21e5fa09089c3740d802940 100644 (file)
@@ -38,8 +38,11 @@ void xen_post_suspend(int suspend_cancelled)
                xen_cpu_initialized_map = cpu_online_map;
 #endif
                xen_vcpu_restore();
-               xen_timer_resume();
        }
 
 }
 
+void xen_arch_resume(void)
+{
+       /* nothing */
+}
index 6f4b1045c1c20768015d1fc7987f9ee3a73b4475..77354d204257f171c74a8b3c6cd7ba9376fb19bc 100644 (file)
@@ -37,7 +37,6 @@ void __init xen_time_init(void);
 unsigned long xen_get_wallclock(void);
 int xen_set_wallclock(unsigned long time);
 unsigned long long xen_sched_clock(void);
-void xen_timer_resume(void);
 
 irqreturn_t xen_debug_interrupt(int irq, void *dev_id);
 
index 5b546e365f007d028843eea0ee84e77a0def1f58..2bb268e4ac56a242033a69e1dec42a4f4c646b0f 100644 (file)
@@ -68,6 +68,7 @@ static int xen_suspend(void *data)
        if (!*cancelled) {
                xen_irq_resume();
                xen_console_resume();
+               xen_timer_resume();
        }
 
        return 0;
@@ -107,9 +108,10 @@ static void do_suspend(void)
                goto out;
        }
 
-       if (!cancelled)
+       if (!cancelled) {
+               xen_arch_resume();
                xenbus_resume();
-       else
+       else
                xenbus_suspend_cancel();
 
        device_resume();
index a706d6a7896016c8698698ad1472a26b7551cab9..883a21bba24bac3991e79533f586679de6926a4a 100644 (file)
@@ -11,4 +11,7 @@ void xen_post_suspend(int suspend_cancelled);
 void xen_mm_pin_all(void);
 void xen_mm_unpin_all(void);
 
+void xen_timer_resume(void);
+void xen_arch_resume(void);
+
 #endif /* INCLUDE_XEN_OPS_H */