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

From: Zi Yan

Date: Sun Apr 05 2026 - 22:00:17 EST


On 5 Apr 2026, at 13:38, Nico Pache wrote:

> 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.

Sure. Thanks.

>
> 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?

Why would a read-only THP need to be split when it becomes writable?
After this patchset, a read-only THP can only be created on a FS that
supports large folios (to be precise PMD THP). That means any write
to that read-only THP would just change it to a writable THP.

Let me know if I miss anything.

>
> 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
>>


--
Best Regards,
Yan, Zi