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
This commit is contained in:
Olivier Certner
2025-07-08 18:17:30 +02:00
parent 986edb19a4
commit 9d1f3ce79d
8 changed files with 36 additions and 17 deletions
+5
View File
@@ -9649,6 +9649,8 @@ pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, vm_offset_t va, vm_page_t m)
void void
pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma) pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
{ {
if (m->md.pat_mode == ma)
return;
m->md.pat_mode = ma; m->md.pat_mode = ma;
@@ -9668,6 +9670,9 @@ pmap_page_set_memattr_noflush(vm_page_t m, vm_memattr_t ma)
{ {
int error; int error;
if (m->md.pat_mode == ma)
return;
m->md.pat_mode = ma; m->md.pat_mode = ma;
if ((m->flags & PG_FICTITIOUS) != 0) if ((m->flags & PG_FICTITIOUS) != 0)
+1 -3
View File
@@ -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, CTR5(KTR_PMAP, "%s: page %p - 0x%08X oma: %d, ma: %d", __func__, m,
VM_PAGE_TO_PHYS(m), oma, ma); VM_PAGE_TO_PHYS(m), oma, ma);
if ((m->flags & PG_FICTITIOUS) != 0) if (ma == oma || (m->flags & PG_FICTITIOUS) != 0)
return; return;
#if 0 #if 0
/* /*
@@ -5784,7 +5784,6 @@ pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
* If page is not mapped by sf buffer, map the page * If page is not mapped by sf buffer, map the page
* transient and do invalidation. * transient and do invalidation.
*/ */
if (ma != oma) {
pa = VM_PAGE_TO_PHYS(m); pa = VM_PAGE_TO_PHYS(m);
sched_pin(); sched_pin();
pc = get_pcpu(); pc = get_pcpu();
@@ -5800,7 +5799,6 @@ pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
sched_unpin(); sched_unpin();
mtx_unlock(&pc->pc_cmap_lock); mtx_unlock(&pc->pc_cmap_lock);
} }
}
/* /*
* Miscellaneous support routines follow * Miscellaneous support routines follow
+2
View File
@@ -8045,6 +8045,8 @@ pmap_unmapbios(void *p, vm_size_t size)
void void
pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma) pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
{ {
if (m->md.pv_memattr == ma)
return;
m->md.pv_memattr = ma; m->md.pv_memattr = ma;
+2
View File
@@ -5617,6 +5617,8 @@ __CONCAT(PMTYPE, unmapdev)(void *p, vm_size_t size)
static void static void
__CONCAT(PMTYPE, page_set_memattr)(vm_page_t m, vm_memattr_t ma) __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; m->md.pat_mode = ma;
if ((m->flags & PG_FICTITIOUS) != 0) if ((m->flags & PG_FICTITIOUS) != 0)
+3
View File
@@ -1469,6 +1469,9 @@ moea_page_set_memattr(vm_page_t m, vm_memattr_t ma)
pmap_t pmap; pmap_t pmap;
u_int lo; u_int lo;
if (m->md.mdpg_cache_attrs == ma)
return;
if ((m->oflags & VPO_UNMANAGED) != 0) { if ((m->oflags & VPO_UNMANAGED) != 0) {
m->md.mdpg_cache_attrs = ma; m->md.mdpg_cache_attrs = ma;
return; return;
+3
View File
@@ -2134,6 +2134,9 @@ moea64_page_set_memattr(vm_page_t m, vm_memattr_t ma)
CTR3(KTR_PMAP, "%s: pa=%#jx, ma=%#x", CTR3(KTR_PMAP, "%s: pa=%#jx, ma=%#x",
__func__, (uintmax_t)VM_PAGE_TO_PHYS(m), ma); __func__, (uintmax_t)VM_PAGE_TO_PHYS(m), ma);
if (m->md.mdpg_cache_attrs == ma)
return;
if ((m->oflags & VPO_UNMANAGED) != 0) { if ((m->oflags & VPO_UNMANAGED) != 0) {
m->md.mdpg_cache_attrs = ma; m->md.mdpg_cache_attrs = ma;
return; return;
+4
View File
@@ -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); CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, m, ma);
if (m->md.mdpg_cache_attrs == ma)
return;
m->md.mdpg_cache_attrs = ma; m->md.mdpg_cache_attrs = ma;
/* /*
+2
View File
@@ -4838,6 +4838,8 @@ pmap_unmapbios(void *p, vm_size_t size)
void void
pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma) pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
{ {
if (m->md.pv_memattr == ma)
return;
m->md.pv_memattr = ma; m->md.pv_memattr = ma;