From nobody Sun Aug 10 00:42:42 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 4bzzWQ73czz64n0K; Sun, 10 Aug 2025 00:42:42 +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 4bzzWQ6Pp0z3lWf; Sun, 10 Aug 2025 00:42:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754786562; 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=Qxt5udMhEavXad0TwJw4sZ8H8o4jn5sopL0t1zELqnw=; b=KyToJcdMwqoXLqIRsHbRhQLAgHBdkazsBv87ifsAA5ymVXrWp652SiswygjWndeD4o76Nv sjWgosBCEGUMvBTUOvxNPDLUb+PYVtzhNEetFFufdh6c04SNBONXg+MVmIVUIvSNIZkcSo 5oEQ/1DRhvDfm5zQom5dH5Z2I4tqIP6cyeLeyHv9ujmO4nEFPpDbtfuWE3HLT/k1F3lDCp qYXNLIb1An43ILO9d4BxPyNcZ/XwH0UAMwqlsmeDHsCm+p6+Rqk3FXE3NCAodmZn6Q71cv aDMACm+S3ImjR6vPesPOhic2RHbuEm+qz0ASKJJQrJyeaQ76VrrX0v34Qa0qaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754786562; 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=Qxt5udMhEavXad0TwJw4sZ8H8o4jn5sopL0t1zELqnw=; b=PtW1dKPPMGttGR18Zbjjpb6Q0NYA9MMwmEAdNtKPVCEj1L7MTqX+sEDhFBE7U2m+oB7c/0 NuRWwPNK3cq8CFMlf2zOX9q36CZI2Ju3UZVQ4NCDtfH2wV+t+XAT7ktTR7V/brZKWgV4Pe nfpRaSsXUXxNn3C8iqKBsECkkmvzZSy90t8E9U8af6EVsCyVs1rvLE+p5RzaHxLmlvA3wK Z+ciqYzloBKaj6xnoJcVDUuz5eYB1EftVoduqkOPtzJlP5vec1RPWcjrb9kwwHvh+HG7eA 9TpF0OJIX0x3XOxN7eLUzn/XshxX6nwgCQ9FXkEpkUCDiD/Mw4m7Aea7tnfwvQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754786562; a=rsa-sha256; cv=none; b=f58hPg7+UPxsXRoYBPuwisW/F7jiAZ3pL8H2fabpOxQ+PC9suCQx/eegc5fps6zwSFkcvs OHT1nBZ8qT4TA5DltO3ufrYJgAcqxI5cpBtMEzEjO6Mfu5w291u4Zd60oZv4MAUTy5iZeB Cq8OuqiUeogIS56VlQZo0dvwCzCA5cIqbMC9yC27KNTG1RZkMBoAR/dhbUc6MYbHKP+i6O 91ItHEuDioZgzuIqGQRxX23E8XEnBaIEGmhZJCATQ5V8FaAjEzhcAH96HsoJMBjw+4U3t/ dJluDDuWMxM3p4fFvpjku8wuxiLd2Ko4tkf6cJFTTSvESbDDIHxB5AOawdiszw== 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 4bzzWQ5vbxzkrK; Sun, 10 Aug 2025 00:42:42 +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 57A0ggjG091314; Sun, 10 Aug 2025 00:42:42 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 57A0ggo1091311; Sun, 10 Aug 2025 00:42:42 GMT (envelope-from git) Date: Sun, 10 Aug 2025 00:42:42 GMT Message-Id: <202508100042.57A0ggo1091311@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Alan Cox Subject: git: b84a0aa00881 - stable/14 - 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/stable/14 X-Git-Reftype: branch X-Git-Commit: b84a0aa00881ee6ded6e9693db1be6d6dd8b8e52 Auto-Submitted: auto-generated The branch stable/14 has been updated by alc: URL: https://cgit.FreeBSD.org/src/commit/?id=b84a0aa00881ee6ded6e9693db1be6d6dd8b8e52 commit b84a0aa00881ee6ded6e9693db1be6d6dd8b8e52 Author: Alan Cox AuthorDate: 2025-07-07 20:29:40 +0000 Commit: Alan Cox CommitDate: 2025-08-10 00:03:14 +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. (cherry picked from commit b87aa791533fd3fc8096faa837264761ed7f4a8c) --- 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 b818fc6979d3..86773ad1294e 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -1338,7 +1338,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); @@ -6162,8 +6162,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; @@ -6171,12 +6170,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; @@ -6206,7 +6201,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; @@ -6246,9 +6241,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), @@ -6259,6 +6252,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)); } @@ -7563,8 +7564,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 { @@ -7574,10 +7575,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);