>>>>> "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,