x86/xen: split suspend.c for PV and PVHVM guests
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 14 Mar 2017 17:35:49 +0000 (18:35 +0100)
committerJuergen Gross <jgross@suse.com>
Tue, 2 May 2017 09:09:17 +0000 (11:09 +0200)
Slit the code in suspend.c into suspend_pv.c and suspend_hvm.c.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
arch/x86/xen/Makefile
arch/x86/xen/suspend.c
arch/x86/xen/suspend_hvm.c [new file with mode: 0644]
arch/x86/xen/suspend_pv.c [new file with mode: 0644]
arch/x86/xen/xen-ops.h

index 8da1ca92e604cb3ec599e21bfe5722105a5c8ace..cf8d6c5e36d898e5be21e8816f6b44d79e46202e 100644 (file)
@@ -15,7 +15,8 @@ obj-y         := enlighten.o setup.o multicalls.o mmu.o irq.o \
                        grant-table.o suspend.o platform-pci-unplug.o \
                        p2m.o apic.o pmu.o enlighten_pv.o mmu_pv.o
 
-obj-$(CONFIG_XEN_PVHVM)                += enlighten_hvm.o mmu_hvm.o
+obj-$(CONFIG_XEN_PVHVM)                += enlighten_hvm.o mmu_hvm.o suspend_hvm.o
+obj-$(CONFIG_XEN_PV)                   += suspend_pv.o
 obj-$(CONFIG_XEN_PVH)                  += enlighten_pvh.o
 
 obj-$(CONFIG_EVENT_TRACING) += trace.o
index 7f664c416faf55672f604c5b688f6b6ef32102a8..d6b1680693a9b7114e7d87e59b52d871e28a6b27 100644 (file)
 #include "mmu.h"
 #include "pmu.h"
 
-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);
-
-       BUG_ON(!irqs_disabled());
-
-       HYPERVISOR_shared_info = &xen_dummy_shared_info;
-       if (HYPERVISOR_update_va_mapping(fix_to_virt(FIX_PARAVIRT_BOOTMAP),
-                                        __pte_ma(0), 0))
-               BUG();
-}
-
-static void xen_hvm_post_suspend(int suspend_cancelled)
-{
-#ifdef CONFIG_XEN_PVHVM
-       int cpu;
-       if (!suspend_cancelled)
-           xen_hvm_init_shared_info();
-       xen_callback_vector();
-       xen_unplug_emulated_devices();
-       if (xen_feature(XENFEAT_hvm_safe_pvclock)) {
-               for_each_online_cpu(cpu) {
-                       xen_setup_runstate_info(cpu);
-               }
-       }
-#endif
-}
-
-static void xen_pv_post_suspend(int suspend_cancelled)
-{
-       xen_build_mfn_list_list();
-
-       xen_setup_shared_info();
-
-       if (suspend_cancelled) {
-               xen_start_info->store_mfn =
-                       pfn_to_mfn(xen_start_info->store_mfn);
-               xen_start_info->console.domU.mfn =
-                       pfn_to_mfn(xen_start_info->console.domU.mfn);
-       } else {
-#ifdef CONFIG_SMP
-               BUG_ON(xen_cpu_initialized_map == NULL);
-               cpumask_copy(xen_cpu_initialized_map, cpu_online_mask);
-#endif
-               xen_vcpu_restore();
-       }
-
-       xen_mm_unpin_all();
-}
-
 void xen_arch_pre_suspend(void)
 {
        if (xen_pv_domain())
diff --git a/arch/x86/xen/suspend_hvm.c b/arch/x86/xen/suspend_hvm.c
new file mode 100644 (file)
index 0000000..01afcad
--- /dev/null
@@ -0,0 +1,22 @@
+#include <linux/types.h>
+
+#include <xen/xen.h>
+#include <xen/features.h>
+#include <xen/interface/features.h>
+
+#include "xen-ops.h"
+
+void xen_hvm_post_suspend(int suspend_cancelled)
+{
+       int cpu;
+
+       if (!suspend_cancelled)
+               xen_hvm_init_shared_info();
+       xen_callback_vector();
+       xen_unplug_emulated_devices();
+       if (xen_feature(XENFEAT_hvm_safe_pvclock)) {
+               for_each_online_cpu(cpu) {
+                       xen_setup_runstate_info(cpu);
+               }
+       }
+}
diff --git a/arch/x86/xen/suspend_pv.c b/arch/x86/xen/suspend_pv.c
new file mode 100644 (file)
index 0000000..3abe4f0
--- /dev/null
@@ -0,0 +1,46 @@
+#include <linux/types.h>
+
+#include <asm/fixmap.h>
+
+#include <asm/xen/hypercall.h>
+#include <asm/xen/page.h>
+
+#include "xen-ops.h"
+
+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);
+
+       BUG_ON(!irqs_disabled());
+
+       HYPERVISOR_shared_info = &xen_dummy_shared_info;
+       if (HYPERVISOR_update_va_mapping(fix_to_virt(FIX_PARAVIRT_BOOTMAP),
+                                        __pte_ma(0), 0))
+               BUG();
+}
+
+void xen_pv_post_suspend(int suspend_cancelled)
+{
+       xen_build_mfn_list_list();
+
+       xen_setup_shared_info();
+
+       if (suspend_cancelled) {
+               xen_start_info->store_mfn =
+                       pfn_to_mfn(xen_start_info->store_mfn);
+               xen_start_info->console.domU.mfn =
+                       pfn_to_mfn(xen_start_info->console.domU.mfn);
+       } else {
+#ifdef CONFIG_SMP
+               BUG_ON(xen_cpu_initialized_map == NULL);
+               cpumask_copy(xen_cpu_initialized_map, cpu_online_mask);
+#endif
+               xen_vcpu_restore();
+       }
+
+       xen_mm_unpin_all();
+}
index 0dd8dd25a14b35881a7eebdd2d466ae9d3e5af8e..d939e3e6e89fe39a6e0c592a41e4fe23e104f74c 100644 (file)
@@ -155,5 +155,18 @@ void xen_pin_vcpu(int cpu);
 
 void xen_reboot(int reason);
 void xen_emergency_restart(void);
+#ifdef CONFIG_XEN_PV
+void xen_pv_pre_suspend(void);
+void xen_pv_post_suspend(int suspend_cancelled);
+#else
+static inline void xen_pv_pre_suspend(void) {}
+static inline void xen_pv_post_suspend(int suspend_cancelled) {}
+#endif
+
+#ifdef CONFIG_XEN_PVHVM
+void xen_hvm_post_suspend(int suspend_cancelled);
+#else
+static inline void xen_hvm_post_suspend(int suspend_cancelled) {}
+#endif
 
 #endif /* XEN_OPS_H */