diff options
Diffstat (limited to 'sys/dev/xen/control/control.c')
-rw-r--r-- | sys/dev/xen/control/control.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/sys/dev/xen/control/control.c b/sys/dev/xen/control/control.c index 60e448a..b8d41ba 100644 --- a/sys/dev/xen/control/control.c +++ b/sys/dev/xen/control/control.c @@ -151,6 +151,7 @@ __FBSDID("$FreeBSD$"); #include <machine/xen/xenvar.h> #include <machine/xen/xenfunc.h> +bool xen_suspend_cancelled; /*--------------------------- Forward Declarations --------------------------*/ /** Function signature for shutdown event handlers. */ typedef void (xctrl_shutdown_handler_t)(void); @@ -341,8 +342,11 @@ xctrl_suspend() #ifdef SMP cpuset_t cpu_suspend_map; #endif - int suspend_cancelled; + EVENTHANDLER_INVOKE(power_suspend_early); + xs_lock(); + stop_all_proc(); + xs_unlock(); EVENTHANDLER_INVOKE(power_suspend); if (smp_started) { @@ -392,16 +396,20 @@ xctrl_suspend() intr_suspend(); xen_hvm_suspend(); - suspend_cancelled = HYPERVISOR_suspend(0); + xen_suspend_cancelled = !!HYPERVISOR_suspend(0); - xen_hvm_resume(suspend_cancelled != 0); - intr_resume(suspend_cancelled != 0); + if (!xen_suspend_cancelled) { + xen_hvm_resume(false); + } + intr_resume(xen_suspend_cancelled != 0); enable_intr(); /* * Reset grant table info. */ - gnttab_resume(); + if (!xen_suspend_cancelled) { + gnttab_resume(); + } #ifdef SMP /* Send an IPI_BITMAP in case there are pending bitmap IPIs. */ @@ -429,6 +437,8 @@ xctrl_suspend() thread_unlock(curthread); } + resume_all_proc(); + EVENTHANDLER_INVOKE(power_resume); if (bootverbose) |