summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2006-06-07 20:54:31 +0000
committeralc <alc@FreeBSD.org>2006-06-07 20:54:31 +0000
commit65c52763ef4b5bc508f3d3692cac821345677bf3 (patch)
tree0b9e3089ee3dbdb3fe00913527cc11b16c6c768e /sys/arm
parentf03871f3549c3890bb9b8c3a3cd97b3140919564 (diff)
downloadFreeBSD-src-65c52763ef4b5bc508f3d3692cac821345677bf3.zip
FreeBSD-src-65c52763ef4b5bc508f3d3692cac821345677bf3.tar.gz
Add pmap locking to pmap_fault_fixup().
Add an assertion to pmap_vac_me_harder(). Tested by: cognet@
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/pmap.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c
index 9016848..b681c75 100644
--- a/sys/arm/arm/pmap.c
+++ b/sys/arm/arm/pmap.c
@@ -1306,6 +1306,7 @@ pmap_vac_me_harder(struct vm_page *pg, pmap_t pm, vm_offset_t va)
{
int nattr;
+ mtx_assert(&vm_page_queue_mtx, MA_OWNED);
nattr = pmap_get_vac_flags(pg);
if (nattr < 0) {
@@ -1983,11 +1984,9 @@ pmap_fault_fixup(pmap_t pm, vm_offset_t va, vm_prot_t ftype, int user)
u_int l1idx;
int rv = 0;
-#if 0
- PMAP_MAP_TO_HEAD_LOCK();
- pmap_acquire_pmap_lock(pm);
-#endif
l1idx = L1_IDX(va);
+ vm_page_lock_queues();
+ PMAP_LOCK(pm);
/*
* If there is no l2_dtable for this address, then the process
@@ -2079,18 +2078,13 @@ pmap_fault_fixup(pmap_t pm, vm_offset_t va, vm_prot_t ftype, int user)
struct vm_page *pg;
/* Extract the physical address of the page */
- vm_page_lock_queues();
- if ((pg = PHYS_TO_VM_PAGE(pa)) == NULL) {
- vm_page_unlock_queues();
+ if ((pg = PHYS_TO_VM_PAGE(pa)) == NULL)
goto out;
- }
/* Get the current flags for this page. */
pv = pmap_find_pv(pg, pm, va);
- if (pv == NULL) {
- vm_page_unlock_queues();
+ if (pv == NULL)
goto out;
- }
pg->md.pvh_attrs |= PVF_REF;
pv->pv_flags |= PVF_REF;
@@ -2099,7 +2093,6 @@ pmap_fault_fixup(pmap_t pm, vm_offset_t va, vm_prot_t ftype, int user)
*ptep = (pte & ~L2_TYPE_MASK) | L2_S_PROTO;
PTE_SYNC(ptep);
rv = 1;
- vm_page_unlock_queues();
}
/*
@@ -2190,10 +2183,8 @@ pmap_fault_fixup(pmap_t pm, vm_offset_t va, vm_prot_t ftype, int user)
rv = 1;
out:
-#if 0
- pmap_release_pmap_lock(pm);
- PMAP_MAP_TO_HEAD_UNLOCK();
-#endif
+ vm_page_unlock_queues();
+ PMAP_UNLOCK(pm);
return (rv);
}
OpenPOWER on IntegriCloud