From nobody Sat Jul 05 08:36:43 2025 X-Original-To: dev-commits-src-main@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 4bZ3kz5QDgz61NPV; Sat, 05 Jul 2025 08:36:43 +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 4bZ3kz3Hv9z3pYC; Sat, 05 Jul 2025 08:36:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1751704603; 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=/f5ui/XrQQHvBTOXhHoBlZOBGNkXVPD21B1xXm7zeZM=; b=qtGegE9p1NZUQIhTXqsLufOeZeTC0s9UT4KxS+OIA2hVzEnracEmcV9GogHrdJiujYUad2 4FiF1wvkpp0cVtrLV3glbd3YlwHe5tove9gGkcnA7XJeGqBLFC7nkSgq0eWISwy0aF5b3e fnf1VAQLa8KPFSqlNRXY1wsgi8/gu0bPmyao5ijHmlyGmnVs5WWiOJT43fUDFt4+IsvUCH AjEzTd7XkwPVH++VxAzev32pjuZcxDTceHYQcstG3nVgpfMk0pzFfL/wFrRUzZNRqG274K z4gU5j7exA99e3mtmKcMJrGCUrq+GCpm07t0vfbuf5RzLsZlNAYjXWJYbVlDcQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1751704603; 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=/f5ui/XrQQHvBTOXhHoBlZOBGNkXVPD21B1xXm7zeZM=; b=BeRrxqIZrbTIBUKGwl9M3qMn14vbvL7Gkg8mQmrT0HuEz+kHg0yI5jQCrn0FtvJznX63ze 5GwXLdDiruQRKbZ++DY+1sQmq0U6OuPb2f9vOKQDDCjveLAg1/ER/RGHU1B1yZgzgpOGmq 6+sjE2MMEqgt8nwGV2omRg1CwdSPQLQDen9ke8n1oKxGMQVvvwcJCteHXPDucaAySw1PK/ hJ7lHXMNGzWyZJYMeXinb5yAhTOKi5Wkg8gXtq2tZNKLfndZu8KxgHLTNORFTl63v1V5P+ hJtUGbFsZ/8hGRlMkDZuxCRwYUO5xjDCv3hCgFk6WPzdphBwUItltz0uuslEFQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1751704603; a=rsa-sha256; cv=none; b=gUiTi67H6O1OkMGC++BC/0MsU2rHXujdXrMq841BBiRVY2YoV2PCllXwuwZt1rzlJ0T+iF ccc27Fun0u8LH8NsG10qwihgxUufcHVu2mSm4RNZvs/2P3S5UVUwTujCKApAR13X+14gSS K2jUHSyFmvJIfKgFA/6UwxdmLkgwtpybAWy5DpJfFc182I/iV1u+IiOE2xuAOHEQcCzZsn DK6i8eIWY97uAkpKthNsL5YppYVSVi/pmIslw/YBVU/hMNl88hF87X3/BfRUoeaY2P3S9P gYRQ5t0pRw68nA7RJj9S8ePrMwCzfVBDfzEjlmpeVorXALhpCj0MnYMbsnNuzA== 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 4bZ3kz2jRLzCkD; Sat, 05 Jul 2025 08:36:43 +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 5658ahdq068004; Sat, 5 Jul 2025 08:36:43 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5658ah39068001; Sat, 5 Jul 2025 08:36:43 GMT (envelope-from git) Date: Sat, 5 Jul 2025 08:36:43 GMT Message-Id: <202507050836.5658ah39068001@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 6eb141a2c473 - main - amd64 pmap: preallocate pt page for pmap_demote_pdpe() in pmap_demote_DMAP() List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: 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: 6eb141a2c4731130bfac670708a8b90f7cdff742 Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=6eb141a2c4731130bfac670708a8b90f7cdff742 commit 6eb141a2c4731130bfac670708a8b90f7cdff742 Author: Konstantin Belousov AuthorDate: 2025-06-22 03:38:12 +0000 Commit: Konstantin Belousov CommitDate: 2025-07-05 08:36:01 +0000 amd64 pmap: preallocate pt page for pmap_demote_pdpe() in pmap_demote_DMAP() Allocate the page outside the kernel_pmap locked region with waiting, and pass it to pmap_demote_pdpe() to use as pt page, instead of panicing if VM_ALLOC_INTERRUPT failing. Reviewed by: alc, markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D50970 --- sys/amd64/amd64/pmap.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 2ab8c3b17e22..443273b42f4d 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -1302,7 +1302,7 @@ static bool pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); static bool pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, struct rwlock **lockp); static bool pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, - vm_offset_t va); + vm_offset_t va, vm_page_t m); static int pmap_enter_2mpage(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, struct rwlock **lockp); static int pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde, @@ -9547,7 +9547,7 @@ pmap_unmapdev(void *p, vm_size_t size) * Tries to demote a 1GB page mapping. */ static bool -pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, vm_offset_t va) +pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, vm_offset_t va, vm_page_t m) { pdp_entry_t newpdpe, oldpdpe; pd_entry_t *firstpde, newpde, *pde; @@ -9564,12 +9564,19 @@ pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, vm_offset_t va) oldpdpe = *pdpe; KASSERT((oldpdpe & (PG_PS | PG_V)) == (PG_PS | PG_V), ("pmap_demote_pdpe: oldpdpe is missing PG_PS and/or PG_V")); - pdpg = pmap_alloc_pt_page(pmap, va >> PDPSHIFT, - VM_ALLOC_WIRED | VM_ALLOC_INTERRUPT); - if (pdpg == NULL) { - CTR2(KTR_PMAP, "pmap_demote_pdpe: failure for va %#lx" - " in pmap %p", va, pmap); - return (false); + if (m == NULL) { + pdpg = pmap_alloc_pt_page(pmap, va >> PDPSHIFT, + VM_ALLOC_WIRED); + if (pdpg == NULL) { + CTR2(KTR_PMAP, + "pmap_demote_pdpe: failure for va %#lx in pmap %p", + va, pmap); + return (false); + } + } else { + pdpg = m; + pdpg->pindex = va >> PDPSHIFT; + pmap_pt_page_count_adj(pmap, 1); } pdpgpa = VM_PAGE_TO_PHYS(pdpg); firstpde = (pd_entry_t *)PHYS_TO_DMAP(pdpgpa); @@ -9779,7 +9786,7 @@ pmap_change_props_locked(vm_offset_t va, vm_size_t size, vm_prot_t prot, tmpva += NBPDP; continue; } - if (!pmap_demote_pdpe(kernel_pmap, pdpe, tmpva)) + if (!pmap_demote_pdpe(kernel_pmap, pdpe, tmpva, NULL)) return (ENOMEM); } pde = pmap_pdpe_to_pde(pdpe, tmpva); @@ -9948,6 +9955,7 @@ pmap_demote_DMAP(vm_paddr_t base, vm_size_t len, bool invalidate) { pdp_entry_t *pdpe; pd_entry_t *pde; + vm_page_t m; vm_offset_t va; bool changed; @@ -9956,17 +9964,28 @@ pmap_demote_DMAP(vm_paddr_t base, vm_size_t len, bool invalidate) KASSERT(powerof2(len), ("pmap_demote_DMAP: len is not a power of 2")); KASSERT((base & (len - 1)) == 0, ("pmap_demote_DMAP: base is not a multiple of len")); + WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "pmap_demote_DMAP"); + if (len < NBPDP && base < dmaplimit) { va = PHYS_TO_DMAP(base); changed = false; + + /* + * Assume that it is fine to sleep there. + * The only existing caller of pmap_demote_DMAP() is the + * x86_mr_split_dmap() function. + */ + m = vm_page_alloc_noobj(VM_ALLOC_WIRED | VM_ALLOC_WAITOK); + PMAP_LOCK(kernel_pmap); pdpe = pmap_pdpe(kernel_pmap, va); if ((*pdpe & X86_PG_V) == 0) panic("pmap_demote_DMAP: invalid PDPE"); if ((*pdpe & PG_PS) != 0) { - if (!pmap_demote_pdpe(kernel_pmap, pdpe, va)) + if (!pmap_demote_pdpe(kernel_pmap, pdpe, va, m)) panic("pmap_demote_DMAP: PDPE failed"); changed = true; + m = NULL; } if (len < NBPDR) { pde = pmap_pdpe_to_pde(pdpe, va); @@ -9981,6 +10000,10 @@ pmap_demote_DMAP(vm_paddr_t base, vm_size_t len, bool invalidate) if (changed && invalidate) pmap_invalidate_page(kernel_pmap, va); PMAP_UNLOCK(kernel_pmap); + if (m != NULL) { + vm_page_unwire_noq(m); + vm_page_free(m); + } } }