git: fb32ba6aa44d - main - amd64/arm64: Eliminate unnecessary demotions in pmap_protect()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 06 Jul 2024 20:49:34 UTC
The branch main has been updated by alc: URL: https://cgit.FreeBSD.org/src/commit/?id=fb32ba6aa44dc86e70ad06b44f93a9709e78f3d1 commit fb32ba6aa44dc86e70ad06b44f93a9709e78f3d1 Author: Alan Cox <alc@FreeBSD.org> AuthorDate: 2024-07-05 18:20:01 +0000 Commit: Alan Cox <alc@FreeBSD.org> CommitDate: 2024-07-06 20:48:10 +0000 amd64/arm64: Eliminate unnecessary demotions in pmap_protect() In pmap_protect(), when the mapping isn't changing, we don't need to perform a superpage demotion, even though the requested change doesn't cover the entire superpage. Reviewed by: kib MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D45886 --- sys/amd64/amd64/pmap.c | 21 +++++++++++++++++---- sys/arm64/arm64/pmap.c | 3 ++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 57943e815b5b..2bcf671be243 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -6796,8 +6796,7 @@ retry_pdpe: */ if ((ptpaddr & PG_PS) != 0) { /* - * Are we protecting the entire large page? If not, - * demote the mapping and fall through. + * Are we protecting the entire large page? */ if (sva + NBPDR == va_next && eva >= va_next) { /* @@ -6807,9 +6806,23 @@ retry_pdpe: if (pmap_protect_pde(pmap, pde, sva, prot)) anychanged = true; continue; - } else if (!pmap_demote_pde(pmap, pde, sva)) { + } + + /* + * Does the large page mapping need to change? If so, + * demote it and fall through. + */ + pbits = ptpaddr; + if ((prot & VM_PROT_WRITE) == 0) + pbits &= ~(PG_RW | PG_M); + if ((prot & VM_PROT_EXECUTE) == 0) + pbits |= pg_nx; + if (ptpaddr == pbits || !pmap_demote_pde(pmap, pde, + sva)) { /* - * The large page mapping was destroyed. + * Either the large page mapping doesn't need + * to change, or it was destroyed during + * demotion. */ continue; } diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index a9cb8c7fe468..29552f722aa4 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -4373,7 +4373,8 @@ pmap_mask_set_locked(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, pt_entry_t m if (sva + L2_SIZE == va_next && eva >= va_next) { pmap_protect_l2(pmap, l2, sva, mask, nbits); continue; - } else if (pmap_demote_l2(pmap, l2, sva) == NULL) + } else if ((pmap_load(l2) & mask) == nbits || + pmap_demote_l2(pmap, l2, sva) == NULL) continue; } KASSERT((pmap_load(l2) & ATTR_DESCR_MASK) == L2_TABLE,