From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794590456; b=VFVRSyM9Fo7QExRuYrin6L1I5M7E8YhnrbuCypYUXEZog6sCrh7zU/5mfvMqCs5JfXar lOrrLa06lUSbmm6oqimlCwPAJfD7W5Z/JxtzJRf0ykR8Gh3bnusiFjmVv3BjOHoebBfu5 W/Z+kBrAyMX25EslJS9HlVr1PUrEFvXpnzKiT2QYfRXYY/6inUM/d5ncamIFKFa+yjKKH Kl2bJd4RPA4s14fDNL5Zp6rBDDtP9UkIIMc0bBQyNrS74AH1ZzuWBHaDVQqGHZr0yWiBP wTUmu4XpPar7WEt4kUD2NMBahhpJbBj1gqq7zZpR8aUhW8Pub/7FnL7Qe/Z+MRRYWsQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794590456; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:User-Agent:X-stable:X-Patchwork-Hint: MIME-Version:Content-Transfer-Encoding; bh=rihbNsJXqVW5EH+uTVwqSuehqH1GaQrm0RX6HGeya6A=; b=vj7ijBFwce8/DT6IgOCltWplmIanIQP/kzTV3PFIQlOqCo1JoAzgakSX1rj3pHCgQhCo mlF89nASHWepcLLLZs01VzIghUkc7CXRm4D8ixfeGv8cY58lB5BqZ7RLjvL4s4yP6PAjf Ttmr60iDafiqVRV+4GnE7lbe8Ggm9twKuD8GvkWGIfl04dS3t9A0uAyC9QW8woOJhVqsJ ji/lqe+D1bTMzT/6VZHRFfpLn3BcioIlCFohKc7001VcHl98sysoThirckq4bREB+6IFg LOrQ1GJASHoJUHzbS+Shxv7lNGepwrmmi5D9x2O1CgEydMEkJgh2hz3ESqWSrBTDcdw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b=i6Cq16EI; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5326F608434A; Fri, 13 Nov 2026 17:20:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b=i6Cq16EI Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0606E1F000C6; Fri, 13 Nov 2026 17:20:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxfoundation.org; s=korg; t=1794590456; bh=rihbNsJXqVW5EH+uTVwqSuehqH1GaQrm0RX6HGeya6A=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=i6Cq16EIP/gvWSwG5dt0eutVOHGWN3w8YmV2huNGxtAovM1HgNiFAphrW89S1/wzS 2niWbIb9d/+cv8jcfJqcvW52B234cW3afPlTO3fnxGHpPPwMlc4PEUbFAmDTb17/sG tLqUJCCOvRW9hFyagngbjADQUMuW33ZqQxxxU8ec= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, Chris Mason , Pedro Falcato , "Gregory Price (Meta)" , Muhammad Usama Anjum , Lance Yang , Baolin Wang , "David Hildenbrand (Arm)" , Sasha Levin Subject: [PATCH 6.18 371/686] mm/khugepaged: preserve dirty bits when collapsing PTE-mapped THPs Date: Fri, 13 Nov 2026 10:48:24 -0500 Message-ID: <20261113153833.487200373@linuxfoundation.org> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261113153820.902362109@linuxfoundation.org> References: <20261113153820.902362109@linuxfoundation.org> User-Agent: quilt/0.69 X-stable: review X-Patchwork-Hint: ignore X-Mailing-List: patches@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 6.18-stable review patch. If anyone has any objections, please let me know. ------------------ From: Chris Mason [ Upstream commit fe2817e3d5ea347214342c9a5cd8bcbff20c0574 ] try_collapse_pte_mapped_thp() clears PTEs without transferring their dirty bits to the folio. A shmem read fault can map a clean folio writable, so a later store only dirties the PTE. Losing that dirty bit allows reclaim to discard modified data. The assumption that regular files are read-only is also obsolete since commit 1b6444331bebb ("mm/khugepaged: enable clean pagecache folio collapse for writable files"). In any case, transferring PTE dirty bits to the folio when removing mappings (and while the folio is still mapped) is the right thing to do. Use get_and_clear_ptes() to collect the dirty bits and mark the folio dirty before unmapping it. Update the comment. This was reproduced with shmem using MADV_COLLAPSE followed by MADV_PAGEOUT. Fix generated by an LLM and sent by Chris Mason in private. Fixes: 27e1f8273113 ("khugepaged: enable collapse pmd for pte-mapped THP") Fixes: 1b6444331bebb ("mm/khugepaged: enable clean pagecache folio collapse for writable files") Cc: stable@vger.kernel.org Signed-off-by: Chris Mason [ david: adjust comment; simplify description; cover file-thp as well ] Reviewed-by: Pedro Falcato Reviewed-by: Gregory Price (Meta) Tested-by: Gregory Price (Meta) Tested-by: Muhammad Usama Anjum Link: https://patch.msgid.link/20261031-fixes_core-v3-17-d6437171ecc3@kernel.org Reviewed-by: Lance Yang Reviewed-by: Baolin Wang Signed-off-by: David Hildenbrand (Arm) Signed-off-by: Sasha Levin --- mm/khugepaged.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 3a866347a1cf1..6bff1096de7d8 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -1646,9 +1646,10 @@ int collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr, /* * Must clear entry, or a racing truncate may re-remove it. * TLB flush can be left until pmdp_collapse_flush() does it. - * PTE dirty? Shmem page is already dirty; file is read-only. */ - clear_ptes(mm, addr, pte, nr_batch_ptes); + ptent = get_and_clear_ptes(mm, addr, pte, nr_batch_ptes); + if (pte_dirty(ptent)) + folio_mark_dirty(folio); folio_remove_rmap_ptes(folio, page, nr_batch_ptes, vma); nr_mapped_ptes += nr_batch_ptes; } -- 2.53.0