Module Name: src Committed By: jym Date: Sun Nov 20 19:41:27 UTC 2011
Modified Files: src/sys/arch/x86/include: pmap.h src/sys/arch/x86/x86: pmap.c src/sys/arch/xen/x86: xen_pmap.c src/sys/arch/xen/xen: xen_machdep.c Log Message: Expose pmap_pdp_cache publicly to x86/xen pmap. Provide suspend/resume callbacks for Xen pmap. Turn static internal callbacks of pmap_pdp_cache. XXX the implementation of pool_cache_invalidate(9) is still wrong, and IMHO this needs fixing before -6. See http://mail-index.netbsd.org/tech-kern/2011/11/18/msg011924.html To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/arch/x86/include/pmap.h cvs rdiff -u -r1.141 -r1.142 src/sys/arch/x86/x86/pmap.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/xen/x86/xen_pmap.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/xen/xen/xen_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x86/include/pmap.h diff -u src/sys/arch/x86/include/pmap.h:1.45 src/sys/arch/x86/include/pmap.h:1.46 --- src/sys/arch/x86/include/pmap.h:1.45 Tue Nov 8 17:16:52 2011 +++ src/sys/arch/x86/include/pmap.h Sun Nov 20 19:41:27 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.45 2011/11/08 17:16:52 cherry Exp $ */ +/* $NetBSD: pmap.h,v 1.46 2011/11/20 19:41:27 jym Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -125,6 +125,11 @@ extern struct pmap_head pmaps; extern kmutex_t pmaps_lock; /* protects pmaps */ /* + * pool_cache(9) that PDPs are allocated from + */ +extern struct pool_cache pmap_pdp_cache; + +/* * the pmap structure * * note that the pm_obj contains the lock pointer, the reference count, @@ -261,8 +266,6 @@ u_int x86_mmap_flags(paddr_t); bool pmap_is_curpmap(struct pmap *); -void pmap_invalidate_pool_caches(void); - vaddr_t reserve_dumppages(vaddr_t); /* XXX: not a pmap fn */ typedef enum tlbwhy { @@ -411,15 +414,7 @@ vaddr_t pmap_map(vaddr_t, paddr_t, paddr void pmap_cpu_init_late(struct cpu_info *); bool sse2_idlezero_page(void *); - #ifdef XEN - -void pmap_unmap_all_apdp_pdes(void); -#ifdef PAE -void pmap_map_recursive_entries(void); -void pmap_unmap_recursive_entries(void); -#endif /* PAE */ - #include <sys/bitops.h> #define XPTE_MASK L1_FRAME @@ -468,9 +463,17 @@ xpmap_update (pt_entry_t *pte, pt_entry_ paddr_t vtomach(vaddr_t); #define vtomfn(va) (vtomach(va) >> PAGE_SHIFT) +void pmap_xen_resume(void); +void pmap_xen_suspend(void); + void pmap_apte_flush(struct pmap *); void pmap_unmap_apdp(void); +#ifdef PAE +void pmap_map_recursive_entries(void); +void pmap_unmap_recursive_entries(void); +#endif /* PAE */ + #endif /* XEN */ /* pmap functions with machine addresses */ Index: src/sys/arch/x86/x86/pmap.c diff -u src/sys/arch/x86/x86/pmap.c:1.141 src/sys/arch/x86/x86/pmap.c:1.142 --- src/sys/arch/x86/x86/pmap.c:1.141 Tue Nov 8 17:16:52 2011 +++ src/sys/arch/x86/x86/pmap.c Sun Nov 20 19:41:27 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.141 2011/11/08 17:16:52 cherry Exp $ */ +/* $NetBSD: pmap.c,v 1.142 2011/11/20 19:41:27 jym Exp $ */ /*- * Copyright (c) 2008, 2010 The NetBSD Foundation, Inc. @@ -171,7 +171,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.141 2011/11/08 17:16:52 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.142 2011/11/20 19:41:27 jym Exp $"); #include "opt_user_ldt.h" #include "opt_lockdebug.h" @@ -508,17 +508,14 @@ static char *csrcp, *cdstp, *zerop, *ptp int pmap_enter_default(pmap_t, vaddr_t, paddr_t, vm_prot_t, u_int); -/* - * pool and cache that PDPs are allocated from - */ - -static struct pool_cache pmap_pdp_cache; -int pmap_pdp_ctor(void *, void *, int); -void pmap_pdp_dtor(void *, void *); +/* PDP pool_cache(9) and its callbacks */ +struct pool_cache pmap_pdp_cache; +static int pmap_pdp_ctor(void *, void *, int); +static void pmap_pdp_dtor(void *, void *); #ifdef PAE /* need to allocate items of 4 pages */ -void *pmap_pdp_alloc(struct pool *, int); -void pmap_pdp_free(struct pool *, void *); +static void *pmap_pdp_alloc(struct pool *, int); +static void pmap_pdp_free(struct pool *, void *); static struct pool_allocator pmap_pdp_allocator = { .pa_alloc = pmap_pdp_alloc, .pa_free = pmap_pdp_free, @@ -2014,7 +2011,7 @@ pmap_get_ptp(struct pmap *pmap, vaddr_t /* * pmap_pdp_ctor: constructor for the PDP cache. */ -int +static int pmap_pdp_ctor(void *arg, void *v, int flags) { pd_entry_t *pdir = v; @@ -2121,7 +2118,7 @@ pmap_pdp_ctor(void *arg, void *v, int fl * pmap_pdp_dtor: destructor for the PDP cache. */ -void +static void pmap_pdp_dtor(void *arg, void *v) { #ifdef XEN @@ -2152,7 +2149,7 @@ pmap_pdp_dtor(void *arg, void *v) /* pmap_pdp_alloc: Allocate a page for the pdp memory pool. */ -void * +static void * pmap_pdp_alloc(struct pool *pp, int flags) { return (void *)uvm_km_alloc(kernel_map, @@ -2165,7 +2162,7 @@ pmap_pdp_alloc(struct pool *pp, int flag * pmap_pdp_free: free a PDP */ -void +static void pmap_pdp_free(struct pool *pp, void *v) { uvm_km_free(kernel_map, (vaddr_t)v, PAGE_SIZE * PDP_SIZE, @@ -4466,19 +4463,3 @@ x86_mmap_flags(paddr_t mdpgno) return pflag; } - -/* - * Invalidates pool_cache(9) used by pmap(9). - */ -void -pmap_invalidate_pool_caches(void) -{ -#ifdef XEN - /* - * We must invalidate all shadow pages found inside the pmap_pdp_cache. - * They are technically considered by Xen as L2 pages, although they - * are not currently found inside pmaps list. - */ - pool_cache_invalidate(&pmap_pdp_cache); -#endif -} Index: src/sys/arch/xen/x86/xen_pmap.c diff -u src/sys/arch/xen/x86/xen_pmap.c:1.8 src/sys/arch/xen/x86/xen_pmap.c:1.9 --- src/sys/arch/xen/x86/xen_pmap.c:1.8 Tue Nov 8 17:16:52 2011 +++ src/sys/arch/xen/x86/xen_pmap.c Sun Nov 20 19:41:27 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: xen_pmap.c,v 1.8 2011/11/08 17:16:52 cherry Exp $ */ +/* $NetBSD: xen_pmap.c,v 1.9 2011/11/20 19:41:27 jym Exp $ */ /* * Copyright (c) 2007 Manuel Bouyer. @@ -102,7 +102,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xen_pmap.c,v 1.8 2011/11/08 17:16:52 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xen_pmap.c,v 1.9 2011/11/20 19:41:27 jym Exp $"); #include "opt_user_ldt.h" #include "opt_lockdebug.h" @@ -434,13 +434,12 @@ pmap_extract_ma(struct pmap *pmap, vaddr /* * Flush all APDP entries found in pmaps - * Required during Xen save/restore operations, as it does not + * Required during Xen save/restore operations, as Xen does not * handle alternative recursive mappings properly */ void -pmap_unmap_all_apdp_pdes(void) +pmap_xen_suspend(void) { - int i; int s; struct pmap *pm; @@ -470,6 +469,17 @@ pmap_unmap_all_apdp_pdes(void) splx(s); +#ifdef PAE + pmap_unmap_recursive_entries(); +#endif +} + +void +pmap_xen_resume(void) +{ +#ifdef PAE + pmap_map_recursive_entries(); +#endif } #ifdef PAE @@ -486,12 +496,10 @@ pmap_unmap_all_apdp_pdes(void) void pmap_map_recursive_entries(void) { - int i; struct pmap *pm; mutex_enter(&pmaps_lock); - LIST_FOREACH(pm, &pmaps, pm_list) { for (i = 0; i < PDP_SIZE; i++) { xpq_queue_pte_update( @@ -499,7 +507,6 @@ pmap_map_recursive_entries(void) xpmap_ptom((pm)->pm_pdirpa[i]) | PG_V); } } - mutex_exit(&pmaps_lock); for (i = 0; i < PDP_SIZE; i++) { @@ -514,21 +521,24 @@ pmap_map_recursive_entries(void) void pmap_unmap_recursive_entries(void) { - int i; struct pmap *pm; - pmap_invalidate_pool_caches(); + /* + * Invalidate pmap_pdp_cache as it contains L2-pinned objects with + * recursive entries. + * XXX jym@ : find a way to drain per-CPU caches to. pool_cache_inv + * does not do that. + */ + pool_cache_invalidate(&pmap_pdp_cache); mutex_enter(&pmaps_lock); - LIST_FOREACH(pm, &pmaps, pm_list) { for (i = 0; i < PDP_SIZE; i++) { xpq_queue_pte_update( xpmap_ptom(pmap_pdirpa(pm, PDIR_SLOT_PTE + i)), 0); } } - mutex_exit(&pmaps_lock); /* do it for pmap_kernel() too! */ Index: src/sys/arch/xen/xen/xen_machdep.c diff -u src/sys/arch/xen/xen/xen_machdep.c:1.8 src/sys/arch/xen/xen/xen_machdep.c:1.9 --- src/sys/arch/xen/xen/xen_machdep.c:1.8 Tue Sep 20 00:12:24 2011 +++ src/sys/arch/xen/xen/xen_machdep.c Sun Nov 20 19:41:27 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: xen_machdep.c,v 1.8 2011/09/20 00:12:24 jym Exp $ */ +/* $NetBSD: xen_machdep.c,v 1.9 2011/11/20 19:41:27 jym Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -53,7 +53,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xen_machdep.c,v 1.8 2011/09/20 00:12:24 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xen_machdep.c,v 1.9 2011/11/20 19:41:27 jym Exp $"); #include "opt_xen.h" @@ -285,16 +285,7 @@ xen_prepare_suspend(void) { kpreempt_disable(); - /* - * Xen lazy evaluation of recursive mappings requires - * to flush the APDP entries - */ - pmap_unmap_all_apdp_pdes(); - -#ifdef PAE - pmap_unmap_recursive_entries(); -#endif - + pmap_xen_suspend(); xen_suspendclocks(); /* @@ -330,9 +321,7 @@ xen_prepare_resume(void) HYPERVISOR_crash(); } -#ifdef PAE - pmap_map_recursive_entries(); -#endif + pmap_xen_resume(); if (xen_start_info.nr_pages != physmem) { /*