Module Name: src Committed By: rmind Date: Thu Oct 22 19:50:56 UTC 2009
Modified Files: src/sys/arch/alpha/alpha: pmap.c src/sys/arch/arm/arm32: pmap.c src/sys/arch/arm/include/arm32: pmap.h src/sys/arch/m68k/m68k: pmap_motorola.c src/sys/arch/x86/x86: pmap.c src/sys/rump/librump/rumpkern: pmap_stub.c Log Message: Simplify pmap_remove() a little by avoiding pmap_do_remove() layer, since possibility to skip wired mappings is not needed anymore. Apart from that, no functional differences are intended. To generate a diff of this commit: cvs rdiff -u -r1.244 -r1.245 src/sys/arch/alpha/alpha/pmap.c cvs rdiff -u -r1.199 -r1.200 src/sys/arch/arm/arm32/pmap.c cvs rdiff -u -r1.92 -r1.93 src/sys/arch/arm/include/arm32/pmap.h cvs rdiff -u -r1.48 -r1.49 src/sys/arch/m68k/m68k/pmap_motorola.c cvs rdiff -u -r1.93 -r1.94 src/sys/arch/x86/x86/pmap.c cvs rdiff -u -r1.20 -r1.21 src/sys/rump/librump/rumpkern/pmap_stub.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/alpha/alpha/pmap.c diff -u src/sys/arch/alpha/alpha/pmap.c:1.244 src/sys/arch/alpha/alpha/pmap.c:1.245 --- src/sys/arch/alpha/alpha/pmap.c:1.244 Wed Oct 21 21:11:58 2009 +++ src/sys/arch/alpha/alpha/pmap.c Thu Oct 22 19:50:55 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.244 2009/10/21 21:11:58 rmind Exp $ */ +/* $NetBSD: pmap.c,v 1.245 2009/10/22 19:50:55 rmind Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2001, 2007, 2008 The NetBSD Foundation, Inc. @@ -140,7 +140,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.244 2009/10/21 21:11:58 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.245 2009/10/22 19:50:55 rmind Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -439,7 +439,6 @@ * Internal routines */ static void alpha_protection_init(void); -static void pmap_do_remove(pmap_t, vaddr_t, vaddr_t, bool); static bool pmap_remove_mapping(pmap_t, vaddr_t, pt_entry_t *, bool, long); static void pmap_changebit(struct vm_page *, pt_entry_t, pt_entry_t, long); @@ -1255,25 +1254,6 @@ void pmap_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva) { - -#ifdef DEBUG - if (pmapdebug & (PDB_FOLLOW|PDB_REMOVE|PDB_PROTECT)) - printf("pmap_remove(%p, %lx, %lx)\n", pmap, sva, eva); -#endif - - pmap_do_remove(pmap, sva, eva, true); -} - -/* - * pmap_do_remove: - * - * This actually removes the range of addresses from the - * specified map. It is used by and pmap_remove() (does - * want to remove wired mappings). - */ -static void -pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, bool dowired) -{ pt_entry_t *l1pte, *l2pte, *l3pte; pt_entry_t *saved_l1pte, *saved_l2pte, *saved_l3pte; vaddr_t l1eva, l2eva, vptva; @@ -1297,8 +1277,6 @@ PMAP_MAP_TO_HEAD_LOCK(); PMAP_LOCK(pmap); - KASSERT(dowired == true); - while (sva < eva) { l3pte = PMAP_KERNEL_PTE(sva); if (pmap_pte_v(l3pte)) { @@ -1380,15 +1358,14 @@ for (; sva < l2eva && sva < eva; sva += PAGE_SIZE, l3pte++) { - if (pmap_pte_v(l3pte) && - (dowired == true || - pmap_pte_w(l3pte) == 0)) { - needisync |= - pmap_remove_mapping( - pmap, sva, - l3pte, true, - cpu_id); + if (!pmap_pte_v(l3pte)) { + continue; } + needisync |= + pmap_remove_mapping( + pmap, sva, + l3pte, true, + cpu_id); } /* Index: src/sys/arch/arm/arm32/pmap.c diff -u src/sys/arch/arm/arm32/pmap.c:1.199 src/sys/arch/arm/arm32/pmap.c:1.200 --- src/sys/arch/arm/arm32/pmap.c:1.199 Wed Oct 21 21:11:59 2009 +++ src/sys/arch/arm/arm32/pmap.c Thu Oct 22 19:50:55 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.199 2009/10/21 21:11:59 rmind Exp $ */ +/* $NetBSD: pmap.c,v 1.200 2009/10/22 19:50:55 rmind Exp $ */ /* * Copyright 2003 Wasabi Systems, Inc. @@ -212,7 +212,7 @@ #include <machine/param.h> #include <arm/arm32/katelib.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.199 2009/10/21 21:11:59 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.200 2009/10/22 19:50:55 rmind Exp $"); #ifdef PMAP_DEBUG @@ -640,7 +640,7 @@ static void pmap_enter_pv(struct vm_page *, struct pv_entry *, pmap_t, vaddr_t, u_int); static struct pv_entry *pmap_find_pv(struct vm_page *, pmap_t, vaddr_t); -static struct pv_entry *pmap_remove_pv(struct vm_page *, pmap_t, vaddr_t, int); +static struct pv_entry *pmap_remove_pv(struct vm_page *, pmap_t, vaddr_t); static u_int pmap_modify_pv(struct vm_page *, pmap_t, vaddr_t, u_int, u_int); @@ -960,7 +960,7 @@ * => we return the removed pve */ static struct pv_entry * -pmap_remove_pv(struct vm_page *pg, pmap_t pm, vaddr_t va, int skip_wired) +pmap_remove_pv(struct vm_page *pg, pmap_t pm, vaddr_t va) { struct pv_entry *pve, **prevptr; @@ -975,8 +975,6 @@ NPDEBUG(PDB_PVDUMP, printf("pmap_remove_pv: pm %p, pg " "%p, flags 0x%x\n", pm, pg, pve->pv_flags)); if (pve->pv_flags & PVF_WIRED) { - if (skip_wired) - return (NULL); --pm->pm_stats.wired_count; } *prevptr = SLIST_NEXT(pve, pv_link); /* remove it! */ @@ -2891,7 +2889,7 @@ * must remove it from the PV list */ simple_lock(&opg->mdpage.pvh_slock); - pve = pmap_remove_pv(opg, pm, va, 0); + pve = pmap_remove_pv(opg, pm, va); pmap_vac_me_harder(opg, pm, 0); simple_unlock(&opg->mdpage.pvh_slock); oflags = pve->pv_flags; @@ -2954,7 +2952,7 @@ * at this address. */ simple_lock(&opg->mdpage.pvh_slock); - pve = pmap_remove_pv(opg, pm, va, 0); + pve = pmap_remove_pv(opg, pm, va); pmap_vac_me_harder(opg, pm, 0); simple_unlock(&opg->mdpage.pvh_slock); oflags = pve->pv_flags; @@ -3078,7 +3076,7 @@ #define PMAP_REMOVE_CLEAN_LIST_SIZE 3 void -pmap_do_remove(pmap_t pm, vaddr_t sva, vaddr_t eva, int skip_wired) +pmap_remove(pmap_t pm, vaddr_t sva, vaddr_t eva) { struct l2_bucket *l2b; vaddr_t next_bucket; @@ -3148,7 +3146,7 @@ if ((pg = PHYS_TO_VM_PAGE(pa)) != NULL) { struct pv_entry *pve; simple_lock(&pg->mdpage.pvh_slock); - pve = pmap_remove_pv(pg, pm, sva, skip_wired); + pve = pmap_remove_pv(pg, pm, sva); pmap_vac_me_harder(pg, pm, 0); simple_unlock(&pg->mdpage.pvh_slock); if (pve != NULL) { @@ -3159,17 +3157,8 @@ PV_BEEN_REFD(pve->pv_flags); } pool_put(&pmap_pv_pool, pve); - } else - if (skip_wired) { - /* The mapping is wired. Skip it */ - continue; } - } else - if (skip_wired) { - /* Unmanaged pages are always wired. */ - continue; } - mappings++; if (!l2pte_valid(pte)) { @@ -3285,7 +3274,7 @@ KASSERT(pg->mdpage.pvh_attrs & (PVF_COLORED|PVF_NC)); KASSERT((pg->mdpage.pvh_attrs & PVF_KMPAGE) == 0); - pv = pmap_remove_pv(pg, pmap_kernel(), va, false); + pv = pmap_remove_pv(pg, pmap_kernel(), va); KASSERT(pv); KASSERT(pv->pv_flags & PVF_KENTRY); Index: src/sys/arch/arm/include/arm32/pmap.h diff -u src/sys/arch/arm/include/arm32/pmap.h:1.92 src/sys/arch/arm/include/arm32/pmap.h:1.93 --- src/sys/arch/arm/include/arm32/pmap.h:1.92 Wed Aug 19 23:54:33 2009 +++ src/sys/arch/arm/include/arm32/pmap.h Thu Oct 22 19:50:55 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.92 2009/08/19 23:54:33 thorpej Exp $ */ +/* $NetBSD: pmap.h,v 1.93 2009/10/22 19:50:55 rmind Exp $ */ /* * Copyright (c) 2002, 2003 Wasabi Systems, Inc. @@ -268,8 +268,6 @@ #define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count) #define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count) -#define pmap_remove(pmap,sva,eva) pmap_do_remove((pmap),(sva),(eva),0) - #define pmap_is_modified(pg) \ (((pg)->mdpage.pvh_attrs & PVF_MOD) != 0) #define pmap_is_referenced(pg) \ Index: src/sys/arch/m68k/m68k/pmap_motorola.c diff -u src/sys/arch/m68k/m68k/pmap_motorola.c:1.48 src/sys/arch/m68k/m68k/pmap_motorola.c:1.49 --- src/sys/arch/m68k/m68k/pmap_motorola.c:1.48 Wed Oct 21 21:12:00 2009 +++ src/sys/arch/m68k/m68k/pmap_motorola.c Thu Oct 22 19:50:55 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_motorola.c,v 1.48 2009/10/21 21:12:00 rmind Exp $ */ +/* $NetBSD: pmap_motorola.c,v 1.49 2009/10/22 19:50:55 rmind Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -117,7 +117,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_motorola.c,v 1.48 2009/10/21 21:12:00 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_motorola.c,v 1.49 2009/10/22 19:50:55 rmind Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -280,7 +280,6 @@ struct pv_entry *pmap_alloc_pv(void); void pmap_free_pv(struct pv_entry *); -static void pmap_collect_pv(void); #define PAGE_IS_MANAGED(pa) (pmap_initialized && uvm_pageismanaged(pa)) @@ -297,13 +296,11 @@ * Internal routines */ void pmap_remove_mapping(pmap_t, vaddr_t, pt_entry_t *, int); -void pmap_do_remove(pmap_t, vaddr_t, vaddr_t, int); bool pmap_testbit(paddr_t, int); bool pmap_changebit(paddr_t, int, int); int pmap_enter_ptpage(pmap_t, vaddr_t, bool); void pmap_ptpage_addref(vaddr_t); int pmap_ptpage_delref(vaddr_t); -void pmap_collect1(pmap_t, paddr_t, paddr_t); void pmap_pinit(pmap_t); void pmap_release(pmap_t); @@ -593,7 +590,8 @@ * * Perform compaction on the PV list, called via pmap_collect(). */ -static void +#ifdef notyet +void pmap_collect_pv(void) { struct pv_page_list pv_page_collectlist; @@ -654,6 +652,7 @@ uvm_km_free(kernel_map, (vaddr_t)pvp, PAGE_SIZE, UVM_KMF_WIRED); } } +#endif /* * pmap_map: @@ -852,13 +851,6 @@ void pmap_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva) { - - pmap_do_remove(pmap, sva, eva, 1); -} - -void -pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, int remove_wired) -{ vaddr_t nssva; pt_entry_t *pte; int flags; @@ -877,7 +869,6 @@ /* * Invalidate every valid mapping within this segment. - * If remove_wired is zero, skip the wired pages. */ pte = pmap_pte(pmap, sva); @@ -893,10 +884,7 @@ break; } - - - if (pmap_pte_v(pte) && - (remove_wired || !pmap_pte_w(pte))) { + if (pmap_pte_v(pte)) { #ifdef M68K_MMU_HP if (pmap_aliasmask) { @@ -1665,50 +1653,6 @@ } /* - * pmap_collect: [ INTERFACE ] - * - * Garbage collects the physical map system for pages which are no - * longer used. Success need not be guaranteed -- that is, there - * may well be pages which are not referenced, but others may be - * collected. - */ -static void -pmap_collect(pmap_t pmap) -{ - - PMAP_DPRINTF(PDB_FOLLOW, ("pmap_collect(%p)\n", pmap)); - - if (pmap == pmap_kernel()) { - int bank, s; - - /* - * XXX This is very bogus. We should handle kernel PT - * XXX pages much differently. - */ - - s = splvm(); - for (bank = 0; bank < vm_nphysseg; bank++) - pmap_collect1(pmap, ptoa(vm_physmem[bank].start), - ptoa(vm_physmem[bank].end)); - splx(s); - } else { - /* - * This process is about to be swapped out; free all of - * the PT pages by removing the physical mappings for its - * entire address space. Note: pmap_remove() performs - * all necessary locking. - */ - pmap_do_remove(pmap, VM_MIN_ADDRESS, VM_MAX_ADDRESS, 0); - pmap_update(pmap); - } - -#ifdef notyet - /* Go compact and garbage-collect the pv_table. */ - pmap_collect_pv(); -#endif -} - -/* * pmap_collect1(): * * Garbage-collect KPT pages. Helper for the above (bogus) @@ -1717,7 +1661,7 @@ * Note: THIS SHOULD GO AWAY, AND BE REPLACED WITH A BETTER * WAY OF HANDLING PT PAGES! */ -static void +static inline void pmap_collect1(pmap_t pmap, paddr_t startpa, paddr_t endpa) { paddr_t pa; @@ -1820,6 +1764,39 @@ } /* + * pmap_collect: + * + * Helper for pmap_enter_ptpage(). + * + * Garbage collects the physical map system for pages which are no + * longer used. Success need not be guaranteed -- that is, there + * may well be pages which are not referenced, but others may be + * collected. + */ +static void +pmap_collect(void) +{ + int bank, s; + + /* + * XXX This is very bogus. We should handle kernel PT + * XXX pages much differently. + */ + + s = splvm(); + for (bank = 0; bank < vm_nphysseg; bank++) { + pmap_collect1(pmap_kernel(), ptoa(vm_physmem[bank].start), + ptoa(vm_physmem[bank].end)); + } + splx(s); + +#ifdef notyet + /* Go compact and garbage-collect the pv_table. */ + pmap_collect_pv(); +#endif +} + +/* * pmap_zero_page: [ INTERFACE ] * * Zero the specified (machine independent) page by mapping the page @@ -2615,7 +2592,7 @@ */ PMAP_DPRINTF(PDB_COLLECT, ("enter: no KPT pages, collecting...\n")); - pmap_collect(pmap_kernel()); + pmap_collect(); if ((kpt = kpt_free_list) == NULL) panic("pmap_enter_ptpage: can't get KPT page"); } Index: src/sys/arch/x86/x86/pmap.c diff -u src/sys/arch/x86/x86/pmap.c:1.93 src/sys/arch/x86/x86/pmap.c:1.94 --- src/sys/arch/x86/x86/pmap.c:1.93 Wed Oct 21 21:12:04 2009 +++ src/sys/arch/x86/x86/pmap.c Thu Oct 22 19:50:56 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.93 2009/10/21 21:12:04 rmind Exp $ */ +/* $NetBSD: pmap.c,v 1.94 2009/10/22 19:50:56 rmind Exp $ */ /* * Copyright (c) 2007 Manuel Bouyer. @@ -149,7 +149,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.93 2009/10/21 21:12:04 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.94 2009/10/22 19:50:56 rmind Exp $"); #include "opt_user_ldt.h" #include "opt_lockdebug.h" @@ -583,15 +583,12 @@ static bool pmap_is_active(struct pmap *, struct cpu_info *, bool); static void pmap_map_ptes(struct pmap *, struct pmap **, pt_entry_t **, pd_entry_t * const **); -static void pmap_do_remove(struct pmap *, vaddr_t, vaddr_t, u_int); static bool pmap_remove_pte(struct pmap *, struct vm_page *, - pt_entry_t *, vaddr_t, u_int, + pt_entry_t *, vaddr_t, struct pv_entry **); static pt_entry_t pmap_remove_ptes(struct pmap *, struct vm_page *, - vaddr_t, vaddr_t, vaddr_t, u_int, + vaddr_t, vaddr_t, vaddr_t, struct pv_entry **); -#define PMAP_REMOVE_ALL 0 /* remove all mappings */ -#define PMAP_REMOVE_SKIPWIRED 1 /* skip wired mappings */ static void pmap_unmap_ptes(struct pmap *, struct pmap *); static bool pmap_get_physpage(vaddr_t, int, paddr_t *); @@ -3249,8 +3246,7 @@ static pt_entry_t pmap_remove_ptes(struct pmap *pmap, struct vm_page *ptp, vaddr_t ptpva, - vaddr_t startva, vaddr_t endva, u_int flags, - struct pv_entry **pv_tofree) + vaddr_t startva, vaddr_t endva, struct pv_entry **pv_tofree) { struct pv_entry *pve; pt_entry_t *pte = (pt_entry_t *) ptpva; @@ -3275,9 +3271,6 @@ if (!pmap_valid_entry(*pte)) continue; /* VA not mapped */ - if ((flags & PMAP_REMOVE_SKIPWIRED) && (*pte & PG_W)) { - continue; - } /* atomically save the old PTE and zap! it */ opte = pmap_pte_testset(pte, 0); @@ -3349,7 +3342,7 @@ static bool pmap_remove_pte(struct pmap *pmap, struct vm_page *ptp, pt_entry_t *pte, - vaddr_t va, u_int flags, struct pv_entry **pv_tofree) + vaddr_t va, struct pv_entry **pv_tofree) { pt_entry_t opte; struct pv_entry *pve; @@ -3361,9 +3354,6 @@ if (!pmap_valid_entry(*pte)) return(false); /* VA not mapped */ - if ((flags & PMAP_REMOVE_SKIPWIRED) && (*pte & PG_W)) { - return(false); - } /* atomically save the old PTE and zap! it */ opte = pmap_pte_testset(pte, 0); @@ -3421,7 +3411,7 @@ } /* - * pmap_remove: top level mapping removal function + * pmap_remove: mapping removal function. * * => caller should not be holding any pmap locks */ @@ -3429,18 +3419,6 @@ void pmap_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva) { - pmap_do_remove(pmap, sva, eva, PMAP_REMOVE_ALL); -} - -/* - * pmap_do_remove: mapping removal guts - * - * => caller should not be holding any pmap locks - */ - -static void -pmap_do_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva, u_int flags) -{ pt_entry_t *ptes, xpte = 0; pd_entry_t pde; pd_entry_t * const *pdes; @@ -3479,7 +3457,7 @@ /* do it! */ result = pmap_remove_pte(pmap, ptp, - &ptes[pl1_i(va)], va, flags, &pv_tofree); + &ptes[pl1_i(va)], va, &pv_tofree); /* * if mapping removed and the PTP is no longer @@ -3540,8 +3518,7 @@ #endif } xpte |= pmap_remove_ptes(pmap, ptp, - (vaddr_t)&ptes[pl1_i(va)], va, blkendva, - flags, &pv_tofree); + (vaddr_t)&ptes[pl1_i(va)], va, blkendva, &pv_tofree); /* if PTP is no longer being used, free it! */ if (ptp && ptp->wire_count <= 1) { Index: src/sys/rump/librump/rumpkern/pmap_stub.c diff -u src/sys/rump/librump/rumpkern/pmap_stub.c:1.20 src/sys/rump/librump/rumpkern/pmap_stub.c:1.21 --- src/sys/rump/librump/rumpkern/pmap_stub.c:1.20 Fri Sep 18 18:31:53 2009 +++ src/sys/rump/librump/rumpkern/pmap_stub.c Thu Oct 22 19:50:56 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_stub.c,v 1.20 2009/09/18 18:31:53 pooka Exp $ */ +/* $NetBSD: pmap_stub.c,v 1.21 2009/10/22 19:50:56 rmind Exp $ */ /* * Copyright (c) 2008 Antti Kantee. All Rights Reserved. @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_stub.c,v 1.20 2009/09/18 18:31:53 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_stub.c,v 1.21 2009/10/22 19:50:56 rmind Exp $"); #include <sys/param.h> @@ -111,25 +111,17 @@ } /* - * It's a brave new world. arm32 pmap is different (even from arm26) + * It's a brave new world. */ -#if defined(__arm__) && !defined(__PROG26) -void -pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, int eger) -{ +#if !defined(__vax__) - panic("%s: unavailable", __func__); -} -#elif !defined(__vax__) void pmap_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva) { panic("%s: unavailable", __func__); } -#endif -#ifndef __vax__ bool pmap_extract(pmap_t pmap, vaddr_t va, paddr_t *pap) { @@ -137,6 +129,7 @@ *pap = va; return true; } + #endif /*