From nobody Thu Oct 2 15:18:38 2025 Received: from fout-b7-smtp.messagingengine.com (fout-b7-smtp.messagingengine.com [202.12.124.150]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C25A01FAC37 for ; Mon, 15 Sep 2025 13:52:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.150 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757944381; cv=none; b=dtyxY/roR1/YGNoKHa+lKDZI/LhN/VmA674yKAjAVQ2GaHtNOrtUdheM3KVmPIcfluHQrgyS7klf1VAYI/7Ce9/kYZYXklNqI1g370DavVKhPdoKW8RnlR45tOoVytbwYrpUjqTI+u/oM3DIwcoFRMb+az0Ko1ZVwHFwRzkLNaU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757944381; c=relaxed/simple; bh=oz4Z++cVpI//VG0Y/Mye5EjLE4DB+uouT/0KXkuxarc=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition; b=YJ6eiLxn2X6/lB3MXG29K1nEcEMi2AaCZj26lwRjipvfPA8sw5PPqN42pZcvGvQc2XISq5i4VD9W/8h/+eGzvR1gmYh8VJxHbKP/lbrY1cqVMRluynyM9rQSXy9WXbXWbFL6oWs+Unl41sdAi+RNSZ2zQCQakntsM1wzmDkw/KQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=shutemov.name; spf=pass smtp.mailfrom=shutemov.name; dkim=pass (2048-bit key) header.d=shutemov.name header.i=@shutemov.name header.b=TRQovllc; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=V7XtVNNB; arc=none smtp.client-ip=202.12.124.150 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=shutemov.name Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=shutemov.name Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=shutemov.name header.i=@shutemov.name header.b="TRQovllc"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="V7XtVNNB" Received: from phl-compute-10.internal (phl-compute-10.internal [10.202.2.50]) by mailfout.stl.internal (Postfix) with ESMTP id 40F3B1D00071; Mon, 15 Sep 2025 09:52:57 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-10.internal (MEProxy); Mon, 15 Sep 2025 09:52:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shutemov.name; h=cc:cc:content-type:content-type:date:date:from:from :in-reply-to:message-id:mime-version:reply-to:subject:subject:to :to; s=fm3; t=1757944377; x=1758030777; bh=gj2hpwBYG8Xyktyq6qkf/ /++RSuokJq1T7PZ0K0vVVc=; b=TRQovllcP3cGfwvSIC32Fk7ufYxzgqSANa0Ww KVoU/WB3mM9Mws7u/QXn41isoeVvTe3tfWJ2xdaY0OpgznS6Z4mk7Pauo4qVtsWV sAr79oFJdyIPAKjM+Q/Se7odJmCNsAcAKKCK9Z2pJzxry1arQtUSXIi2nf5Lm6WU stPwHr/KxOzBiOVkah8EEOyzEWvLjx0ASIGEvaAExWQPVSi3B+zogBNBkzjMu04P mqFGQTrUinDu+5HsgunMNh4ufLnBXRrSpS8mQGZC6mZBAK7dcurRxGwPUWTPzpD7 ReHUK+mQ3glKe29Ek8CJ9+b36XgfBQyV1SfrdVhtcqNbby8Jg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t=1757944377; x= 1758030777; bh=gj2hpwBYG8Xyktyq6qkf//++RSuokJq1T7PZ0K0vVVc=; b=V 7XtVNNB2sTrMAJSaLx1ztdTaeabBuKRJwu2GKIvCAK9MdCU5w269OEfccx0RSier WAqkO+vPUtzunWYS42ieJSggYSECVCxgr+8mJDTePPnl4sm8+YxBeVDx7QHz0PQ4 yhxppVL4Ogf/hm2qASWhuJlOnYS+M6CgM/LHBJluW7O10y3jTgebwbIOCOdipYsY bu4STeLlfIhcNREp12KWOuij7osEd4jE3vRJ/IcV52wLMNYGrasfjB4dlURAX7Sg UrZnhQ6U6VCnwJTsrh/Rt+6Oug8r+iuwAWDwc2Z48gmt7/7Ff+23zpT1mFvkgmQu dLFWIH04S95nY3pGGYaMA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdefjeekhecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjug hrpeffhffvvefukfggtggusehttdfstddttddvnecuhfhrohhmpefmihhrhihlucfuhhhu thhsvghmrghuuceokhhirhhilhhlsehshhhuthgvmhhovhdrnhgrmhgvqeenucggtffrrg htthgvrhhnpeefhfdugfeghfdvfeefvddujeeuueefvdefuddvfeejheevveeigfejteet teeiudenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hkihhrihhllhesshhhuhhtvghmohhvrdhnrghmvgdpnhgspghrtghpthhtohepvdegpdhm ohguvgepshhmthhpohhuthdprhgtphhtthhopegrkhhpmheslhhinhhugidqfhhouhhnug grthhiohhnrdhorhhgpdhrtghpthhtohepuggrvhhiugesrhgvughhrghtrdgtohhmpdhr tghpthhtoheplhhorhgvnhiiohdrshhtohgrkhgvshesohhrrggtlhgvrdgtohhmpdhrtg hpthhtohepiihihiesnhhvihguihgrrdgtohhmpdhrtghpthhtohepsggrohhlihhnrdif rghngheslhhinhhugidrrghlihgsrggsrgdrtghomhdprhgtphhtthhopehlihgrmhdrhh hofihlvghtthesohhrrggtlhgvrdgtohhmpdhrtghpthhtohepnhhprggthhgvsehrvggu hhgrthdrtghomhdprhgtphhtthhopehrhigrnhdrrhhosggvrhhtshesrghrmhdrtghomh dprhgtphhtthhopeguvghvrdhjrghinhesrghrmhdrtghomh X-ME-Proxy: Feedback-ID: ie3994620:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 15 Sep 2025 09:52:55 -0400 (EDT) Date: Mon, 15 Sep 2025 14:52:53 +0100 From: Kiryl Shutsemau To: Andrew Morton , David Hildenbrand , Lorenzo Stoakes Cc: Zi Yan , Baolin Wang , "Liam R. Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCHv2] mm/khugepaged: Do not fail collapse_pte_mapped_thp() on SCAN_PMD_NULL Message-ID: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Kiryl Shutsemau MADV_COLLAPSE on a file mapping behaves inconsistently depending on if PMD page table is installed or not. Consider following example: p =3D mmap(NULL, 2UL << 20, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); err =3D madvise(p, 2UL << 20, MADV_COLLAPSE); fd is a populated tmpfs file. The result depends on the address that the kernel returns on mmap(). If it is located in an existing PMD table, the madvise() will succeed. However, if the table does not exist, it will fail with -EINVAL. This occurs because find_pmd_or_thp_or_none() returns SCAN_PMD_NULL when a page table is missing, which causes collapse_pte_mapped_thp() to fail. SCAN_PMD_NULL and SCAN_PMD_NONE should be treated the same in collapse_pte_mapped_thp(): install the PMD leaf entry and allocate page tables as needed. Signed-off-by: Kiryl Shutsemau Acked-by: David Hildenbrand Reviewed-by: Baolin Wang Reviewed-by: Dev Jain Reviewed-by: Lorenzo Stoakes Reviewed-by: Zach O'Keefe --- v2: - Modify set_huge_pmd() instead of introducing install_huge_pmd(); --- mm/khugepaged.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index b486c1d19b2d..986718599355 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -1472,15 +1472,32 @@ static void collect_mm_slot(struct khugepaged_mm_sl= ot *mm_slot) static int set_huge_pmd(struct vm_area_struct *vma, unsigned long addr, pmd_t *pmdp, struct folio *folio, struct page *page) { + struct mm_struct *mm =3D vma->vm_mm; struct vm_fault vmf =3D { .vma =3D vma, .address =3D addr, .flags =3D 0, - .pmd =3D pmdp, }; + pgd_t *pgdp; + p4d_t *p4dp; + pud_t *pudp; =20 mmap_assert_locked(vma->vm_mm); =20 + if (!pmdp) { + pgdp =3D pgd_offset(mm, addr); + p4dp =3D p4d_alloc(mm, pgdp, addr); + if (!p4dp) + return SCAN_FAIL; + pudp =3D pud_alloc(mm, p4dp, addr); + if (!pudp) + return SCAN_FAIL; + pmdp =3D pmd_alloc(mm, pudp, addr); + if (!pmdp) + return SCAN_FAIL; + } + + vmf.pmd =3D pmdp; if (do_set_pmd(&vmf, folio, page)) return SCAN_FAIL; =20 @@ -1556,6 +1573,7 @@ int collapse_pte_mapped_thp(struct mm_struct *mm, uns= igned long addr, switch (result) { case SCAN_SUCCEED: break; + case SCAN_PMD_NULL: case SCAN_PMD_NONE: /* * All pte entries have been removed and pmd cleared. --=20 2.50.1