aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2021-06-30 05:59:21 +0000
committerAlan Cox <alc@FreeBSD.org>2021-06-30 18:12:25 +0000
commit1a8bcf30f97e6153def2af781db2fe54f5c0d106 (patch)
treeea0f2a953090305a28561e07a55d96a4a4104f7a
parent3f197b101f71ee4f4949c53bf330f61b43749ce9 (diff)
downloadsrc-1a8bcf30f97e6153def2af781db2fe54f5c0d106.tar.gz
src-1a8bcf30f97e6153def2af781db2fe54f5c0d106.zip
amd64: a simplication to pmap_remove_{all,write}
Eliminate some unnecessary unlocking and relocking when we have to retry the operation to avoid deadlock. (All of the other pmap functions that iterate over a PV list already implemented retries without these same unlocking and relocking operations.) Reviewed by: kib, markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D30951
-rw-r--r--sys/amd64/amd64/pmap.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index a4046cc1f687..ea017b8a61a8 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -6307,8 +6307,8 @@ pmap_remove_all(vm_page_t m)
lock = VM_PAGE_TO_PV_LIST_LOCK(m);
pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
pa_to_pvh(VM_PAGE_TO_PHYS(m));
-retry:
rw_wlock(lock);
+retry:
while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) {
pmap = PV_PMAP(pv);
if (!PMAP_TRYLOCK(pmap)) {
@@ -6317,7 +6317,6 @@ retry:
PMAP_LOCK(pmap);
rw_wlock(lock);
if (pvh_gen != pvh->pv_gen) {
- rw_wunlock(lock);
PMAP_UNLOCK(pmap);
goto retry;
}
@@ -6336,7 +6335,6 @@ retry:
PMAP_LOCK(pmap);
rw_wlock(lock);
if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
- rw_wunlock(lock);
PMAP_UNLOCK(pmap);
goto retry;
}
@@ -8460,8 +8458,8 @@ pmap_remove_write(vm_page_t m)
lock = VM_PAGE_TO_PV_LIST_LOCK(m);
pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
pa_to_pvh(VM_PAGE_TO_PHYS(m));
-retry_pv_loop:
rw_wlock(lock);
+retry_pv_loop:
TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
pmap = PV_PMAP(pv);
if (!PMAP_TRYLOCK(pmap)) {
@@ -8471,7 +8469,6 @@ retry_pv_loop:
rw_wlock(lock);
if (pvh_gen != pvh->pv_gen) {
PMAP_UNLOCK(pmap);
- rw_wunlock(lock);
goto retry_pv_loop;
}
}
@@ -8496,7 +8493,6 @@ retry_pv_loop:
if (pvh_gen != pvh->pv_gen ||
md_gen != m->md.pv_gen) {
PMAP_UNLOCK(pmap);
- rw_wunlock(lock);
goto retry_pv_loop;
}
}