>>>>> "Paul" == Paul Goyette <p...@whooppee.com> writes:

    >> Module Name: src Committed By: cherry Date: Tue May 6 04:26:24
    >> UTC 2014
    >> 
    >> Modified Files: src/sys/arch/x86/x86: pmap.c
    >> src/sys/arch/xen/include: xenpmap.h src/sys/arch/xen/x86:
    >> x86_xpmap.c
    >> 
    >> Log Message: Use the hypervisor to copy/zero pages. This saves us
    >> the extra overheads of setting up temporary kernel
    >> mapping/unmapping.
    >> 
    >> riz@ reports savings of about 2s on a 120s kernel build.

    Paul> This commit seems to have broken the ability to boot NetBSD
    Paul> under at least some hypervisors.  My VPS at prgmr.com boots
    Paul> fine with a kernel from just before this change.  However,
    Paul> with this commit, the following panic occurs:

Sorry, the first patch was incorrect ( it skips over some newer legit
versions! ) - thanks abs@.

Thanks to Gary Duzan for the initial suggestion and abs@ for catching
the error in my first patch.

-- 
Cherry

diff -r f0203e3974e7 sys/arch/x86/x86/pmap.c
--- a/sys/arch/x86/x86/pmap.c	Sat May 31 20:20:36 2014 +0900
+++ b/sys/arch/x86/x86/pmap.c	Thu Jun 12 15:46:00 2014 +0900
@@ -211,6 +211,15 @@
 #ifdef XEN
 #include <xen/xen-public/xen.h>
 #include <xen/hypervisor.h>
+
+/* 
+ * Does the hypervisor we're running on support an api
+ * call at the requested version number ?
+ */
+#define XEN_VERSION_SUPPORTED(major, minor)		\
+	(XEN_MAJOR(xen_version) > (major) ||		\
+	 (XEN_MAJOR(xen_version) == (major) &&		\
+	  XEN_MINOR(xen_version) >= (minor)))
 #endif
 
 /*
@@ -3097,8 +3106,11 @@
 
 	memcpy((void *)dstva, (void *)srcva, PAGE_SIZE);
 #elif defined(XEN)
-	xen_copy_page(srcpa, dstpa);
-#else
+	if (XEN_VERSION_SUPPORTED(3, 4)) {
+		xen_copy_page(srcpa, dstpa);
+		return;
+	}
+#endif
 	pt_entry_t *spte;
 	pt_entry_t *dpte;
 	void *csrcva;
@@ -3128,7 +3140,6 @@
 	pmap_pte_flush();
 #endif
 	kpreempt_enable();
-#endif
 }
 
 static pt_entry_t *
@@ -4108,8 +4119,11 @@
 #ifdef __HAVE_DIRECT_MAP
 		pagezero(PMAP_DIRECT_MAP(*paddrp));
 #elif defined(XEN)
-		xen_pagezero(*paddrp);
-#else
+		if (XEN_VERSION_SUPPORTED(3, 4)) {
+			xen_pagezero(*paddrp);
+			return true;
+		}
+#endif
 		kpreempt_disable();
 		pmap_pte_set(early_zero_pte,
 		    pmap_pa2pte(*paddrp) | PG_V | PG_RW | PG_k);
@@ -4121,7 +4135,6 @@
 		pmap_pte_flush();
 #endif /* defined(DIAGNOSTIC) */
 		kpreempt_enable();
-#endif
 	} else {
 		/* XXX */
 		ptp = uvm_pagealloc(NULL, 0, NULL,

Reply via email to