The branch main has been updated by alc:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=1a8bcf30f97e6153def2af781db2fe54f5c0d106

commit 1a8bcf30f97e6153def2af781db2fe54f5c0d106
Author:     Alan Cox <a...@freebsd.org>
AuthorDate: 2021-06-30 05:59:21 +0000
Commit:     Alan Cox <a...@freebsd.org>
CommitDate: 2021-06-30 18:12:25 +0000

    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
---
 sys/amd64/amd64/pmap.c | 8 ++------
 1 file 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;
                        }
                }
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to