From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 9C31BC61DD3 for ; Thu, 3 Sep 2026 18:29:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7384F6B008C; Thu, 3 Sep 2026 14:29:53 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6E93A6B0092; Thu, 3 Sep 2026 14:29:53 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5D88B6B0095; Thu, 3 Sep 2026 14:29:53 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 2F8A66B008C for ; Thu, 3 Sep 2026 14:29:53 -0400 (EDT) Received: from smtpin11.hostedemail.com (lb01a-stub [10.200.18.249]) by unirelay06.hostedemail.com (Postfix) with ESMTP id BC0A1A481C for ; Thu, 3 Sep 2026 18:29:52 +0000 (UTC) X-FDA: 85173289824.11.BC26159 Received: from flow-a3-smtp.messagingengine.com (flow-a3-smtp.messagingengine.com [103.168.172.138]) by imf12.hostedemail.com (Postfix) with ESMTP id C89B440006 for ; Thu, 3 Sep 2026 18:29:50 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=shutemov.name header.s=fm2 header.b=CxPtMTTH; dkim=pass header.d=messagingengine.com header.s=fm1 header.b=OhhE1bUo; spf=pass (imf12.hostedemail.com: domain of kirill@shutemov.name designates 103.168.172.138 as permitted sender) smtp.mailfrom=kirill@shutemov.name; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1788460191; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:references:dkim-signature; bh=/fSatvsWZM4B4zf1fK77XqXosYANLT56ve8NWTcWTZ8=; b=Nq/ey+EyoR0WKBdglIARU7xrw8OrkYGqP+Ns4U2NnvrHy7YBsJiwMoz6XVqxm4ITEBF2Nt MnD/kEcN9X7Jt8dMYOz7jbVasS5Z1OVSYdjU5Ja6x/Okto83xTqHaChg9GbRoC5mh+0H4m qMu/Kyju7HHk81+c+cQI9V2+CJSoUNM= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=shutemov.name header.s=fm2 header.b=CxPtMTTH; dkim=pass header.d=messagingengine.com header.s=fm1 header.b=OhhE1bUo; spf=pass (imf12.hostedemail.com: domain of kirill@shutemov.name designates 103.168.172.138 as permitted sender) smtp.mailfrom=kirill@shutemov.name; dmarc=none ARC-Seal: i=1; a=rsa-sha256; d=hostedemail.com; s=arc-20220608; cv=none; t=1788460191; b=LzXMs3cgeLhu/uZXF7azQKt63fhIszVYi7W7jmQ7BIS4tFFbNxYWSY2jCdOaUyVlqH09B6 OpIp1Zy5Kaa+uUOlhZEg9ZLzpA+QKtybX8E3pWs0ExeUXaOcu1rvjzPJhkNJLXP/KcbBwY OX+Q2rq3tbIKoodU46d7u268m+p4wB4= Received: from phl-compute-09.internal (phl-compute-09.internal [10.202.2.49]) by mailflow.phl.internal (Postfix) with ESMTP id 15D9E1380124; Thu, 3 Sep 2026 14:29:50 -0400 (EDT) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-09.internal (MEProxy); Thu, 03 Sep 2026 14:29:50 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shutemov.name; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:message-id:mime-version:reply-to:subject :subject:to:to; s=fm2; t=1788460190; x=1788467390; bh=/fSatvsWZM 4B4zf1fK77XqXosYANLT56ve8NWTcWTZ8=; b=CxPtMTTH9TkAa4aDnaEhmQJnIK efRiwvfMnObkLuGH7iQqwfG1yb9qqYqizLmy0KgQo0q1KhW0t7or1QIOAK7oSMXZ JWKzUokFOVxClmmOKUZEi8hMmZPTmif8ArOkwEko2ICIxusw6F9h2JrFdxkxDDLZ 0/2dZejfo4kuFRzQonWU2C5xdZjEb4EPkr+TQZDb1rAZHnr+ZO9whXAN2XmTSn2R PVqDRIggND452Jr4ju6hXShQAR2+rNTPIVMSMOsKEYzliniHgN79qYq2tR2j+ksS CXb61vPkO9gq1KNJWXlGRaFC+1RbwcwW2sskmmqxXxNn+kBrrlUjhGJKLNCg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :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= 1788460190; x=1788467390; bh=/fSatvsWZM4B4zf1fK77XqXosYANLT56ve8 NWTcWTZ8=; b=OhhE1bUoRtN1xxHczEJYxz8pVDzzd2dfvyqTeKV4iRF8ifBvC3M 8wEVHHHKhN/QNBMwXLMPL1od+mwkljYIbiPX9CW3Il/eMqLqKmUg48x7b++2nLDp b91FRn8vFFgHJ7LxfOd8rKTIliSSYTMOL7cvV4OXU64y+iJLLZTF4QWf3neIIRZr aCcz5ATg1CTKxgScWSN0Qf/ECLF4lnGNQfvkqLeaGcuKL5sTRiXRWsgI5kXvbHF/ E6NuAJHTgkfhTF8kPWt84/41TateQXMqT4X2+pHqvm0Ph7IbOE28ygTYLuaLF8gm LyGdd/SwXoLiVOAHV1E/Ij6reIB8Oi63J0w== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: dmFkZTGzhS0EF+xT7L4APxnR4/6WqwEo/DPnzsf1SrAf29Hq8MqzP2TtfK1qR/Svqk+STv H4nyfck5vC3zIkbYydfT1Ttl2XZBvWEsTV9U7KUCJvpYiKzH3LLS1TpMk1G8Q3iTlEeqt6 uCqSQ5F3FzkpEfnpwRBCLOGhNeU0tP6d3OQbhYO3M7PmyvCrhn3qG+OlNDPJKGyZgSthfF vI3CoYKv29fWoxbxnpYFUa5xdbF0HB1C9u4CCfeYbHoB3NBJzU8b73sgbQ99wHxzD/oqD9 nmFhnPrAi7wEECNbyJ9wz2vD++cZExRKpHmU0uZ7vFfONmUZQ/wkCcSDV+9t34/IO9YOpX pt+pno6vg2zNg0rB6w6K2L0RQq3qbN6xHrl+RlvfD0EmGDW67TeFKmpYKwvv1xlSl5Kkm0 SE4iL2xcx9DW6rY5bgR+REp8zE5GL9YG+8NUiCkwx05ewzr6QX8VfNRh6KzIcE5GJ5XTsB ZYoViLRJvipGySeYV7w0MxnMC6kyzC2lVOdcVwljW7AhR06y5j6vujQrPsj8SrNAN5eaUm 77U79F2B3v+mIDhCNPw5iZZgNk5WfrNqorNrSF3AVWPeFfUhlwhd9VKZyAXG2cOtjgfoMo d44VAQf4TsN8v+Ebzh3NAJC3CE5akd2vrGCbHdw0KuQ0kRfP1NWLkvVEbD9A X-ME-Proxy: Feedback-ID: ie3994620:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 3 Sep 2026 14:29:48 -0400 (EDT) From: Kiryl Shutsemau To: akpm@linux-foundation.org, "Matthew Wilcox (Oracle)" , David Hildenbrand Cc: Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Jan Kara , Rik van Riel , Harry Yoo , Lance Yang , Jann Horn , Alexander Viro , Christian Brauner , "Darrick J. Wong" , Carlos Maiolino , Usama Arif , Pedro Falcato , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-xfs@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com, "Kiryl Shutsemau (Meta)" Subject: [RFC PATCH 0/5] mm: sub-folio dirty tracking for PTE-mapped mmap writes Date: Thu, 3 Sep 2026 19:29:38 +0100 Message-ID: <20260903182943.662461-1-kirill@shutemov.name> X-Mailer: git-send-email 2.55.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: mwk14nz4b8s6rd847uiprz1ipbcbfugw X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: C89B440006 X-Rspam-User: X-HE-Tag: 1788460190-70160 X-HE-Meta: U2FsdGVkX189Ov0jgPzawTNedNmXG/4muZYQB2SgqXAdnFbvWT3346BvyjBpaYjlN92DUIMc9HFG3o1iZrjrUVHMx2ZWr+O/NZRFvCz1bqjlMbFnBKdy4bjFsYnWZUeG0lMRuO7VXSY16vXff8FaWJOmjBwRTDmYFpX8GD21Pp44pu7kbWRPNGaVIi2DHCC/6p1P9OC/rWD1XRhIVAhWsHFS9NOcGdsmwnYnWLzbT+MwFjwWnA4nrGeyarK7yRA3G2wudEWr8ZbJeZ8qLCzAjzjRXd7Z544HVnIduFRFS+vfrEKTzep3Yt9TWLVZmqor0NdQLorIEFDAMNuPqCnwVZQkhPXEZyvqEsVqYqfzRfVKEmzDUPHMN7Js3eDsmMf9CbUQxqUQfKSLnuZqKV6KBISoPiYUZ5vQ90hMpQITbxbd+bHIgKJFuSD4SQFjDwFLf6wfuWTcQi0IgubWQVxflgHIYEXyvZkGNAtDXFVyswZkpp8dCtDgFxxuxX1jtir9CX7fq+qFkVVrEDYy4Ly1ps1NRW2UNAeCx93/qaFHyXaZtimExHccC1QVW7RwBAt8+x39Bd+Ar1NtvjikzjBLi7pZq4z+GsUvR7Dqz3TDSRW2w2UHlN9Ev+BE9/majXrDUpAaUqTmE185rOpoS33SOZUibQvV4noXB+VmcGOwhnF8aCHkhagoL3iEHjZ7qouJhpdY05BvWifn5PNR2IicAoFxOqyRUgMdicNQ0s4OGeH8pCKE0+U6JphN+i9LdTxQDJGNODvVneFHmwtC9oyY6S7nBXNjQ+OBAlhoS2+FT6ZHyrdRoJzVFu01aGPQcId20WTM1xvA7RrUmoOjTHsWi+CCV2XM4ChvxjQjmSa2ozx1N5wiNAngBNGUcIcPkzGaHD3dc+ilYIH5QlDEy6eKRyoGKI/90q6eygVg9/lJ+LguC8iobobxhT8mbs/tX2eYp9PrbkeIvDoISEEQ5b3 NgLv9oJP eYmhPCVXXHnbRmgdvD1yJpL9Lb44xEdzo75dB3XIfMejRDl8/b2Ye57jPzlir2PUZ5uMrAYMmaDgC6leGcs0QPwrMaQ7WmLHdm34kC/bgOhiOsjo26dwvaTolzQEs7AU9woQcRqrJfBj2A+q/U3h0EREFMs3IIuWDW1qKaE6fNbng9nKiOM3V8QLzKcxLVow/E4RKrZFoKGm0I/fDFXqwqZtxP/shQWnA69E3lxlvGh8Krm4B0MMGLzINe8hOQmoxCRvdKSzWotlTw/0KUjgML6OtuMvJsuibFlXlny6gZSy8zHsNxvkHGJmZZxJRpDtI67jKyIqAeIwLv/E3SasfV/anH6bJSOnJnIo3X7qkBk5sjHavPS0jjM4tCbgRtbDoceMZO/jhGYIGfOElRuRi5jM0XhGtH+D3Z1Xn16l2I6QhXUWkQKPkqwJMXS4sJI3qe/Nftc9M0T3keWk= Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: "Kiryl Shutsemau (Meta)" A store through a shared file mapping dirties the whole folio. With large page cache folios that turns a 4K store into 2M of writeback: one dirty bit per folio, and writeback has no way to know which part changed. XFS already knows better. iomap tracks dirty state per block and iomap_writeback_folio() submits only the dirty ranges, and the buffered write path sets just the range it copied. Only the mmap path throws that away, because iomap_dirty_folio() covers the whole folio. Narrowing the dirtying at page_mkwrite() time does not work on its own: set_pte_range() batch-maps a whole folio writable on the first shared write fault, so the stores that follow never fault and never reach the filesystem. So harvest the hardware instead. folio_clear_dirty_for_io() already calls folio_mkclean(), whose rmap walk reads pte_dirty() for every entry of the folio and throws it away. Those bits are the only record of which parts of a large folio were written through a mapping. Collect them there and hand the filesystem the runs that were dirty, through a new a_ops->dirty_folio_range(). All of this is about PTE-mapped folios. A PMD-mapped folio has a single dirty bit for the 2M it maps, so there is nothing finer to harvest, and it keeps writing back whole. Keeping shared write faults off PMDs is a separate patch and not part of this posting. On a 512M file in 2M folios on XFS, storing one byte per folio and calling msync() wrote 512M before and writes 1M after, with identical minor fault counts. Not addressed here: - Dirty accounting stays folio-granular. A 4K store still counts as 2M against dirty_ratio and balance_dirty_pages(). - iomap_page_mkwrite() still allocates blocks for the whole folio. - Filesystems without per-block dirty state see no change. Kiryl Shutsemau (Meta) (5): mm: let folio_mkclean() report which pages had dirty PTEs mm: add a_ops->dirty_folio_range() and use the mkclean dirty harvest mm: keep the mmap dirty range down to the faulting page iomap: narrow page_mkwrite() dirtying to the faulting page xfs: track mmap dirty state per block fs/iomap/buffered-io.c | 37 +++++++++++++----- fs/xfs/xfs_aops.c | 2 +- include/linux/fs.h | 3 ++ include/linux/iomap.h | 2 + include/linux/mm.h | 1 + include/linux/rmap.h | 7 ++++ mm/memory.c | 58 ++++++++++++++++++++++++++-- mm/page-writeback.c | 87 +++++++++++++++++++++++++++++++++++++++--- mm/rmap.c | 56 +++++++++++++++++++++------ 9 files changed, 222 insertions(+), 31 deletions(-) base-commit: 0a0d1d55dad570724bf8c7ea83409639cfb4be9b -- 2.54.0