On Tue, Jul 8, 2025 at 12:10 AM Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx> wrote: > > > > On 2025/7/2 13:57, Nico Pache wrote: > > With mTHP support inplace, let add the per-order mTHP stats for > > exceeding NONE, SWAP, and SHARED. > > > > Signed-off-by: Nico Pache <npache@xxxxxxxxxx> > > --- > > include/linux/huge_mm.h | 3 +++ > > mm/huge_memory.c | 7 +++++++ > > mm/khugepaged.c | 15 ++++++++++++--- > > 3 files changed, 22 insertions(+), 3 deletions(-) > > > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > > index a6ea89fdaee6..6034b4c9dae5 100644 > > --- a/include/linux/huge_mm.h > > +++ b/include/linux/huge_mm.h > > @@ -141,6 +141,9 @@ enum mthp_stat_item { > > MTHP_STAT_SPLIT_DEFERRED, > > MTHP_STAT_NR_ANON, > > MTHP_STAT_NR_ANON_PARTIALLY_MAPPED, > > + MTHP_STAT_COLLAPSE_EXCEED_SWAP, > > This stat seems never used. Ah good catch, I somehow dropped that piece on the V5->v6/7 > > > + MTHP_STAT_COLLAPSE_EXCEED_NONE, > > + MTHP_STAT_COLLAPSE_EXCEED_SHARED, > > __MTHP_STAT_COUNT > > }; > > Please also update the 'Documentation/admin-guide/mm/transhuge.rst' for > these new statistics. Will do thanks :) > > > > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > > index 69777a35e722..3eb1c34be601 100644 > > --- a/mm/huge_memory.c > > +++ b/mm/huge_memory.c > > @@ -632,6 +632,10 @@ DEFINE_MTHP_STAT_ATTR(split_failed, MTHP_STAT_SPLIT_FAILED); > > 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(collapse_exceed_swap_pte, MTHP_STAT_COLLAPSE_EXCEED_SWAP); > > +DEFINE_MTHP_STAT_ATTR(collapse_exceed_none_pte, MTHP_STAT_COLLAPSE_EXCEED_NONE); > > +DEFINE_MTHP_STAT_ATTR(collapse_exceed_shared_pte, MTHP_STAT_COLLAPSE_EXCEED_SHARED); > > + > > > > static struct attribute *anon_stats_attrs[] = { > > &anon_fault_alloc_attr.attr, > > @@ -648,6 +652,9 @@ static struct attribute *anon_stats_attrs[] = { > > &split_deferred_attr.attr, > > &nr_anon_attr.attr, > > &nr_anon_partially_mapped_attr.attr, > > + &collapse_exceed_swap_pte_attr.attr, > > + &collapse_exceed_none_pte_attr.attr, > > + &collapse_exceed_shared_pte_attr.attr, > > NULL, > > }; > > > > diff --git a/mm/khugepaged.c b/mm/khugepaged.c > > index 2c0962637c34..636b84bf1ca1 100644 > > --- a/mm/khugepaged.c > > +++ b/mm/khugepaged.c > > @@ -594,7 +594,10 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, > > continue; > > } else { > > result = SCAN_EXCEED_NONE_PTE; > > - count_vm_event(THP_SCAN_EXCEED_NONE_PTE); > > + if (order == HPAGE_PMD_ORDER) > > + count_vm_event(THP_SCAN_EXCEED_NONE_PTE); > > + else > > + count_mthp_stat(order, MTHP_STAT_COLLAPSE_EXCEED_NONE); > > goto out; > > } > > } > > @@ -623,8 +626,14 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, > > /* See khugepaged_scan_pmd(). */ > > if (folio_maybe_mapped_shared(folio)) { > > ++shared; > > - if (order != HPAGE_PMD_ORDER || (cc->is_khugepaged && > > - shared > khugepaged_max_ptes_shared)) { > > + if (order != HPAGE_PMD_ORDER) { > > + result = SCAN_EXCEED_SHARED_PTE; > > + count_mthp_stat(order, MTHP_STAT_COLLAPSE_EXCEED_SHARED); > > + goto out; > > + } > > + > > + if (cc->is_khugepaged && > > + shared > khugepaged_max_ptes_shared) { > > result = SCAN_EXCEED_SHARED_PTE; > > count_vm_event(THP_SCAN_EXCEED_SHARED_PTE); > > goto out; >