Date: Sat, 29 May 2021 20:15:05 GMT From: Justin Hibbits <jhibbits@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 811e645d286d - main - Apply r350463(43ded0a321a) to powerpc64 radix pmap Message-ID: <202105292015.14TKF5m8080529@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=811e645d286d0b97c02d1b66a59a76c327d46c35 commit 811e645d286d0b97c02d1b66a59a76c327d46c35 Author: Justin Hibbits <jhibbits@FreeBSD.org> AuthorDate: 2021-05-10 00:19:07 +0000 Commit: Justin Hibbits <jhibbits@FreeBSD.org> CommitDate: 2021-05-29 20:14:33 +0000 Apply r350463(43ded0a321a) to powerpc64 radix pmap Invalidate the last page of a demoted superpage mapping, instead of the first page, as it results in slightly more promotions and fewer failures. While here, replace 'boolean_t's with 'bool's in mmu_radix_advise(). --- sys/powerpc/aim/mmu_radix.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/sys/powerpc/aim/mmu_radix.c b/sys/powerpc/aim/mmu_radix.c index e86bfa94c7ae..83eda03f9556 100644 --- a/sys/powerpc/aim/mmu_radix.c +++ b/sys/powerpc/aim/mmu_radix.c @@ -2207,11 +2207,11 @@ mmu_radix_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, pt_entry_t *pte; vm_offset_t va, va_next; vm_page_t m; - boolean_t anychanged; + bool anychanged; if (advice != MADV_DONTNEED && advice != MADV_FREE) return; - anychanged = FALSE; + anychanged = false; PMAP_LOCK(pmap); for (; sva < eva; sva = va_next) { l1e = pmap_pml1e(pmap, sva); @@ -2252,17 +2252,25 @@ mmu_radix_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, /* * Unless the page mappings are wired, remove the * mapping to a single page so that a subsequent - * access may repromote. Since the underlying page - * table page is fully populated, this removal never - * frees a page table page. + * access may repromote. Choosing the last page + * within the address range [sva, min(va_next, eva)) + * generally results in more repromotions. Since the + * underlying page table page is fully populated, this + * removal never frees a page table page. */ if ((oldl3e & PG_W) == 0) { - pte = pmap_l3e_to_pte(l3e, sva); + va = eva; + if (va > va_next) + va = va_next; + va -= PAGE_SIZE; + KASSERT(va >= sva, + ("mmu_radix_advise: no address gap")); + pte = pmap_l3e_to_pte(l3e, va); KASSERT((be64toh(*pte) & PG_V) != 0, ("pmap_advise: invalid PTE")); - pmap_remove_pte(pmap, pte, sva, be64toh(*l3e), NULL, + pmap_remove_pte(pmap, pte, va, be64toh(*l3e), NULL, &lock); - anychanged = TRUE; + anychanged = true; } if (lock != NULL) rw_wunlock(lock); @@ -2291,7 +2299,7 @@ mmu_radix_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, atomic_clear_long(pte, htobe64(PG_A)); else goto maybe_invlrng; - anychanged = TRUE; + anychanged = true; continue; maybe_invlrng: if (va != va_next) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202105292015.14TKF5m8080529>