x86/xen: split off mmu_hvm.c
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 14 Mar 2017 17:35:47 +0000 (18:35 +0100)
committerJuergen Gross <jgross@suse.com>
Tue, 2 May 2017 09:05:10 +0000 (11:05 +0200)
Move PVHVM related code to mmu_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/mmu.c
arch/x86/xen/mmu_hvm.c [new file with mode: 0644]

index ebf3522..6a95a8b 100644 (file)
@@ -15,7 +15,7 @@ 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
 
-obj-$(CONFIG_XEN_PVHVM)                += enlighten_hvm.o
+obj-$(CONFIG_XEN_PVHVM)                += enlighten_hvm.o mmu_hvm.o
 obj-$(CONFIG_XEN_PVH)                  += enlighten_pvh.o
 
 obj-$(CONFIG_EVENT_TRACING) += trace.o
index f226038..a376f5e 100644 (file)
@@ -2771,80 +2771,6 @@ void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order)
 }
 EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region);
 
-#ifdef CONFIG_XEN_PVHVM
-#ifdef CONFIG_PROC_VMCORE
-/*
- * This function is used in two contexts:
- * - the kdump kernel has to check whether a pfn of the crashed kernel
- *   was a ballooned page. vmcore is using this function to decide
- *   whether to access a pfn of the crashed kernel.
- * - the kexec kernel has to check whether a pfn was ballooned by the
- *   previous kernel. If the pfn is ballooned, handle it properly.
- * Returns 0 if the pfn is not backed by a RAM page, the caller may
- * handle the pfn special in this case.
- */
-static int xen_oldmem_pfn_is_ram(unsigned long pfn)
-{
-       struct xen_hvm_get_mem_type a = {
-               .domid = DOMID_SELF,
-               .pfn = pfn,
-       };
-       int ram;
-
-       if (HYPERVISOR_hvm_op(HVMOP_get_mem_type, &a))
-               return -ENXIO;
-
-       switch (a.mem_type) {
-               case HVMMEM_mmio_dm:
-                       ram = 0;
-                       break;
-               case HVMMEM_ram_rw:
-               case HVMMEM_ram_ro:
-               default:
-                       ram = 1;
-                       break;
-       }
-
-       return ram;
-}
-#endif
-
-static void xen_hvm_exit_mmap(struct mm_struct *mm)
-{
-       struct xen_hvm_pagetable_dying a;
-       int rc;
-
-       a.domid = DOMID_SELF;
-       a.gpa = __pa(mm->pgd);
-       rc = HYPERVISOR_hvm_op(HVMOP_pagetable_dying, &a);
-       WARN_ON_ONCE(rc < 0);
-}
-
-static int is_pagetable_dying_supported(void)
-{
-       struct xen_hvm_pagetable_dying a;
-       int rc = 0;
-
-       a.domid = DOMID_SELF;
-       a.gpa = 0x00;
-       rc = HYPERVISOR_hvm_op(HVMOP_pagetable_dying, &a);
-       if (rc < 0) {
-               printk(KERN_DEBUG "HVMOP_pagetable_dying not supported\n");
-               return 0;
-       }
-       return 1;
-}
-
-void __init xen_hvm_init_mmu_ops(void)
-{
-       if (is_pagetable_dying_supported())
-               pv_mmu_ops.exit_mmap = xen_hvm_exit_mmap;
-#ifdef CONFIG_PROC_VMCORE
-       register_oldmem_pfn_is_ram(&xen_oldmem_pfn_is_ram);
-#endif
-}
-#endif
-
 #define REMAP_BATCH_SIZE 16
 
 struct remap_data {
diff --git a/arch/x86/xen/mmu_hvm.c b/arch/x86/xen/mmu_hvm.c
new file mode 100644 (file)
index 0000000..1c57f1c
--- /dev/null
@@ -0,0 +1,79 @@
+#include <linux/types.h>
+#include <linux/crash_dump.h>
+
+#include <xen/interface/xen.h>
+#include <xen/hvm.h>
+
+#include "mmu.h"
+
+#ifdef CONFIG_PROC_VMCORE
+/*
+ * This function is used in two contexts:
+ * - the kdump kernel has to check whether a pfn of the crashed kernel
+ *   was a ballooned page. vmcore is using this function to decide
+ *   whether to access a pfn of the crashed kernel.
+ * - the kexec kernel has to check whether a pfn was ballooned by the
+ *   previous kernel. If the pfn is ballooned, handle it properly.
+ * Returns 0 if the pfn is not backed by a RAM page, the caller may
+ * handle the pfn special in this case.
+ */
+static int xen_oldmem_pfn_is_ram(unsigned long pfn)
+{
+       struct xen_hvm_get_mem_type a = {
+               .domid = DOMID_SELF,
+               .pfn = pfn,
+       };
+       int ram;
+
+       if (HYPERVISOR_hvm_op(HVMOP_get_mem_type, &a))
+               return -ENXIO;
+
+       switch (a.mem_type) {
+       case HVMMEM_mmio_dm:
+               ram = 0;
+               break;
+       case HVMMEM_ram_rw:
+       case HVMMEM_ram_ro:
+       default:
+               ram = 1;
+               break;
+       }
+
+       return ram;
+}
+#endif
+
+static void xen_hvm_exit_mmap(struct mm_struct *mm)
+{
+       struct xen_hvm_pagetable_dying a;
+       int rc;
+
+       a.domid = DOMID_SELF;
+       a.gpa = __pa(mm->pgd);
+       rc = HYPERVISOR_hvm_op(HVMOP_pagetable_dying, &a);
+       WARN_ON_ONCE(rc < 0);
+}
+
+static int is_pagetable_dying_supported(void)
+{
+       struct xen_hvm_pagetable_dying a;
+       int rc = 0;
+
+       a.domid = DOMID_SELF;
+       a.gpa = 0x00;
+       rc = HYPERVISOR_hvm_op(HVMOP_pagetable_dying, &a);
+       if (rc < 0) {
+               printk(KERN_DEBUG "HVMOP_pagetable_dying not supported\n");
+               return 0;
+       }
+       return 1;
+}
+
+void __init xen_hvm_init_mmu_ops(void)
+{
+       if (is_pagetable_dying_supported())
+               pv_mmu_ops.exit_mmap = xen_hvm_exit_mmap;
+#ifdef CONFIG_PROC_VMCORE
+       register_oldmem_pfn_is_ram(&xen_oldmem_pfn_is_ram);
+#endif
+}