Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa8532c3 authored by David Vrabel's avatar David Vrabel
Browse files

xen: refactor suspend pre/post hooks



New architectures currently have to provide implementations of 5 different
functions: xen_arch_pre_suspend(), xen_arch_post_suspend(),
xen_arch_hvm_post_suspend(), xen_mm_pin_all(), and xen_mm_unpin_all().

Refactor the suspend code to only require xen_arch_pre_suspend() and
xen_arch_post_suspend().

Signed-off-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
Reviewed-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
parent 9f1d3414
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -12,8 +12,10 @@
#include "xen-ops.h"
#include "mmu.h"

void xen_arch_pre_suspend(void)
static void xen_pv_pre_suspend(void)
{
	xen_mm_pin_all();

	xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn);
	xen_start_info->console.domU.mfn =
		mfn_to_pfn(xen_start_info->console.domU.mfn);
@@ -26,7 +28,7 @@ void xen_arch_pre_suspend(void)
		BUG();
}

void xen_arch_hvm_post_suspend(int suspend_cancelled)
static void xen_hvm_post_suspend(int suspend_cancelled)
{
#ifdef CONFIG_XEN_PVHVM
	int cpu;
@@ -41,7 +43,7 @@ void xen_arch_hvm_post_suspend(int suspend_cancelled)
#endif
}

void xen_arch_post_suspend(int suspend_cancelled)
static void xen_pv_post_suspend(int suspend_cancelled)
{
	xen_build_mfn_list_list();

@@ -60,6 +62,21 @@ void xen_arch_post_suspend(int suspend_cancelled)
		xen_vcpu_restore();
	}

	xen_mm_unpin_all();
}

void xen_arch_pre_suspend(void)
{
    if (xen_pv_domain())
        xen_pv_pre_suspend();
}

void xen_arch_post_suspend(int cancelled)
{
    if (xen_pv_domain())
        xen_pv_post_suspend(cancelled);
    else
        xen_hvm_post_suspend(cancelled);
}

static void xen_vcpu_notify_restore(void *data)
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ void xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn);
void xen_reserve_top(void);
extern unsigned long xen_max_p2m_pfn;

void xen_mm_pin_all(void);
void xen_mm_unpin_all(void);
void xen_set_pat(u64);

char * __init xen_memory_setup(void);
+7 −38
Original line number Diff line number Diff line
@@ -41,9 +41,6 @@ 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 RAW_NOTIFIER_HEAD(xen_resume_notifier);
@@ -61,26 +58,6 @@ void xen_resume_notifier_unregister(struct notifier_block *nb)
EXPORT_SYMBOL_GPL(xen_resume_notifier_unregister);

#ifdef CONFIG_HIBERNATE_CALLBACKS
static void xen_hvm_post_suspend(int cancelled)
{
	xen_arch_hvm_post_suspend(cancelled);
	gnttab_resume();
}

static void xen_pre_suspend(void)
{
	xen_mm_pin_all();
	gnttab_suspend();
	xen_arch_pre_suspend();
}

static void xen_post_suspend(int cancelled)
{
	xen_arch_post_suspend(cancelled);
	gnttab_resume();
	xen_mm_unpin_all();
}

static int xen_suspend(void *data)
{
	struct suspend_info *si = data;
@@ -94,18 +71,20 @@ static int xen_suspend(void *data)
		return err;
	}

	if (si->pre)
		si->pre();
	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(si->arg);
	si->cancelled = HYPERVISOR_suspend(xen_pv_domain()
                                           ? virt_to_mfn(xen_start_info)
                                           : 0);

	if (si->post)
		si->post(si->cancelled);
	xen_arch_post_suspend(si->cancelled);
	gnttab_resume();

	if (!si->cancelled) {
		xen_irq_resume();
@@ -154,16 +133,6 @@ static void do_suspend(void)

	si.cancelled = 1;

	if (xen_hvm_domain()) {
		si.arg = 0UL;
		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;
	}

	err = stop_machine(xen_suspend, &si, cpumask_of(0));

	raw_notifier_call_chain(&xen_resume_notifier, 0, NULL);
+0 −4
Original line number Diff line number Diff line
@@ -9,10 +9,6 @@ DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu);

void xen_arch_pre_suspend(void);
void xen_arch_post_suspend(int suspend_cancelled);
void xen_arch_hvm_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);