summaryrefslogtreecommitdiffstats
path: root/sys/alpha
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2005-11-13 02:17:05 +0000
committeralc <alc@FreeBSD.org>2005-11-13 02:17:05 +0000
commit29e067429cebcc0b5e2ff2eb02256c941ceab3a0 (patch)
treea16e10b52bb7f5f50f3ca5f535808b63d4d0b1f9 /sys/alpha
parent37b68acabbddca178948dd57d7b3ffc16edf8cd2 (diff)
downloadFreeBSD-src-29e067429cebcc0b5e2ff2eb02256c941ceab3a0.zip
FreeBSD-src-29e067429cebcc0b5e2ff2eb02256c941ceab3a0.tar.gz
In get_pv_entry() use PMAP_LOCK() instead of PMAP_TRYLOCK() when deadlock
cannot possibly occur.
Diffstat (limited to 'sys/alpha')
-rw-r--r--sys/alpha/alpha/pmap.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/alpha/alpha/pmap.c b/sys/alpha/alpha/pmap.c
index 9ce77cd..173755b 100644
--- a/sys/alpha/alpha/pmap.c
+++ b/sys/alpha/alpha/pmap.c
@@ -1338,7 +1338,10 @@ retry:
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
pmap = pv->pv_pmap;
- if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap))
+ /* Avoid deadlock and lock recursion. */
+ if (pmap > locked_pmap)
+ PMAP_LOCK(pmap);
+ else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap))
continue;
pmap->pm_stats.resident_count--;
pte = pmap_lev3pte(pmap, va);
OpenPOWER on IntegriCloud