Re: [PATCH v1 00/10] Remove READ_ONLY_THP_FOR_FS Kconfig

From: Nico Pache

Date: Sun Apr 05 2026 - 13:39:03 EST


On Thu, Mar 26, 2026 at 7:43 PM Zi Yan <ziy@xxxxxxxxxx> wrote:
>
> Hi all,
>
> This patchset removes READ_ONLY_THP_FOR_FS Kconfig and enables creating
> read-only THPs for FSes with large folio support (the supported orders
> need to include PMD_ORDER) by default.

Hi Zi,

Thank you for tackling this :) Ill try to review the next version as
I'm a little behind on this thread.

Should we guard collapsing READ_ONLY_THPs with a sysctl? My fear is
workloads that convert READ_ONLY THPs into writable pages (assuming
this is common/possible; my understanding of FS is rather low),
leading to storms of thp splitting. Do you think this is a real
concern? I guess this is also true of read-only-->writable fs-THPS
even without khugepaged, correct?

Cheers,
-- Nico

>
> The changes are:
> 1. collapse_file() from mm/khugepaged.c, instead of checking
> CONFIG_READ_ONLY_THP_FOR_FS, makes sure the mapping_max_folio_order()
> of struct address_space of the file is at least PMD_ORDER.
> 2. file_thp_enabled() also checks mapping_max_folio_order() instead.
> 3. truncate_inode_partial_folio() calls folio_split() directly instead
> of the removed try_folio_split_to_order(), since large folios can
> only show up on a FS with large folio support.
> 4. nr_thps is removed from struct address_space, since it is no longer
> needed to drop all read-only THPs from a FS without large folio
> support when the fd becomes writable. Its related filemap_nr_thps*()
> are removed too.
> 5. folio_check_splittable() no longer checks READ_ONLY_THP_FOR_FS.
> 6. Updated comments in various places.
>
> Changelog
> ===
> From RFC[1]:
> 1. instead of removing READ_ONLY_THP_FOR_FS function entirely, turn it
> on by default for all FSes with large folio support and the supported
> orders includes PMD_ORDER.
>
> Suggestions and comments are welcome.
>
> Link: https://lore.kernel.org/all/20260323190644.1714379-1-ziy@xxxxxxxxxx/ [1]
>
> Zi Yan (10):
> mm: remove READ_ONLY_THP_FOR_FS Kconfig option
> mm/khugepaged: remove READ_ONLY_THP_FOR_FS check
> mm: fs: remove filemap_nr_thps*() functions and their users
> fs: remove nr_thps from struct address_space
> mm/huge_memory: remove READ_ONLY_THP_FOR_FS from file_thp_enabled()
> mm/huge_memory: remove folio split check for READ_ONLY_THP_FOR_FS
> mm/truncate: use folio_split() in truncate_inode_partial_folio()
> fs/btrfs: remove a comment referring to READ_ONLY_THP_FOR_FS
> selftests/mm: remove READ_ONLY_THP_FOR_FS in khugepaged
> selftests/mm: remove READ_ONLY_THP_FOR_FS from comments in
> guard-regions
>
> fs/btrfs/defrag.c | 3 --
> fs/inode.c | 3 --
> fs/open.c | 27 ----------------
> include/linux/fs.h | 5 ---
> include/linux/huge_mm.h | 25 ++-------------
> include/linux/pagemap.h | 29 -----------------
> mm/Kconfig | 11 -------
> mm/filemap.c | 1 -
> mm/huge_memory.c | 29 ++---------------
> mm/khugepaged.c | 36 +++++-----------------
> mm/truncate.c | 8 ++---
> tools/testing/selftests/mm/guard-regions.c | 9 +++---
> tools/testing/selftests/mm/khugepaged.c | 4 +--
> 13 files changed, 23 insertions(+), 167 deletions(-)
>
> --
> 2.43.0
>