From nobody Mon Jul 14 00:29:07 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bgNVC6rfFz61hXK; Mon, 14 Jul 2025 00:29:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bgNVC3NPpz3s0l; Mon, 14 Jul 2025 00:29:07 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1752452947; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7fUnhZAWzjaA4FdGkzeZFiZ6k/yKje6BvXedS0OTQKY=; b=pbh3r3SdgFJ+a6qPAZ+V1fCq3YYzex0rruyPJoAsdZQrZTBWRpDHe4x9kETpRBVxuoAAPL myFLzdxcrJsfW2X7zwzPW6UzpCoAz3p7x5n/0JXn43+jB5/6ydCDhJZYINOF89S/Vwcoji PzfGlFSbkpm0WBj/B+iUS/cCxoe7hPXKHRrdkThOkMS69KpeFDarP6z0vIOEUiI1TpYcUC 56rB8eTRve2Azk8sIIKMdem+Wa45q+10FNLVyW/30UK34rYKWUBqMi5907a4vluUzi5F7z eFyVg+yqI7r1JvxvSs5I8xZPQfvaoCPDWOcSLZkPETnDDRuh0U0rs6Zhab3TGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1752452947; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7fUnhZAWzjaA4FdGkzeZFiZ6k/yKje6BvXedS0OTQKY=; b=eVWG5GfeKl2MMJu9FA5zOvpONyHhe1ngQXJzvOXSOo1BllkbP/yjK/L1opmwV7K9tBZq46 2P4fGwgFq9zjiBYMydCS+uMAuZWtwohO5b++FqkeIZBuujWpRQXciSVbljhZPcwXOS2Bez spINOObYkSAJM2zE3vOys4bsyGomYcbZ1ENrc5OaBXMHaImuyS7H8M9KorlpIrLat07HXt Anf4jUEpsOvhJ/xJpLBMWVhk10z6F1p37ggz0XouEV7q3QLcl67n6kLM36CBK2Nn5O8BYk kKz/iw1z9X1fWjBzJ8pyokpA5+BN6ELt+EoZosysH0wJU1U7ldcRoud81OnZcw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1752452947; a=rsa-sha256; cv=none; b=MvqXsvqqvlV5KQ1SA2w8220zu3ZMM5tqNG0Iq5uiKSUkeQcyg8Lo4gq49kBhhcADzrqZAp BEqd5nQovcHeBVrypgvJFgsObtKn2KzFyL7yp7ukkf8I8hL+C8c4qA0UpvCdSqWE5Y2UCc InwPkDZn44pGrxl1GHWQMI2QJMVk/VDGD41sYELDANqXLztrCYNU5MLiSVSHePKWbZwd+U DB67gwBi5ynRd6qi1oLRy5IyFe5X8VYNAfo+kYcXAyaddxdNwQ2+I7i2cRd4m3csEv+Pm7 V/fPNYVA1hCL4uFzmRv5InLSPOKJ1in54HdnBqyw9Z1bbOb4m3qh8y5DC9jOsw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bgNVC2r4ZzXKQ; Mon, 14 Jul 2025 00:29:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 56E0T7Us022904; Mon, 14 Jul 2025 00:29:07 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 56E0T7GY022901; Mon, 14 Jul 2025 00:29:07 GMT (envelope-from git) Date: Mon, 14 Jul 2025 00:29:07 GMT Message-Id: <202507140029.56E0T7GY022901@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Alan Cox Subject: git: b87aa791533f - main - amd64 pmap: simplify recent changes to pmap_enter_pde() List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: alc X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: b87aa791533fd3fc8096faa837264761ed7f4a8c Auto-Submitted: auto-generated The branch main has been updated by alc: URL: https://cgit.FreeBSD.org/src/commit/?id=b87aa791533fd3fc8096faa837264761ed7f4a8c commit b87aa791533fd3fc8096faa837264761ed7f4a8c Author: Alan Cox AuthorDate: 2025-07-07 20:29:40 +0000 Commit: Alan Cox CommitDate: 2025-07-14 00:23:49 +0000 amd64 pmap: simplify recent changes to pmap_enter_pde() When pmap_enter_pde() removes an existing 2MB page mapping within the kernel address space, do not remap the kernel page table page since it will shortly be unmapped. Simply zero it. Eliminate an unnecessary conditional refcount decrement on what must be a kernel page table page. (We only utilize this refcount on user-space page table pages.) Convert an assertion from a panic to a KASSERT. Reviewed by: kib, markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D51235 --- sys/amd64/amd64/pmap.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index fd02d1ad6690..c3e3a91b20ec 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -1336,7 +1336,7 @@ static pdp_entry_t *pmap_pti_pdpe(vm_offset_t va); static pd_entry_t *pmap_pti_pde(vm_offset_t va); static void pmap_pti_wire_pte(void *pte); static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, - bool remove_pt, struct spglist *free, struct rwlock **lockp); + bool demote_kpde, struct spglist *free, struct rwlock **lockp); static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva, pd_entry_t ptepde, struct spglist *free, struct rwlock **lockp); static vm_page_t pmap_remove_pt_page(pmap_t pmap, vm_offset_t va); @@ -6165,8 +6165,7 @@ pmap_demote_pde_mpte(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, * pmap_remove_kernel_pde: Remove a kernel superpage mapping. */ static void -pmap_remove_kernel_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, - bool remove_pt) +pmap_remove_kernel_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) { pd_entry_t newpde; vm_paddr_t mptepa; @@ -6174,12 +6173,8 @@ pmap_remove_kernel_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, KASSERT(pmap == kernel_pmap, ("pmap %p is not kernel_pmap", pmap)); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - if (remove_pt) - mpte = pmap_remove_pt_page(pmap, va); - else - mpte = vm_radix_lookup(&pmap->pm_root, pmap_pde_pindex(va)); - if (mpte == NULL) - panic("pmap_remove_kernel_pde: Missing pt page."); + mpte = pmap_remove_pt_page(pmap, va); + KASSERT(mpte != NULL, ("pmap_remove_kernel_pde: missing pt page")); mptepa = VM_PAGE_TO_PHYS(mpte); newpde = mptepa | X86_PG_M | X86_PG_A | X86_PG_RW | X86_PG_V; @@ -6209,7 +6204,7 @@ pmap_remove_kernel_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, * pmap_remove_pde: do the things to unmap a superpage in a process */ static int -pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, bool remove_pt, +pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, bool demote_kpde, struct spglist *free, struct rwlock **lockp) { struct md_page *pvh; @@ -6249,9 +6244,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, bool remove_pt, pmap_delayed_invl_page(m); } } - if (pmap == kernel_pmap) { - pmap_remove_kernel_pde(pmap, pdq, sva, remove_pt); - } else { + if (pmap != kernel_pmap) { mpte = pmap_remove_pt_page(pmap, sva); if (mpte != NULL) { KASSERT(vm_page_any_valid(mpte), @@ -6262,6 +6255,14 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, bool remove_pt, mpte->ref_count = 0; pmap_add_delayed_free_list(mpte, free, false); } + } else if (demote_kpde) { + pmap_remove_kernel_pde(pmap, pdq, sva); + } else { + mpte = vm_radix_lookup(&pmap->pm_root, pmap_pde_pindex(sva)); + if (vm_page_any_valid(mpte)) { + mpte->valid = 0; + pmap_zero_page(mpte); + } } return (pmap_unuse_pt(pmap, sva, *pmap_pdpe(pmap, sva), free)); } @@ -7573,8 +7574,8 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde, u_int flags, * the mapping is not from kernel_pmap, then * a reserved PT page could be freed. */ - (void)pmap_remove_pde(pmap, pde, va, - pmap != kernel_pmap, &free, lockp); + (void)pmap_remove_pde(pmap, pde, va, false, &free, + lockp); if ((oldpde & PG_G) == 0) pmap_invalidate_pde_page(pmap, va, oldpde); } else { @@ -7584,10 +7585,9 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde, u_int flags, * before any changes to mappings are * made. Abort on failure. */ - mt = PHYS_TO_VM_PAGE(*pde & PG_FRAME); - if (pmap_insert_pt_page(pmap, mt, false, false)) { - if (pdpg != NULL) - pdpg->ref_count--; + mt = PHYS_TO_VM_PAGE(oldpde & PG_FRAME); + if (pmap_insert_pt_page(pmap, mt, false, + false)) { CTR1(KTR_PMAP, "pmap_enter_pde: cannot ins kern ptp va %#lx", va);