From nobody Sun Sep 17 10:37:23 2023 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 4RpPWS04bFz4tTg5; Sun, 17 Sep 2023 10:37:24 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RpPWR6Rfqz4VXL; Sun, 17 Sep 2023 10:37:23 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1694947043; 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=bcCiv4Mu7Ndy66JqrSkws4KuNyAhGcCQ7BebdkjT4MQ=; b=xjz+S5Ga8IDMl4811l650lsMxnqV6uuzkYIfsBZ75tSGd/1jZpFs4X9H3jWgRkFSa47EFy r6S0Vl0H/dF1aobaWbsN/bGTb4/NXat+wvDPnTihyLhd7w0h2J0MIfsL0FCTuKP+Eeizvo KjKpoN76BZuaSmv680cnF1HhpIedGi16W9jqjXT3ILtdaeKur+PoyqaxFQMyWwniL5hvtf iWMd1JXwsh75WGGG7PDj12afLm+7X3py/Jree6oqQA5WASH5SXehjYymiV2np+eT1ez938 RFo/g02izAhVQm9rQyDSobWVL9K+tyfgSGmBApcyR8tFT4eSPa9o4jCs0Ccrkg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1694947043; a=rsa-sha256; cv=none; b=YVbD5YFzzIEFT2DcWtriTtP0NyYT8pO6MxXfgd2JHwQXPQFkTsINOoDSGiaXXgBIKG2I1c A7RoAmheG1DCM8S6lVL9fRGKG+Z0KEhdRu7HwYMGOuL7ySMwj7BRBtXgXFFK2fMy7uGWN0 5r7UTXZ0Aacfzk5CrgCyRzAJGhEYlRaziG5406vVTTep5yM/D/yX7DITX4n0uzQkxvedSh M2/K9be06qW0HWFEJaJzjQS9ma7XymkOV/u8P2NgxMU5I4xCHXzOD+3Ozgzr8tKGMpPg3g cTg1VjbXo/cl1eJwTjrFDqzCYbQa7iPpIVSjd0t2JBDApiCR/DJQescRmt+4Qw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1694947043; 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=bcCiv4Mu7Ndy66JqrSkws4KuNyAhGcCQ7BebdkjT4MQ=; b=TBpc5TncewNFS3iqQOcnXfogTgJJUjs3bgmdZKa6DDGE5zgdcIJCT6q/Q4VPLN0dP6gurX rMf4vgEp7pYvzwBjB552xGNXjSYvnazP7h8zy87ki2G4t6oYEe9/M0vltVm9QFi+RE3ieY QRtCLilDbZeA7PXsyLNxFEdr12lL9C2y3hbm2JrDA1bKvgHBggt6i2iuKPyIXQXjbMt11/ ki902hvhV/iB/wG9qGaXAKe01t+woT6eu522GUnNIpB/MsMQISBa+Jm1Z3lLlT37n9Ke+1 N2OVN0iB4YnZXRLTDROzLJi0NlSHcjjkuhQy2WEYL/YaPzAXj65NR55LmEM4PQ== 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 4RpPWR5RMNzln6; Sun, 17 Sep 2023 10:37:23 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 38HAbNtR023786; Sun, 17 Sep 2023 10:37:23 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 38HAbNtH023783; Sun, 17 Sep 2023 10:37:23 GMT (envelope-from git) Date: Sun, 17 Sep 2023 10:37:23 GMT Message-Id: <202309171037.38HAbNtH023783@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: aa3bcaad5107 - main - amd64: Add a leaf PTP when pmap_enter(psind=1) creates a wired mapping 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: aa3bcaad51076ceb346fa0c64ab69a35e5241b20 Auto-Submitted: auto-generated The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=aa3bcaad51076ceb346fa0c64ab69a35e5241b20 commit aa3bcaad51076ceb346fa0c64ab69a35e5241b20 Author: Bojan Novković AuthorDate: 2023-09-15 10:41:10 +0000 Commit: Mark Johnston CommitDate: 2023-09-17 10:27:22 +0000 amd64: Add a leaf PTP when pmap_enter(psind=1) creates a wired mapping This patch reverts the changes made in D19670 and fixes the original issue by allocating and prepopulating a leaf page table page for wired userspace 2M pages. The original issue is an edge case that creates an unmapped, wired region in userspace. Subsequent faults on this region can trigger wired superpage creation, which leads to a panic in pmap_demote_pde_locked() as the pmap does not create a leaf page table page for the wired superpage. D19670 fixed this by disallowing preemptive creation of wired superpage mappings, but that fix is currently interfering with an ongoing effort of speeding up vm_map_wire for large, contiguous entries (e.g. bhyve wiring guest memory). Reviewed by: alc, markj Sponsored by: Google, Inc. (GSoC 2023) MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D41132 --- sys/amd64/amd64/pmap.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index b10997fd657b..ff83d8749313 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -7493,9 +7493,8 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde, u_int flags, pd_entry_t oldpde, *pde; pt_entry_t PG_G, PG_RW, PG_V; vm_page_t mt, pdpg; + vm_page_t uwptpg; - KASSERT(pmap == kernel_pmap || (newpde & PG_W) == 0, - ("pmap_enter_pde: cannot create wired user mapping")); PG_G = pmap_global_bit(pmap); PG_RW = pmap_rw_bit(pmap); KASSERT((newpde & (pmap_modified_bit(pmap) | PG_RW)) != PG_RW, @@ -7592,6 +7591,22 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde, u_int flags, } } + /* + * Allocate leaf ptpage for wired userspace pages. + */ + uwptpg = NULL; + if ((newpde & PG_W) != 0 && pmap != kernel_pmap) { + uwptpg = pmap_alloc_pt_page(pmap, pmap_pde_pindex(va), + VM_ALLOC_WIRED); + if (uwptpg == NULL) + return (KERN_RESOURCE_SHORTAGE); + if (pmap_insert_pt_page(pmap, uwptpg, true, false)) { + pmap_free_pt_page(pmap, uwptpg, false); + return (KERN_RESOURCE_SHORTAGE); + } + + uwptpg->ref_count = NPTEPG; + } if ((newpde & PG_MANAGED) != 0) { /* * Abort this mapping if its PV entry could not be created. @@ -7599,6 +7614,14 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde, u_int flags, if (!pmap_pv_insert_pde(pmap, va, newpde, flags, lockp)) { if (pdpg != NULL) pmap_abort_ptp(pmap, va, pdpg); + if (uwptpg != NULL) { + mt = pmap_remove_pt_page(pmap, va); + KASSERT(mt == uwptpg, + ("removed pt page %p, expected %p", mt, + uwptpg)); + uwptpg->ref_count = 1; + pmap_free_pt_page(pmap, uwptpg, false); + } CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx" " in pmap %p", va, pmap); return (KERN_RESOURCE_SHORTAGE);