The branch main has been updated by olce:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=9d1f3ce79d85855399663e3977766ec46f28cadd

commit 9d1f3ce79d85855399663e3977766ec46f28cadd
Author:     Olivier Certner <o...@freebsd.org>
AuthorDate: 2025-07-08 16:17:30 +0000
Commit:     Olivier Certner <o...@freebsd.org>
CommitDate: 2025-07-13 07:13:25 +0000

    pmap: Degrade pmap_page_set_attr*() into a no-op on same attribute
    
    For 32-bit arm, move the no-op test that was already in place at start
    of the function so that it stays first even if the '#if 0' block around
    the call to sf_buf_invalidate_cache() is uncommented at some point (if
    ever).
    
    Reviewed by:    jeffpc_josefsipek.net, kib
    MFC after:      10 days
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D51253
---
 sys/amd64/amd64/pmap.c      |  5 +++++
 sys/arm/arm/pmap-v6.c       | 32 +++++++++++++++-----------------
 sys/arm64/arm64/pmap.c      |  2 ++
 sys/i386/i386/pmap.c        |  2 ++
 sys/powerpc/aim/mmu_oea.c   |  3 +++
 sys/powerpc/aim/mmu_oea64.c |  3 +++
 sys/powerpc/aim/mmu_radix.c |  4 ++++
 sys/riscv/riscv/pmap.c      |  2 ++
 8 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 9c985df13ddf..fd02d1ad6690 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -9649,6 +9649,8 @@ pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, 
vm_offset_t va, vm_page_t m)
 void
 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
 {
+       if (m->md.pat_mode == ma)
+               return;
 
        m->md.pat_mode = ma;
 
@@ -9668,6 +9670,9 @@ pmap_page_set_memattr_noflush(vm_page_t m, vm_memattr_t 
ma)
 {
        int error;
 
+       if (m->md.pat_mode == ma)
+               return;
+
        m->md.pat_mode = ma;
 
        if ((m->flags & PG_FICTITIOUS) != 0)
diff --git a/sys/arm/arm/pmap-v6.c b/sys/arm/arm/pmap-v6.c
index 92eb0589f80b..78883296c5b7 100644
--- a/sys/arm/arm/pmap-v6.c
+++ b/sys/arm/arm/pmap-v6.c
@@ -5767,7 +5767,7 @@ pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
 
        CTR5(KTR_PMAP, "%s: page %p - 0x%08X oma: %d, ma: %d", __func__, m,
            VM_PAGE_TO_PHYS(m), oma, ma);
-       if ((m->flags & PG_FICTITIOUS) != 0)
+       if (ma == oma || (m->flags & PG_FICTITIOUS) != 0)
                return;
 #if 0
        /*
@@ -5784,22 +5784,20 @@ pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
         * If page is not mapped by sf buffer, map the page
         * transient and do invalidation.
         */
-       if (ma != oma) {
-               pa = VM_PAGE_TO_PHYS(m);
-               sched_pin();
-               pc = get_pcpu();
-               cmap2_pte2p = pc->pc_cmap2_pte2p;
-               mtx_lock(&pc->pc_cmap_lock);
-               if (pte2_load(cmap2_pte2p) != 0)
-                       panic("%s: CMAP2 busy", __func__);
-               pte2_store(cmap2_pte2p, PTE2_KERN_NG(pa, PTE2_AP_KRW,
-                   vm_memattr_to_pte2(ma)));
-               dcache_wbinv_poc((vm_offset_t)pc->pc_cmap2_addr, pa, PAGE_SIZE);
-               pte2_clear(cmap2_pte2p);
-               tlb_flush((vm_offset_t)pc->pc_cmap2_addr);
-               sched_unpin();
-               mtx_unlock(&pc->pc_cmap_lock);
-       }
+       pa = VM_PAGE_TO_PHYS(m);
+       sched_pin();
+       pc = get_pcpu();
+       cmap2_pte2p = pc->pc_cmap2_pte2p;
+       mtx_lock(&pc->pc_cmap_lock);
+       if (pte2_load(cmap2_pte2p) != 0)
+               panic("%s: CMAP2 busy", __func__);
+       pte2_store(cmap2_pte2p, PTE2_KERN_NG(pa, PTE2_AP_KRW,
+           vm_memattr_to_pte2(ma)));
+       dcache_wbinv_poc((vm_offset_t)pc->pc_cmap2_addr, pa, PAGE_SIZE);
+       pte2_clear(cmap2_pte2p);
+       tlb_flush((vm_offset_t)pc->pc_cmap2_addr);
+       sched_unpin();
+       mtx_unlock(&pc->pc_cmap_lock);
 }
 
 /*
diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
index d2e56a270f54..dbd1ed7b316b 100644
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -8045,6 +8045,8 @@ pmap_unmapbios(void *p, vm_size_t size)
 void
 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
 {
+       if (m->md.pv_memattr == ma)
+               return;
 
        m->md.pv_memattr = ma;
 
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 465b4d0f365b..5065b7e61ee8 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -5617,6 +5617,8 @@ __CONCAT(PMTYPE, unmapdev)(void *p, vm_size_t size)
 static void
 __CONCAT(PMTYPE, page_set_memattr)(vm_page_t m, vm_memattr_t ma)
 {
+       if (m->md.pat_mode == ma)
+               return;
 
        m->md.pat_mode = ma;
        if ((m->flags & PG_FICTITIOUS) != 0)
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index 7746b668265d..ae17b3289593 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -1469,6 +1469,9 @@ moea_page_set_memattr(vm_page_t m, vm_memattr_t ma)
        pmap_t  pmap;
        u_int   lo;
 
+       if (m->md.mdpg_cache_attrs == ma)
+               return;
+
        if ((m->oflags & VPO_UNMANAGED) != 0) {
                m->md.mdpg_cache_attrs = ma;
                return;
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index 79cea408bb5f..796b1719b8ba 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -2134,6 +2134,9 @@ moea64_page_set_memattr(vm_page_t m, vm_memattr_t ma)
        CTR3(KTR_PMAP, "%s: pa=%#jx, ma=%#x",
            __func__, (uintmax_t)VM_PAGE_TO_PHYS(m), ma);
 
+       if (m->md.mdpg_cache_attrs == ma)
+               return;
+
        if ((m->oflags & VPO_UNMANAGED) != 0) {
                m->md.mdpg_cache_attrs = ma;
                return;
diff --git a/sys/powerpc/aim/mmu_radix.c b/sys/powerpc/aim/mmu_radix.c
index 45f7bef8bcc9..a12142fc2d7b 100644
--- a/sys/powerpc/aim/mmu_radix.c
+++ b/sys/powerpc/aim/mmu_radix.c
@@ -5937,6 +5937,10 @@ mmu_radix_page_set_memattr(vm_page_t m, vm_memattr_t ma)
 {
 
        CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, m, ma);
+
+       if (m->md.mdpg_cache_attrs == ma)
+               return;
+
        m->md.mdpg_cache_attrs = ma;
 
        /*
diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c
index 5d15bd671285..26efaecc64d1 100644
--- a/sys/riscv/riscv/pmap.c
+++ b/sys/riscv/riscv/pmap.c
@@ -4838,6 +4838,8 @@ pmap_unmapbios(void *p, vm_size_t size)
 void
 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
 {
+       if (m->md.pv_memattr == ma)
+               return;
 
        m->md.pv_memattr = ma;
 

Reply via email to