aboutsummaryrefslogtreecommitdiff
path: root/sys/powerpc/aim/mmu_oea.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2019-10-16 07:09:15 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2019-10-16 07:09:15 +0000
commit2a499f92ba5f184036e6455fda2ba8a05e153d73 (patch)
treee0f49296aea6f95fd5fdab5bbba55417727cbb04 /sys/powerpc/aim/mmu_oea.c
parent0c4f60b734311ebe2d1b23b2937f0418c3fb8704 (diff)
downloadsrc-2a499f92ba5f184036e6455fda2ba8a05e153d73.tar.gz
src-2a499f92ba5f184036e6455fda2ba8a05e153d73.zip
Fix assert in PowerPC pmaps after introduction of object busy.
The VM_PAGE_OBJECT_BUSY_ASSERT() in pmap_enter() implementation should be only asserted when the code is executed as result of pmap_enter(), not when the same code is entered from e.g. pmap_enter_quick(). This is relevant for all PowerPC pmap variants, because mmu_*_enter() is used as the backend, and assert is located there. Add a PowerPC private pmap_enter() PMAP_ENTER_QUICK_LOCKED flag to indicate that the call is not from pmap_enter(). For non-quick-locked calls, assert that the object is locked. Reported and tested by: bdragon Reviewed by: alc, bdragon, markj Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D22041
Notes
Notes: svn path=/head/; revision=353622
Diffstat (limited to 'sys/powerpc/aim/mmu_oea.c')
-rw-r--r--sys/powerpc/aim/mmu_oea.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index 145873fe7100..1cc4520e1269 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -1149,8 +1149,12 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
if (pmap_bootstrapped)
rw_assert(&pvh_global_lock, RA_WLOCKED);
PMAP_LOCK_ASSERT(pmap, 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);
+ }
if ((m->oflags & VPO_UNMANAGED) != 0 || !moea_initialized) {
pvo_head = &moea_pvo_kunmanaged;
@@ -1218,7 +1222,8 @@ moea_enter_object(mmu_t mmu, pmap_t pm, vm_offset_t start, vm_offset_t end,
PMAP_LOCK(pm);
while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
moea_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(&pvh_global_lock);
@@ -1233,7 +1238,7 @@ moea_enter_quick(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_page_t m,
rw_wlock(&pvh_global_lock);
PMAP_LOCK(pm);
moea_enter_locked(pm, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE),
- 0, 0);
+ PMAP_ENTER_QUICK_LOCKED, 0);
rw_wunlock(&pvh_global_lock);
PMAP_UNLOCK(pm);
}