From fc2fb231c22f1889e987ddb9d8ffed1cb2dcd0fd Mon Sep 17 00:00:00 2001 From: Jiangtian Feng Date: Mon, 1 Jun 2026 19:52:00 +0800 Subject: [PATCH] anolis: mm: add mTHP file folio fallback statistics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ANBZ: #36707 Commit b024a5c24839 ("anolis: mm: add mTHP counters for file folios") introduced MTHP_STAT_FILE_ALLOC to count successful file-backed large folio allocations. However when __filemap_get_folio_mpol() falls back to a lower order — either because the allocation failed (alloc fallback) or because filemap_add_folio() rejected the charge (charge fallback) — no per-order counter is bumped. Operators cannot distinguish "no large folio attempted" from "tried order-N, fell back due to fragmentation or memcg charge limit". Add two new per-order counters mirroring the anon-folio triple (ANON_FAULT_FALLBACK / _CHARGE) and the shmem triple (SHMEM_FALLBACK / _CHARGE): MTHP_STAT_FILE_FALLBACK alloc failure fallback MTHP_STAT_FILE_FALLBACK_CHARGE filemap_add_folio failure fallback Bumped at the two fallback sites in __filemap_get_folio_mpol() (mm/filemap.c), and exposed via sysfs at /sys/kernel/mm/transparent_hugepage/hugepages-*kB/stats/file_fallback and file_fallback_charge. Counter-only patch, zero behaviour change. Signed-off-by: Jiangtian Feng --- include/linux/huge_mm.h | 2 ++ mm/filemap.c | 6 +++++- mm/huge_memory.c | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 4050b8bfaf2a..a6bbcd4deb39 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -161,6 +161,8 @@ enum mthp_stat_item { MTHP_STAT_NR_ANON, MTHP_STAT_NR_ANON_PARTIALLY_MAPPED, MTHP_STAT_FILE_ALLOC, + MTHP_STAT_FILE_FALLBACK, + MTHP_STAT_FILE_FALLBACK_CHARGE, __MTHP_STAT_COUNT }; diff --git a/mm/filemap.c b/mm/filemap.c index 2973465d9ee3..08b69fd61454 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2027,8 +2027,10 @@ struct folio *__filemap_get_folio_mpol(struct address_space *mapping, if (order > min_order) alloc_gfp |= __GFP_NORETRY | __GFP_NOWARN; folio = filemap_alloc_folio(alloc_gfp, order, policy); - if (!folio) + if (!folio) { + count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK); goto try_next; + } /* Init accessed so avoid atomic mark_page_accessed later */ if (fgp_flags & FGP_ACCESSED) @@ -2041,6 +2043,8 @@ struct folio *__filemap_get_folio_mpol(struct address_space *mapping, break; folio_put(folio); folio = NULL; + if (err != -EEXIST) + count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK_CHARGE); try_next: if (order <= min_order) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 94c69255bea3..9ece5314e82a 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -755,6 +755,8 @@ DEFINE_MTHP_STAT_ATTR(split_deferred, MTHP_STAT_SPLIT_DEFERRED); DEFINE_MTHP_STAT_ATTR(nr_anon, MTHP_STAT_NR_ANON); DEFINE_MTHP_STAT_ATTR(nr_anon_partially_mapped, MTHP_STAT_NR_ANON_PARTIALLY_MAPPED); DEFINE_MTHP_STAT_ATTR(file_alloc, MTHP_STAT_FILE_ALLOC); +DEFINE_MTHP_STAT_ATTR(file_fallback, MTHP_STAT_FILE_FALLBACK); +DEFINE_MTHP_STAT_ATTR(file_fallback_charge, MTHP_STAT_FILE_FALLBACK_CHARGE); static struct attribute *anon_stats_attrs[] = { &anon_fault_alloc_attr.attr, @@ -781,6 +783,8 @@ static struct attribute_group anon_stats_attr_grp = { static struct attribute *file_stats_attrs[] = { &file_alloc_attr.attr, + &file_fallback_attr.attr, + &file_fallback_charge_attr.attr, #ifdef CONFIG_SHMEM &shmem_alloc_attr.attr, &shmem_fallback_attr.attr, -- Gitee