On Fri, Nov 08, 2024 at 12:49:58PM -0700, Jens Axboe wrote: > On 11/8/24 12:26 PM, Jens Axboe wrote: > > On 11/8/24 11:46 AM, Matthew Wilcox wrote: > >> On Fri, Nov 08, 2024 at 10:43:34AM -0700, Jens Axboe wrote: > >>> +++ b/fs/iomap/buffered-io.c > >>> @@ -959,6 +959,8 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i) > >>> } > >>> if (iter->iomap.flags & IOMAP_F_STALE) > >>> break; > >>> + if (iter->flags & IOMAP_UNCACHED) > >>> + folio_set_uncached(folio); > >> > >> This seems like it'd convert an existing page cache folio into being > >> uncached? Is this just leftover from a previous version or is that a > >> design decision you made? > > > > I'll see if we can improve that. Currently both the read and write side > > do drop whatever it touches. We could feasibly just have it drop > > newly instantiated pages - iow, uncached just won't create new persistent > > folios, but it'll happily use the ones that are there already. > > Well that was nonsense on the read side, it deliberately only prunes > entries that has uncached set. For the write side, this is a bit > trickier. We'd essentially need to know if the folio populated by > write_begin was found in the page cache, or create from new. Any way we > can do that? One way is to change ->write_begin() so it takes a kiocb > rather than a file, but that's an amount of churn I'd rather avoid! > Maybe there's a way I'm just not seeing? Umm. We can solve it for iomap with a new FGP_UNCACHED flag and checking IOMAP_UNCACHED in iomap_get_folio(). Not sure how we solve it for other filesystems though. Any filesystem which uses FGP_NOWAIT has _a_ solution, but eg btrfs will need to plumb through a third boolean flag (or, more efficiently, just start passing FGP flags to prepare_one_folio()).