static int xen_suspend(void *data) { struct suspend_info *si = data; int err; BUG_ON(!irqs_disabled()); err = syscore_suspend(); if (err) { pr_err("%s: system core suspend failed: %d\n", __func__, err); return err; } gnttab_suspend(); xen_arch_pre_suspend(); /* * This hypercall returns 1 if suspend was cancelled * or the domain was merely checkpointed, and 0 if it * is resuming in a new domain. */ si->cancelled = HYPERVISOR_suspend(xen_pv_domain() ? virt_to_mfn(xen_start_info) : 0); xen_arch_post_suspend(si->cancelled); gnttab_resume(); if (!si->cancelled) { xen_irq_resume(); xen_console_resume(); xen_timer_resume(); } syscore_resume(); return 0; }
static void xen_pre_suspend(void) { xen_mm_pin_all(); gnttab_suspend(); xen_arch_pre_suspend(); }