summaryrefslogtreecommitdiffstats
path: root/drivers/xen
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2011-02-17 11:04:20 +0000
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>2011-02-25 16:43:13 +0000
commit55fb4acef7089a6d4d93ed8caae6c258d06cfaf7 (patch)
tree6fe5a815cbbdea8a1067b875b2dc730baa2f7c51 /drivers/xen
parent07af38102fc4f260cc5a2418ec833707f53cdf70 (diff)
downloadlinux-55fb4acef7089a6d4d93ed8caae6c258d06cfaf7.tar.bz2
xen: suspend: pull pre/post suspend hooks out into suspend_info
Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'drivers/xen')
-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));