summaryrefslogtreecommitdiffstats
path: root/drivers/xen/manage.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/xen/manage.c')
-rw-r--r--drivers/xen/manage.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
index a6bd2e9ca106..5b7a0a9402e7 100644
--- a/drivers/xen/manage.c
+++ b/drivers/xen/manage.c
@@ -37,6 +37,8 @@ static enum shutdown_state shutting_down = SHUTDOWN_INVALID;
struct suspend_info {
int cancelled;
unsigned long arg; /* extra hypercall argument */
+ void (*pre)(void);
+ void (*post)(int cancelled);
};
static void xen_hvm_post_suspend(int cancelled)
@@ -74,6 +76,9 @@ static int xen_hvm_suspend(void *data)
return err;
}
+ if (si->pre)
+ si->pre();
+
/*
* This hypercall returns 1 if suspend was cancelled
* or the domain was merely checkpointed, and 0 if it
@@ -81,7 +86,8 @@ static int xen_hvm_suspend(void *data)
*/
si->cancelled = HYPERVISOR_suspend(si->arg);
- xen_hvm_post_suspend(si->cancelled);
+ if (si->post)
+ si->post(si->cancelled);
if (!si->cancelled) {
xen_irq_resume();
@@ -108,7 +114,8 @@ static int xen_suspend(void *data)
return err;
}
- xen_pre_suspend();
+ if (si->pre)
+ si->pre();
/*
* This hypercall returns 1 if suspend was cancelled
@@ -117,7 +124,8 @@ static int xen_suspend(void *data)
*/
si->cancelled = HYPERVISOR_suspend(si->arg);
- xen_post_suspend(si->cancelled);
+ if (si->post)
+ si->post(si->cancelled);
if (!si->cancelled) {
xen_irq_resume();
@@ -165,10 +173,15 @@ static void do_suspend(void)
si.cancelled = 1;
- if (xen_hvm_domain())
+ if (xen_hvm_domain()) {
si.arg = 0UL;
- else
+ si.pre = NULL;
+ si.post = &xen_hvm_post_suspend;
+ } else {
si.arg = virt_to_mfn(xen_start_info);
+ si.pre = &xen_pre_suspend;
+ si.post = &xen_post_suspend;
+ }
if (xen_hvm_domain())
err = stop_machine(xen_hvm_suspend, &si, cpumask_of(0));