From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
To: David Vrabel <david.vrabel@citrix.com>
Cc: xen-devel@lists.xenproject.org,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [PATCH 1/2] xen: refactor suspend pre/post hooks
Date: Thu, 08 May 2014 10:05:31 -0400 [thread overview]
Message-ID: <536B8F2B.8020508@oracle.com> (raw)
In-Reply-To: <1399543764-29054-2-git-send-email-david.vrabel@citrix.com>
On 05/08/2014 06:09 AM, David Vrabel wrote:
> 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: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> ---
> arch/x86/xen/suspend.c | 23 ++++++++++++++++++++---
> arch/x86/xen/xen-ops.h | 2 ++
> drivers/xen/manage.c | 45 +++++++--------------------------------------
> include/xen/xen-ops.h | 4 ----
> 4 files changed, 29 insertions(+), 45 deletions(-)
>
> diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c
> index 45329c8..c4df9db 100644
> --- a/arch/x86/xen/suspend.c
> +++ b/arch/x86/xen/suspend.c
> @@ -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)
> diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
> index 1cb6f4c..c834d4b 100644
> --- a/arch/x86/xen/xen-ops.h
> +++ b/arch/x86/xen/xen-ops.h
> @@ -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);
> diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
> index 32f9236..c3667b2 100644
> --- a/drivers/xen/manage.c
> +++ b/drivers/xen/manage.c
> @@ -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);
> diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h
> index 2cf4717..0b3149e 100644
> --- a/include/xen/xen-ops.h
> +++ b/include/xen/xen-ops.h
> @@ -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);
next prev parent reply other threads:[~2014-05-08 14:01 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-08 10:09 [PATCH 0/2] arm, arm64/xen: preliminary suspend support David Vrabel
2014-05-08 10:09 ` [PATCH 1/2] xen: refactor suspend pre/post hooks David Vrabel
2014-05-08 14:05 ` Boris Ostrovsky [this message]
2014-05-08 10:09 ` [PATCH 2/2] arm, arm64/xen: introduce HYPERVISOR_suspend David Vrabel
2014-05-08 15:54 ` Stefano Stabellini
2014-05-12 16:50 ` David Vrabel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=536B8F2B.8020508@oracle.com \
--to=boris.ostrovsky@oracle.com \
--cc=david.vrabel@citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.