Module Name: src Committed By: ryo Date: Tue Jul 24 10:08:43 UTC 2018
Modified Files: src/sys/arch/aarch64/aarch64: pmap.c Log Message: don't call pool_cache_put with locking pmap. pool_cache_put call pmap_kenter_pa internally. (pool_cache_put_paddr -> pool_cache_put_slow -> pool_get -> pmap_kenter_pa) To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/arch/aarch64/aarch64/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/aarch64/aarch64/pmap.c diff -u src/sys/arch/aarch64/aarch64/pmap.c:1.13 src/sys/arch/aarch64/aarch64/pmap.c:1.14 --- src/sys/arch/aarch64/aarch64/pmap.c:1.13 Mon Jul 23 22:51:39 2018 +++ src/sys/arch/aarch64/aarch64/pmap.c Tue Jul 24 10:08:43 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.13 2018/07/23 22:51:39 ryo Exp $ */ +/* $NetBSD: pmap.c,v 1.14 2018/07/24 10:08:43 ryo Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.13 2018/07/23 22:51:39 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.14 2018/07/24 10:08:43 ryo Exp $"); #include "opt_arm_debug.h" #include "opt_ddb.h" @@ -852,7 +852,7 @@ _pmap_pte_adjust_cacheflags(pt_entry_t p return pte; } -static void +static struct pv_entry * _pmap_remove_pv(struct vm_page *pg, struct pmap *pm, vaddr_t va, pt_entry_t pte) { struct vm_page_md *md; @@ -883,8 +883,7 @@ _pmap_remove_pv(struct vm_page *pg, stru pmap_pv_unlock(md); - if (pv != NULL) - pool_cache_put(&_pmap_pv_pool, pv); + return pv; } #if defined(PMAP_PV_DEBUG) || defined(DDB) @@ -1292,7 +1291,7 @@ _pmap_enter(struct pmap *pm, vaddr_t va, u_int flags, bool kenter) { struct vm_page *pg; - struct pv_entry *spv; + struct pv_entry *spv, *opv = NULL; pd_entry_t pde; pt_entry_t attr, pte, *ptep; #ifdef UVMHIST @@ -1428,7 +1427,7 @@ _pmap_enter(struct pmap *pm, vaddr_t va, opg = PHYS_TO_VM_PAGE(l3pte_pa(pte)); if (opg != NULL) - _pmap_remove_pv(opg, pm, va, pte); + opv = _pmap_remove_pv(opg, pm, va, pte); } if (pte & LX_BLKPAG_OS_WIRED) @@ -1509,6 +1508,9 @@ _pmap_enter(struct pmap *pm, vaddr_t va, if (spv != NULL) pool_cache_put(&_pmap_pv_pool, spv); + if (opv != NULL) + pool_cache_put(&_pmap_pv_pool, opv); + return error; } @@ -1531,6 +1533,7 @@ _pmap_remove(struct pmap *pm, vaddr_t va { pt_entry_t pte, *ptep; struct vm_page *pg; + struct pv_entry *opv = NULL; paddr_t pa; @@ -1556,7 +1559,7 @@ _pmap_remove(struct pmap *pm, vaddr_t va pg = PHYS_TO_VM_PAGE(pa); if (pg != NULL) - _pmap_remove_pv(pg, pm, va, pte); + opv = _pmap_remove_pv(pg, pm, va, pte); atomic_swap_64(ptep, 0); #if 0 @@ -1571,6 +1574,9 @@ _pmap_remove(struct pmap *pm, vaddr_t va } done: pm_unlock(pm); + + if (opv != NULL) + pool_cache_put(&_pmap_pv_pool, opv); } void