Module Name: src Committed By: maxv Date: Wed Jan 3 09:38:23 UTC 2018
Modified Files: src/sys/arch/x86/x86: pmap.c Log Message: simplify To generate a diff of this commit: cvs rdiff -u -r1.271 -r1.272 src/sys/arch/x86/x86/pmap.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/x86/pmap.c diff -u src/sys/arch/x86/x86/pmap.c:1.271 src/sys/arch/x86/x86/pmap.c:1.272 --- src/sys/arch/x86/x86/pmap.c:1.271 Sun Dec 31 15:41:05 2017 +++ src/sys/arch/x86/x86/pmap.c Wed Jan 3 09:38:23 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.271 2017/12/31 15:41:05 maxv Exp $ */ +/* $NetBSD: pmap.c,v 1.272 2018/01/03 09:38:23 maxv Exp $ */ /* * Copyright (c) 2008, 2010, 2016, 2017 The NetBSD Foundation, Inc. @@ -170,7 +170,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.271 2017/12/31 15:41:05 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.272 2018/01/03 09:38:23 maxv Exp $"); #include "opt_user_ldt.h" #include "opt_lockdebug.h" @@ -2002,31 +2002,26 @@ pmap_free_ptp(struct pmap *pmap, struct do { index = pl_i(va, level + 1); opde = pmap_pte_testset(&pdes[level - 1][index], 0); -#if defined(XEN) -# if defined(__x86_64__) + /* - * If ptp is a L3 currently mapped in kernel space, - * on any cpu, clear it before freeing + * On Xen-amd64, we need to sync the top level page + * directory on each CPU. */ +#if defined(XEN) && defined(__x86_64__) if (level == PTP_LEVELS - 1) { - /* - * Update the per-cpu PD on all cpus the current - * pmap is active on - */ xen_kpm_sync(pmap, index); } -# endif /*__x86_64__ */ +#endif + invaladdr = level == 1 ? (vaddr_t)ptes : (vaddr_t)pdes[level - 2]; pmap_tlb_shootdown(pmap, invaladdr + index * PAGE_SIZE, opde, TLBSHOOT_FREE_PTP1); + +#if defined(XEN) pmap_tlb_shootnow(); -#else /* XEN */ - invaladdr = level == 1 ? (vaddr_t)ptes : - (vaddr_t)pdes[level - 2]; - pmap_tlb_shootdown(pmap, invaladdr + index * PAGE_SIZE, - opde, TLBSHOOT_FREE_PTP1); -#endif /* XEN */ +#endif + pmap_freepage(pmap, ptp, level); if (level < PTP_LEVELS - 1) { ptp = pmap_find_ptp(pmap, va, (paddr_t)-1, level + 1); @@ -2108,16 +2103,17 @@ pmap_get_ptp(struct pmap *pmap, vaddr_t pa = VM_PAGE_TO_PHYS(ptp); pmap_pte_set(&pva[index], (pd_entry_t) (pmap_pa2pte(pa) | PG_u | PG_RW | PG_V)); + + /* + * On Xen-amd64, we need to sync the top level page + * directory on each CPU. + */ #if defined(XEN) && defined(__x86_64__) if (i == PTP_LEVELS) { - - /* - * Update the per-cpu PD on all cpus the current - * pmap is active on - */ xen_kpm_sync(pmap, index); } #endif + pmap_pte_flush(); pmap_stats_update(pmap, 1, 0);