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=1794585700; b=VHmQrim+KA48hyKmq5W9x/w1Ol2UrI88G4DY+NU/YnlH3OXPUkE6KIENDiq6j+p7cCMm +5xbrX0mxgp/4bL6tOvdFYi6CEtu5pvyTfLP2InZsf/CI506+V1wiK8v1NSl0hb8YDU5k Zp8XuodV+EVyIRhJNxwR+DY9n30ThOb/LI28/KiNRSQrr56Nk0tYNPX61b6yc0+fNm0Bm BZUMzc3jelc4M5h+KCsg0twFAWCsMC1u7zcugjhtQ+PLIW3dJy1it7ir32e/GSbSnX2uG J+RrffBO/359h6WohkXQAisg201O2Av4lC4mUV1bHQtvEGZS3X+TW/PLdZ/J9XPeOsA== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794585700; 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=AcPrpp0pQ+trwzX+/2Ncsl4My7k3DLz77wRumHZ89sY=; b=5HYq7xGKRK1amSIvl6aYgEz+7c96JaJixV8D08XX7CDdf/V+IC+obisUmocrLbjQO0aX ZFjR7leAueoPiOrp9V+fuD2W1qzc41u5DEsHsaNmxzLbMrVpRNptpKzI8Rbx0tr0+GzTM DW5T6KL0jFmlQp8aHDTnZXiAUYsTpWEnoDbpYikhnkjj6KlunqVUhw2AINCEFf3NT9iK9 K2VUGQExd9htGkjMJXAyy5bGYhn2z+7Tawb7E8Z0weZQX08nGQ4+D0tq5y2royiI26t7k H6onXwEdv3Muj9atxagPSDRk+i0inJmJJFpsWnW3hvhTzWh/mT+SMVMmT6GxR7P67bw== 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=wbx5yTdf; 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 8023E606A8A8; Fri, 13 Nov 2026 16:01:40 +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=wbx5yTdf Received: by smtp.kernel.org (Postfix) with ESMTPSA id 303F81F000C4; Fri, 13 Nov 2026 16:01:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxfoundation.org; s=korg; t=1794585700; bh=AcPrpp0pQ+trwzX+/2Ncsl4My7k3DLz77wRumHZ89sY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=wbx5yTdfOF2FmFjuBBUAXyG23No/3oTDrh+FMuGR6cr9ca17gti9b/7133dZBfbpH 0MC/04912RrCgdbulGnUOSYZN8mOeLwTXA8jUResCRIKaHgnw/zDW+OHFHMoUssf64 iVvrh5g2FKmXqDtXcjwemVFe6qKMCmMtDNrmZLSU= 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 7.3 306/507] mm/khugepaged: preserve dirty bits when collapsing PTE-mapped THPs Date: Fri, 13 Nov 2026 10:50:10 -0500 Message-ID: <20261113153805.646562939@linuxfoundation.org> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261113153753.358973689@linuxfoundation.org> References: <20261113153753.358973689@linuxfoundation.org> User-Agent: quilt/0.69 X-stable: review X-Patchwork-Hint: ignore X-Mailing-List: stable@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 7.3-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 065030fb3e327..8fc8f79641ea5 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -2019,9 +2019,10 @@ static enum scan_result try_collapse_pte_mapped_thp(struct mm_struct *mm, unsign /* * 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