Re: [BUG/RFC] mm/madvise: MADV_WILLNEED skips swapped file-backed COW pages
From: zhaozhengzhuo
Date: Thu Sep 03 2026 - 03:14:33 EST
Hi Mike,
Thanks for the report. I reproduced this on x86-64 with the current
mm-unstable tree at:
e3b5239afe1b ("mm: gup: cleanup the gup_fast_*() call chain")
The test used a 64 MiB ordinary file-backed MAP_PRIVATE mapping and
disk-backed swap. Since the test machine has 128 GiB of RAM, the pages
initially remained in swap cache after MADV_PAGEOUT. I therefore added
controlled memory pressure between MADV_PAGEOUT and MADV_WILLNEED so
that the swap-cache folios were actually reclaimed.
Across three runs, the pswpin deltas (in 4 KiB pages) were:
run 1 run 2 run 3
after MADV_WILLNEED 2 0 0
during subsequent touch 16327 15811 15676
The mapping still reported about 64 MiB in Swap after MADV_WILLNEED,
and almost all swap reads occurred only when the pages were touched.
This appears to confirm that madvise_willneed() skips the private swap
entries because the VMA still has vm_file and therefore takes the file
readahead path. vfs_fadvise(POSIX_FADV_WILLNEED) can prefetch the
underlying file contents, but not the modified private contents stored
in swap.
Are you already working on a fix? If testing or other help would be
useful, I would be happy to help.
Thanks,
zhaozhengzhuo