diff options
author | alc <alc@FreeBSD.org> | 2005-11-13 02:17:05 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2005-11-13 02:17:05 +0000 |
commit | 29e067429cebcc0b5e2ff2eb02256c941ceab3a0 (patch) | |
tree | a16e10b52bb7f5f50f3ca5f535808b63d4d0b1f9 /sys/alpha | |
parent | 37b68acabbddca178948dd57d7b3ffc16edf8cd2 (diff) | |
download | FreeBSD-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.c | 5 |
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); |