The branch main has been updated by alc:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=3687797618b6c978ad733bd206a623e5df47dbe3

commit 3687797618b6c978ad733bd206a623e5df47dbe3
Author:     Alan Cox <a...@freebsd.org>
AuthorDate: 2021-07-24 08:50:27 +0000
Commit:     Alan Cox <a...@freebsd.org>
CommitDate: 2021-07-24 18:06:47 +0000

    amd64: Don't repeat unnecessary tests when cmpset fails
    
    When a cmpset for removing the PG_RW bit in pmap_promote_pde() fails,
    there is no need to repeat the alignment, PG_A, and PG_V tests just to
    reload the PTE's value.  The only bit that we need be concerned with at
    this point is PG_M.  Use fcmpset instead.
    
    MFC after:      1 week
---
 sys/amd64/amd64/pmap.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index aea4394ebcc0..47315c560831 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -6615,7 +6615,6 @@ pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, 
vm_offset_t va,
         * within a 2MB page. 
         */
        firstpte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
-setpde:
        newpde = *firstpte;
        if ((newpde & ((PG_FRAME & PDRMASK) | PG_A | PG_V)) != (PG_A | PG_V) ||
            !pmap_allow_2m_x_page(pmap, pmap_pde_ept_executable(pmap,
@@ -6625,12 +6624,13 @@ setpde:
                    " in pmap %p", va, pmap);
                return;
        }
+setpde:
        if ((newpde & (PG_M | PG_RW)) == PG_RW) {
                /*
                 * When PG_M is already clear, PG_RW can be cleared without
                 * a TLB invalidation.
                 */
-               if (!atomic_cmpset_long(firstpte, newpde, newpde & ~PG_RW))
+               if (!atomic_fcmpset_long(firstpte, &newpde, newpde & ~PG_RW))
                        goto setpde;
                newpde &= ~PG_RW;
        }
@@ -6642,7 +6642,6 @@ setpde:
         */
        pa = (newpde & (PG_PS_FRAME | PG_A | PG_V)) + NBPDR - PAGE_SIZE;
        for (pte = firstpte + NPTEPG - 1; pte > firstpte; pte--) {
-setpte:
                oldpte = *pte;
                if ((oldpte & (PG_FRAME | PG_A | PG_V)) != pa) {
                        counter_u64_add(pmap_pde_p_failures, 1);
@@ -6650,12 +6649,13 @@ setpte:
                            " in pmap %p", va, pmap);
                        return;
                }
+setpte:
                if ((oldpte & (PG_M | PG_RW)) == PG_RW) {
                        /*
                         * When PG_M is already clear, PG_RW can be cleared
                         * without a TLB invalidation.
                         */
-                       if (!atomic_cmpset_long(pte, oldpte, oldpte & ~PG_RW))
+                       if (!atomic_fcmpset_long(pte, &oldpte, oldpte & ~PG_RW))
                                goto setpte;
                        oldpte &= ~PG_RW;
                        CTR2(KTR_PMAP, "pmap_promote_pde: protect for va %#lx"
_______________________________________________
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