diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2019-10-16 21:07:18 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2019-10-16 21:07:18 +0000 |
| commit | 96448820a3dab2b05694e7c42a72231c92ddadfb (patch) | |
| tree | 13381b81648bb076e8f6b1cb3d622f36eba4890a | |
| parent | 1dc85563587263c6b3c7d04dfdcbdc17865b5e8b (diff) | |
Notes
| -rw-r--r-- | sys/arm/arm/pmap-v4.c | 13 | ||||
| -rw-r--r-- | sys/arm/include/pmap.h | 2 | ||||
| -rw-r--r-- | sys/sparc64/include/pmap.h | 1 | ||||
| -rw-r--r-- | sys/sparc64/sparc64/pmap.c | 13 |
4 files changed, 21 insertions, 8 deletions
diff --git a/sys/arm/arm/pmap-v4.c b/sys/arm/arm/pmap-v4.c index 8b6abb39bf783..c5ec71382fa89 100644 --- a/sys/arm/arm/pmap-v4.c +++ b/sys/arm/arm/pmap-v4.c @@ -2979,8 +2979,12 @@ pmap_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, pa = systempage.pv_pa; m = NULL; } else { - if ((m->oflags & VPO_UNMANAGED) == 0) - VM_PAGE_OBJECT_BUSY_ASSERT(m); + if ((m->oflags & VPO_UNMANAGED) == 0) { + if ((flags & PMAP_ENTER_QUICK_LOCKED) == 0) + VM_PAGE_OBJECT_BUSY_ASSERT(m); + else + VM_OBJECT_ASSERT_LOCKED(m->object); + } pa = VM_PAGE_TO_PHYS(m); } nflags = 0; @@ -3253,7 +3257,8 @@ pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, PMAP_LOCK(pmap); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { pmap_enter_locked(pmap, start + ptoa(diff), m, prot & - (VM_PROT_READ | VM_PROT_EXECUTE), PMAP_ENTER_NOSLEEP); + (VM_PROT_READ | VM_PROT_EXECUTE), PMAP_ENTER_NOSLEEP | + PMAP_ENTER_QUICK_LOCKED); m = TAILQ_NEXT(m, listq); } rw_wunlock(&pvh_global_lock); @@ -3276,7 +3281,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); pmap_enter_locked(pmap, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), - PMAP_ENTER_NOSLEEP); + PMAP_ENTER_NOSLEEP | PMAP_ENTER_QUICK_LOCKED); rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } diff --git a/sys/arm/include/pmap.h b/sys/arm/include/pmap.h index dfdd4f17ba02b..e7fd53e5c42f6 100644 --- a/sys/arm/include/pmap.h +++ b/sys/arm/include/pmap.h @@ -75,5 +75,7 @@ pmap_vmspace_copy(pmap_t dst_pmap __unused, pmap_t src_pmap __unused) return (0); } +#define PMAP_ENTER_QUICK_LOCKED 0x10000000 + #endif /* _KERNEL */ #endif /* !_MACHINE_PMAP_H_ */ diff --git a/sys/sparc64/include/pmap.h b/sys/sparc64/include/pmap.h index c2d88d461363c..20905acc84247 100644 --- a/sys/sparc64/include/pmap.h +++ b/sys/sparc64/include/pmap.h @@ -50,6 +50,7 @@ #include <machine/tte.h> #define PMAP_CONTEXT_MAX 8192 +#define PMAP_ENTER_QUICK_LOCKED 0x10000000 typedef struct pmap *pmap_t; diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c index 5a25117791404..c26f840d366ff 100644 --- a/sys/sparc64/sparc64/pmap.c +++ b/sys/sparc64/sparc64/pmap.c @@ -1500,8 +1500,12 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, rw_assert(&tte_list_global_lock, RA_WLOCKED); PMAP_LOCK_ASSERT(pm, MA_OWNED); - if ((m->oflags & VPO_UNMANAGED) == 0) - VM_PAGE_OBJECT_BUSY_ASSERT(m); + if ((m->oflags & VPO_UNMANAGED) == 0) { + if ((flags & PMAP_ENTER_QUICK_LOCKED) == 0) + VM_PAGE_OBJECT_BUSY_ASSERT(m); + else + VM_OBJECT_ASSERT_LOCKED(m->object); + } PMAP_STATS_INC(pmap_nenter); pa = VM_PAGE_TO_PHYS(m); wired = (flags & PMAP_ENTER_WIRED) != 0; @@ -1649,7 +1653,8 @@ pmap_enter_object(pmap_t pm, vm_offset_t start, vm_offset_t end, PMAP_LOCK(pm); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { pmap_enter_locked(pm, start + ptoa(diff), m, prot & - (VM_PROT_READ | VM_PROT_EXECUTE), 0, 0); + (VM_PROT_READ | VM_PROT_EXECUTE), + PMAP_ENTER_QUICK_LOCKED, 0); m = TAILQ_NEXT(m, listq); } rw_wunlock(&tte_list_global_lock); @@ -1663,7 +1668,7 @@ pmap_enter_quick(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot) rw_wlock(&tte_list_global_lock); PMAP_LOCK(pm); pmap_enter_locked(pm, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), - 0, 0); + PMAP_ENTER_QUICK_LOCKED, 0); rw_wunlock(&tte_list_global_lock); PMAP_UNLOCK(pm); } |
