Re: [PATCH 7.2 v4 01/12] mm/khugepaged: remove READ_ONLY_THP_FOR_FS check

Andrew Morton
2026-04-25T22:01:37Z

On Thu, 23 Apr 2026 22:49:04 -0400 Zi Yan <ziy@nvidia.com> wrote:

> collapse_file() requires FSes supporting large folio with at least
> PMD_ORDER, so replace the READ_ONLY_THP_FOR_FS check with that.
> MADV_COLLAPSE ignores shmem huge config, so exclude the check for shmem.
>
> While at it, replace VM_BUG_ON with VM_WARN_ON_ONCE.
>
> Add a helper function mapping_pmd_thp_support() for FSes supporting large
> folio with at least PMD_ORDER.

My arm allnoconfig blew up.

> --- a/include/linux/pagemap.h
> +++ b/include/linux/pagemap.h
> @@ -513,6 +513,15 @@ static inline bool mapping_large_folio_support(const struct address_space *mappi
> return mapping_max_folio_order(mapping) > 0;
> }
>
> +static inline bool mapping_pmd_thp_support(const struct address_space *mapping)
> +{
> + /* AS_FOLIO_ORDER is only reasonable for pagecache folios */
> + VM_WARN_ON_ONCE((unsigned long)mapping & FOLIO_MAPPING_ANON);
> +
> + return mapping_max_folio_order(mapping) >= PMD_ORDER;
> +}
> +
> +

- Should it be named "mapping_pmd_thp_supported"?

- What does it actually *do*? A little comment explaining this would
be appropriate.

- Is it appropriate that this be inlined?

I added the below.

From: Andrew Morton <akpm@linux-foundation.org>
Subject: mm-khugepaged-remove-read_only_thp_for_fs-check-fix
Date: Sat Apr 25 02:54:04 PM PDT 2026

fix arm64 allnoconfig by uninlining mapping_pmd_thp_support()

In file included from ./include/linux/mm.h:31,
from fs/inode.c:9:
./include/linux/pagemap.h: In function 'mapping_pmd_thp_support':
./include/linux/pgtable.h:8:26: error: 'PMD_SHIFT' undeclared (first use in this function); did you mean 'PUD_SHIFT'?
8 | #define PMD_ORDER (PMD_SHIFT - PAGE_SHIFT)
| ^~~~~~~~~
./include/linux/pagemap.h:521:52: note: in expansion of macro 'PMD_ORDER'
521 | return mapping_max_folio_order(mapping) >= PMD_ORDER;
| ^~~~~~~~~
./include/linux/pgtable.h:8:26: note: each undeclared identifier is reported only once for each function it appears in
8 | #define PMD_ORDER (PMD_SHIFT - PAGE_SHIFT)
| ^~~~~~~~~
./include/linux/pagemap.h:521:52: note: in expansion of macro 'PMD_ORDER'
521 | return mapping_max_folio_order(mapping) >= PMD_ORDER;
| ^~~~~~~~~
make[3]: *** [scripts/Makefile.build:289: fs/inode.o] Error 1
make[2]: *** [scripts/Makefile.build:548: fs] Error 2
make[1]: *** [/usr/src/25/Makefile:2139: .] Error 2
make: *** [Makefile:248: __sub-make] Error 2

Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

include/linux/pagemap.h | 9 +--------
mm/filemap.c | 8 ++++++++
2 files changed, 9 insertions(+), 8 deletions(-)

--- a/include/linux/pagemap.h~mm-khugepaged-remove-read_only_thp_for_fs-check-fix
+++ a/include/linux/pagemap.h
@@ -513,14 +513,7 @@ static inline bool mapping_large_folio_s
return mapping_max_folio_order(mapping) > 0;
}

-static inline bool mapping_pmd_thp_support(const struct address_space *mapping)
-{
- /* AS_FOLIO_ORDER is only reasonable for pagecache folios */
- VM_WARN_ON_ONCE((unsigned long)mapping & FOLIO_MAPPING_ANON);
-
- return mapping_max_folio_order(mapping) >= PMD_ORDER;
-}
-
+bool mapping_pmd_thp_support(const struct address_space *mapping);

/* Return the maximum folio size for this pagecache mapping, in bytes. */
static inline size_t mapping_max_folio_size(const struct address_space *mapping)
--- a/mm/filemap.c~mm-khugepaged-remove-read_only_thp_for_fs-check-fix
+++ a/mm/filemap.c
@@ -126,6 +126,14 @@
* ->private_lock (zap_pte_range->block_dirty_folio)
*/

+bool mapping_pmd_thp_support(const struct address_space *mapping)
+{
+ /* AS_FOLIO_ORDER is only reasonable for pagecache folios */
+ VM_WARN_ON_ONCE((unsigned long)mapping & FOLIO_MAPPING_ANON);
+
+ return mapping_max_folio_order(mapping) >= PMD_ORDER;
+}
+
static void page_cache_delete(struct address_space *mapping,
struct folio *folio, void *shadow)
{
_