On Tue, Aug 19, 2025 at 7:49 AM Nico Pache <npa...@redhat.com> wrote: > > With mTHP support inplace, let add the per-order mTHP stats for > exceeding NONE, SWAP, and SHARED. > > Signed-off-by: Nico Pache <npa...@redhat.com>
I had git send email error and had to resend this patch (12) and patch 13, but i forgot the in-reply-to please ignore this one and reply to correct version https://lore.kernel.org/lkml/20250819141610.626140-1-npa...@redhat.com/ --in-reply-to=20250819141610.626140-1-npa...@redhat.com -- Nico > --- > Documentation/admin-guide/mm/transhuge.rst | 17 +++++++++++++++++ > include/linux/huge_mm.h | 3 +++ > mm/huge_memory.c | 7 +++++++ > mm/khugepaged.c | 16 +++++++++++++--- > 4 files changed, 40 insertions(+), 3 deletions(-) > > diff --git a/Documentation/admin-guide/mm/transhuge.rst > b/Documentation/admin-guide/mm/transhuge.rst > index 7ccb93e22852..b85547ac4fe9 100644 > --- a/Documentation/admin-guide/mm/transhuge.rst > +++ b/Documentation/admin-guide/mm/transhuge.rst > @@ -705,6 +705,23 @@ nr_anon_partially_mapped > an anonymous THP as "partially mapped" and count it here, even though > it > is not actually partially mapped anymore. > > +collapse_exceed_swap_pte > + The number of anonymous THP which contain at least one swap PTE. > + Currently khugepaged does not support collapsing mTHP regions that > + contain a swap PTE. > + > +collapse_exceed_none_pte > + The number of anonymous THP which have exceeded the none PTE > threshold. > + With mTHP collapse, a bitmap is used to gather the state of a PMD > region > + and is then recursively checked from largest to smallest order against > + the scaled max_ptes_none count. This counter indicates that the next > + enabled order will be checked. > + > +collapse_exceed_shared_pte > + The number of anonymous THP which contain at least one shared PTE. > + Currently khugepaged does not support collapsing mTHP regions that > + contain a shared PTE. > + > As the system ages, allocating huge pages may be expensive as the > system uses memory compaction to copy data around memory to free a > huge page for use. There are some counters in ``/proc/vmstat`` to help > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index 4ada5d1f7297..6f1593d0b4b5 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -144,6 +144,9 @@ enum mthp_stat_item { > MTHP_STAT_SPLIT_DEFERRED, > MTHP_STAT_NR_ANON, > MTHP_STAT_NR_ANON_PARTIALLY_MAPPED, > + MTHP_STAT_COLLAPSE_EXCEED_SWAP, > + MTHP_STAT_COLLAPSE_EXCEED_NONE, > + MTHP_STAT_COLLAPSE_EXCEED_SHARED, > __MTHP_STAT_COUNT > }; > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 20d005c2c61f..9f0470c3e983 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -639,6 +639,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, > @@ -655,6 +659,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 c13bc583a368..5a3386043f39 100644 > --- a/mm/khugepaged.c > +++ b/mm/khugepaged.c > @@ -594,7 +594,9 @@ 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); > + count_mthp_stat(order, > MTHP_STAT_COLLAPSE_EXCEED_NONE); > goto out; > } > } > @@ -633,10 +635,17 @@ static int __collapse_huge_page_isolate(struct > vm_area_struct *vma, > * shared may cause a future higher order collapse on > a > * rescan of the same range. > */ > - 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); > + count_mthp_stat(order, > MTHP_STAT_COLLAPSE_EXCEED_SHARED); > goto out; > } > } > @@ -1084,6 +1093,7 @@ static int __collapse_huge_page_swapin(struct mm_struct > *mm, > * range. > */ > if (order != HPAGE_PMD_ORDER) { > + count_mthp_stat(order, > MTHP_STAT_COLLAPSE_EXCEED_SWAP); > pte_unmap(pte); > mmap_read_unlock(mm); > result = SCAN_EXCEED_SWAP_PTE; > -- > 2.50.1 >