From: Pedro Falcato <pfalcato@suse.de>
To: Gregg Leventhal <gleventhal@janestreet.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
Matthew Wilcox <willy@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
Song Liu <song@kernel.org>,
linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org,
Eric Hagberg <ehagberg@janestreet.com>,
David Hildenbrand <david@kernel.org>,
Lorenzo Stoakes <ljs@kernel.org>, Zi Yan <ziy@nvidia.com>
Subject: Re: Subject: [BUG/RFC] write-open file THP cache purge can discard dirty page cache
Date: Tue, 30 Jun 2026 19:49:09 +0100 [thread overview]
Message-ID: <akQO8JtTxmp89GS8@pedro-suse.lan> (raw)
In-Reply-To: <akQIIav_zaK6RmIC@pedro-suse.lan>
On Tue, Jun 30, 2026 at 07:31:07PM +0100, Pedro Falcato wrote:
> +CC some relevant THP folks
> Quick note, your email client's spacing seems to be all over the place, making
> this extremely hard to read.
>
> On Tue, Jun 30, 2026 at 01:01:53PM -0400, Gregg Leventhal wrote:
> > Hello,
> >
> > We (Gregg Leventhal <gleventhal@janestreet.com> and Eric Hagberg
> >
> > <ehagberg@janestreet.com>) have a reproducible data-loss issue involving file
> >
> > THPs and write-open, impacting filesystems that do not support
> > writable large folios.
> >
> >
> > Attached are:
> >
> >
> > - thp_write_open_cancel_dirty_repro.c
> >
> > - thp-open-writeback-before-purge.patch
> >
> >
> >
> > Summary
> >
> > =======
> >
> >
> > On an affected 6.12 kernel with CONFIG_READ_ONLY_THP_FOR_FS=y, a file can
> >
> > contain read-only file THPs installed by khugepaged / MADV_COLLAPSE. When that
> >
> > same file is later opened for write, do_dentry_open() notices
> >
> > filemap_nr_thps() and drops the page cache:
> >
> >
> > /*
> >
> > * XXX: Huge page cache doesn't support writing yet. Drop all page
> >
> > * cache for this file before processing writes.
> >
> > */
> >
> > if (f->f_mode & FMODE_WRITE) {
> >
> > if (filemap_nr_thps(inode->i_mapping)) {
> >
> > struct address_space *mapping = inode->i_mapping;
> >
> >
> > filemap_invalidate_lock(inode->i_mapping);
> >
> > unmap_mapping_range(mapping, 0, 0, 0);
> >
> > truncate_inode_pages(mapping, 0);
> >
> > filemap_invalidate_unlock(inode->i_mapping);
> >
> > }
> >
> > }
>
> Ugh, this is embarassing. So, good news: this code doesn't exist anymore
> in mainline! Bad news: it exists on every other upstream-stable-maintained
> release :|
>
> FWIW I don't think your fix works, there's still a race there (what if
> you write and wait, then someone dirties a folio, then you truncate the
> pagecache? you lost data again.). I'm attaching a very quick WIP patch
> that I wrote against 6.12 LTS (again, this does not exist in mainline).
> I _think_ we want to go roughly in that direction, either here or in
> collapse file paths. There are still problems which are invasive and
> I haven't dealt with (GUP and other "temporary" folio releases being
> the main one). Some of these problems may simply make it so opening
> these files writable may fail (there is certainly, AFAIK, no way of
> waiting for GUP and other temporary folio holders).
>
> We would probably be served with a custom loop that forcibly yanks
> only THPs out the pagecache, though. But that requires a bit more
> code for a stable-only issue...
>
> Anyway, the patch is obviously ungood and uncromulent and is only
> here for a rough conversation starter. I don't think it works and
> it will probably never work. mapping invalidation is simply too
> best-effort for something that Just Needs(tm) to work.
Other idea: perhaps doing filemap_write_and_wait() after the nr_thps
increment in collapse_file() will Just Work and result in a _much_
simpler fix. And it avoids any weird forward-progress issues as no one can
write to folios at that point.
--
Pedro
next prev parent reply other threads:[~2026-06-30 18:49 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-30 17:01 Subject: [BUG/RFC] write-open file THP cache purge can discard dirty page cache Gregg Leventhal
2026-06-30 17:18 ` Gregg Leventhal
2026-06-30 18:31 ` Pedro Falcato
2026-06-30 18:49 ` Pedro Falcato [this message]
2026-06-30 19:55 ` Pedro Falcato
2026-06-30 22:34 ` Matthew Wilcox
2026-06-30 22:48 ` Zi Yan
2026-07-01 12:05 ` Pedro Falcato
2026-07-01 11:54 ` Matthew Wilcox
2026-07-01 12:04 ` Pedro Falcato
2026-07-01 12:48 ` Pedro Falcato
2026-07-01 13:07 ` Gregg Leventhal
2026-07-01 14:23 ` Pedro Falcato
2026-06-30 18:36 ` Matthew Wilcox
2026-06-30 19:05 ` Zi Yan
2026-06-30 19:07 ` Matthew Wilcox
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=akQO8JtTxmp89GS8@pedro-suse.lan \
--to=pfalcato@suse.de \
--cc=akpm@linux-foundation.org \
--cc=brauner@kernel.org \
--cc=david@kernel.org \
--cc=ehagberg@janestreet.com \
--cc=gleventhal@janestreet.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=song@kernel.org \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.