commits-src-main+help@freebsd.org> List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 2d6923790b16785ac691cedb23234067672fe1cc Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=2d6923790b16785ac691cedb23234067672fe1cc commit 2d6923790b16785ac691cedb23234067672fe1cc Author: Konstantin Belousov AuthorDate: 2024-11-23 21:02:25 +0000 Commit: Konstantin Belousov CommitDate: 2024-11-25 12:16:50 +0000 amd64 pmap: assert and explain why pmap_qremove() is safe WRT supermappings Based on alc@ comments from https://reviews.freebsd.org/D47678. Reviewed by: alc Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D47717 --- sys/amd64/amd64/pmap.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 3b7220369b61..21b8555b5380 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -4082,7 +4082,19 @@ pmap_qremove(vm_offset_t sva, int count) va = sva; while (count-- > 0) { + /* + * pmap_enter() calls within the kernel virtual + * address space happen on virtual addresses from + * subarenas that import superpage-sized and -aligned + * address ranges. So, the virtual address that we + * allocate to use with pmap_qenter() can't be close + * enough to one of those pmap_enter() calls for it to + * be caught up in a promotion. + */ KASSERT(va >= VM_MIN_KERNEL_ADDRESS, ("usermode va %lx", va)); + KASSERT((*vtopde(va) & X86_PG_PS) == 0, + ("pmap_qremove on promoted va %#lx", va)); + pmap_kremove(va); va += PAGE_SIZE; }