Message ID | 20200702182205.GA3531@dev-dsk-anchalag-2a-9c2d1d96.us-west-2.amazon.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix PM hibernation in Xen guests | expand |
Hi Anchal, Thank you for the patch! Yet something to improve: [auto build test ERROR on tip/auto-latest] [also build test ERROR on linus/master v5.8-rc3 next-20200703] [cannot apply to xen-tip/linux-next tip/irq/core] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Anchal-Agarwal/Fix-PM-hibernation-in-Xen-guests/20200703-022819 base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 7e44a91e0445a854af5d34ca0f5baceccd518e73 config: x86_64-randconfig-m001-20200705 (attached as .config) compiler: gcc-9 (Debian 9.3.0-14) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): ld: arch/x86/xen/suspend.o: in function `xen_syscore_resume': >> arch/x86/xen/suspend.c:111: undefined reference to `xen_hvm_map_shared_info' vim +111 arch/x86/xen/suspend.c 107 108 static void xen_syscore_resume(void) 109 { 110 /* No need to setup vcpu_info as it's already moved off */ > 111 xen_hvm_map_shared_info(); 112 113 pvclock_resume(); 114 115 gnttab_resume(); 116 } 117 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi, On 02/07/2020 19:22, Anchal Agarwal wrote: > diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h > index 2521d6a306cd..9fa8a4082d68 100644 > --- a/include/xen/xen-ops.h > +++ b/include/xen/xen-ops.h > @@ -41,6 +41,8 @@ u64 xen_steal_clock(int cpu); > int xen_setup_shutdown_event(void); > > bool xen_is_xen_suspend(void); > +void xen_setup_syscore_ops(void); The function is only implemented and used by x86. So shouldn't this be declared in an x86 header? Cheers,
diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c index d91099928746..bd6bf6eb2052 100644 --- a/arch/x86/xen/enlighten_hvm.c +++ b/arch/x86/xen/enlighten_hvm.c @@ -215,6 +215,7 @@ static void __init xen_hvm_guest_init(void) if (xen_feature(XENFEAT_hvm_callback_vector)) xen_have_vector_callback = 1; + xen_setup_syscore_ops(); xen_hvm_smp_init(); WARN_ON(xen_cpuhp_setup(xen_cpu_up_prepare_hvm, xen_cpu_dead_hvm)); xen_unplug_emulated_devices(); diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c index 1d83152c761b..e8c924e93fc5 100644 --- a/arch/x86/xen/suspend.c +++ b/arch/x86/xen/suspend.c @@ -2,17 +2,22 @@ #include <linux/types.h> #include <linux/tick.h> #include <linux/percpu-defs.h> +#include <linux/syscore_ops.h> +#include <linux/kernel_stat.h> #include <xen/xen.h> #include <xen/interface/xen.h> +#include <xen/interface/memory.h> #include <xen/grant_table.h> #include <xen/events.h> +#include <xen/xen-ops.h> #include <asm/cpufeatures.h> #include <asm/msr-index.h> #include <asm/xen/hypercall.h> #include <asm/xen/page.h> #include <asm/fixmap.h> +#include <asm/pvclock.h> #include "xen-ops.h" #include "mmu.h" @@ -82,3 +87,45 @@ void xen_arch_suspend(void) on_each_cpu(xen_vcpu_notify_suspend, NULL, 1); } + +static int xen_syscore_suspend(void) +{ + struct xen_remove_from_physmap xrfp; + int ret; + + gnttab_suspend(); + + xrfp.domid = DOMID_SELF; + xrfp.gpfn = __pa(HYPERVISOR_shared_info) >> PAGE_SHIFT; + + ret = HYPERVISOR_memory_op(XENMEM_remove_from_physmap, &xrfp); + if (!ret) + HYPERVISOR_shared_info = &xen_dummy_shared_info; + + return ret; +} + +static void xen_syscore_resume(void) +{ + /* No need to setup vcpu_info as it's already moved off */ + xen_hvm_map_shared_info(); + + pvclock_resume(); + + gnttab_resume(); +} + +/* + * These callbacks will be called with interrupts disabled and when having only + * one CPU online. + */ +static struct syscore_ops xen_hvm_syscore_ops = { + .suspend = xen_syscore_suspend, + .resume = xen_syscore_resume +}; + +void __init xen_setup_syscore_ops(void) +{ + if (xen_hvm_domain()) + register_syscore_ops(&xen_hvm_syscore_ops); +} diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h index 2521d6a306cd..9fa8a4082d68 100644 --- a/include/xen/xen-ops.h +++ b/include/xen/xen-ops.h @@ -41,6 +41,8 @@ u64 xen_steal_clock(int cpu); int xen_setup_shutdown_event(void); bool xen_is_xen_suspend(void); +void xen_setup_syscore_ops(void); + extern unsigned long *xen_contiguous_bitmap; #if defined(CONFIG_XEN_PV) || defined(CONFIG_ARM) || defined(CONFIG_ARM64)