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:
@@ -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)
|
||||||
|
|||||||
+15
-17
@@ -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,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
|
* 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();
|
cmap2_pte2p = pc->pc_cmap2_pte2p;
|
||||||
cmap2_pte2p = pc->pc_cmap2_pte2p;
|
mtx_lock(&pc->pc_cmap_lock);
|
||||||
mtx_lock(&pc->pc_cmap_lock);
|
if (pte2_load(cmap2_pte2p) != 0)
|
||||||
if (pte2_load(cmap2_pte2p) != 0)
|
panic("%s: CMAP2 busy", __func__);
|
||||||
panic("%s: CMAP2 busy", __func__);
|
pte2_store(cmap2_pte2p, PTE2_KERN_NG(pa, PTE2_AP_KRW,
|
||||||
pte2_store(cmap2_pte2p, PTE2_KERN_NG(pa, PTE2_AP_KRW,
|
vm_memattr_to_pte2(ma)));
|
||||||
vm_memattr_to_pte2(ma)));
|
dcache_wbinv_poc((vm_offset_t)pc->pc_cmap2_addr, pa, PAGE_SIZE);
|
||||||
dcache_wbinv_poc((vm_offset_t)pc->pc_cmap2_addr, pa, PAGE_SIZE);
|
pte2_clear(cmap2_pte2p);
|
||||||
pte2_clear(cmap2_pte2p);
|
tlb_flush((vm_offset_t)pc->pc_cmap2_addr);
|
||||||
tlb_flush((vm_offset_t)pc->pc_cmap2_addr);
|
sched_unpin();
|
||||||
sched_unpin();
|
mtx_unlock(&pc->pc_cmap_lock);
|
||||||
mtx_unlock(&pc->pc_cmap_lock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user