Re: [PATCH v4 3/7] mm/khugepaged: introduce a count_collapse_event() helper

From: Lorenzo Stoakes (ARM)

Date: Mon Aug 17 2026 - 07:35:04 EST


On Tue, Aug 11, 2026 at 06:48:35AM -0600, Nico Pache (Red Hat) wrote:
> Provide a simple helper function to help reduce a often used, and
> duplicate pattern across the khugepaged code.
>
> When collapsing to a PMD we need to record a vm_event and the mTHP_stat
> event. When doing mTHP collapse we only update the mTHP stat.
>
> Reviewed-by: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx>
> Acked-by: David Hildenbrand (Arm) <david@xxxxxxxxxx>
> Acked-by: Usama Arif <usama.arif@xxxxxxxxx>
> Signed-off-by: Nico Pache (Red Hat) <nico.pache@xxxxxxxxx>

LGTM so:

Reviewed-by: Lorenzo Stoakes (ARM) <ljs@xxxxxxxxxx>

> ---
> mm/khugepaged.c | 42 +++++++++++++++++++++---------------------
> 1 file changed, 21 insertions(+), 21 deletions(-)
>
> diff --git a/mm/khugepaged.c b/mm/khugepaged.c
> index 8babd4c97db6..cae510aa2914 100644
> --- a/mm/khugepaged.c
> +++ b/mm/khugepaged.c
> @@ -688,6 +688,14 @@ static inline bool folio_pte_referenced(struct folio *folio,
> return pte_young(pteval) || mmu_notifier_test_young(vma->vm_mm, addr);
> }
>
> +static void count_collapse_event(unsigned int order, enum vm_event_item vm_event,
> + enum mthp_stat_item mthp_event)

Add a comment! Lol no only joking ;)

> +{
> + if (is_pmd_order(order))
> + count_vm_event(vm_event);
> + count_mthp_stat(order, mthp_event);
> +}
> +
> static enum scan_result __collapse_huge_page_isolate(struct vm_area_struct *vma,
> unsigned long start_addr, pte_t *pte, struct collapse_control *cc,
> unsigned int order, struct list_head *compound_pagelist)
> @@ -708,9 +716,8 @@ static enum scan_result __collapse_huge_page_isolate(struct vm_area_struct *vma,
> if (pte_none_or_zero(pteval)) {
> if (++none_or_zero > max_ptes_none) {
> result = SCAN_EXCEED_NONE_PTE;
> - if (is_pmd_order(order))
> - count_vm_event(THP_SCAN_EXCEED_NONE_PTE);
> - count_mthp_stat(order, MTHP_STAT_COLLAPSE_EXCEED_NONE);
> + count_collapse_event(order, THP_SCAN_EXCEED_NONE_PTE,
> + MTHP_STAT_COLLAPSE_EXCEED_NONE);
> goto out;
> }
> continue;
> @@ -752,9 +759,8 @@ static enum scan_result __collapse_huge_page_isolate(struct vm_area_struct *vma,
> */
> if (++shared > max_ptes_shared) {
> result = SCAN_EXCEED_SHARED_PTE;
> - if (is_pmd_order(order))
> - count_vm_event(THP_SCAN_EXCEED_SHARED_PTE);
> - count_mthp_stat(order, MTHP_STAT_COLLAPSE_EXCEED_SHARED);
> + count_collapse_event(order, THP_SCAN_EXCEED_SHARED_PTE,
> + MTHP_STAT_COLLAPSE_EXCEED_SHARED);
> goto out;
> }
> }
> @@ -1264,15 +1270,12 @@ static enum scan_result alloc_charge_folio(struct folio **foliop, struct mm_stru
> folio = __folio_alloc(gfp, order, node, &cc->alloc_nmask);
> if (!folio) {
> *foliop = NULL;
> - if (is_pmd_order(order))
> - count_vm_event(THP_COLLAPSE_ALLOC_FAILED);
> - count_mthp_stat(order, MTHP_STAT_COLLAPSE_ALLOC_FAILED);
> + count_collapse_event(order, THP_COLLAPSE_ALLOC_FAILED,
> + MTHP_STAT_COLLAPSE_ALLOC_FAILED);
> return SCAN_ALLOC_HUGE_PAGE_FAIL;
> }
>
> - if (is_pmd_order(order))
> - count_vm_event(THP_COLLAPSE_ALLOC);
> - count_mthp_stat(order, MTHP_STAT_COLLAPSE_ALLOC);
> + count_collapse_event(order, THP_COLLAPSE_ALLOC, MTHP_STAT_COLLAPSE_ALLOC);
>
> if (unlikely(mem_cgroup_charge(folio, mm, gfp))) {
> folio_put(folio);
> @@ -1662,9 +1665,8 @@ static enum scan_result collapse_scan_pmd(struct mm_struct *mm,
> if (pte_none_or_zero(pteval)) {
> if (++none_or_zero > max_ptes_none) {
> result = SCAN_EXCEED_NONE_PTE;
> - count_vm_event(THP_SCAN_EXCEED_NONE_PTE);
> - count_mthp_stat(HPAGE_PMD_ORDER,
> - MTHP_STAT_COLLAPSE_EXCEED_NONE);
> + count_collapse_event(HPAGE_PMD_ORDER, THP_SCAN_EXCEED_NONE_PTE,
> + MTHP_STAT_COLLAPSE_EXCEED_NONE);
> goto out_unmap;
> }
> continue;
> @@ -1672,9 +1674,8 @@ static enum scan_result collapse_scan_pmd(struct mm_struct *mm,
> if (!pte_present(pteval)) {
> if (++unmapped > max_ptes_swap) {
> result = SCAN_EXCEED_SWAP_PTE;
> - count_vm_event(THP_SCAN_EXCEED_SWAP_PTE);
> - count_mthp_stat(HPAGE_PMD_ORDER,
> - MTHP_STAT_COLLAPSE_EXCEED_SWAP);
> + count_collapse_event(HPAGE_PMD_ORDER, THP_SCAN_EXCEED_SWAP_PTE,
> + MTHP_STAT_COLLAPSE_EXCEED_SWAP);
> goto out_unmap;
> }
> /*
> @@ -1731,9 +1732,8 @@ static enum scan_result collapse_scan_pmd(struct mm_struct *mm,
> if (folio_maybe_mapped_shared(folio)) {
> if (++shared > max_ptes_shared) {
> result = SCAN_EXCEED_SHARED_PTE;
> - count_vm_event(THP_SCAN_EXCEED_SHARED_PTE);
> - count_mthp_stat(HPAGE_PMD_ORDER,
> - MTHP_STAT_COLLAPSE_EXCEED_SHARED);
> + count_collapse_event(HPAGE_PMD_ORDER, THP_SCAN_EXCEED_SHARED_PTE,
> + MTHP_STAT_COLLAPSE_EXCEED_SHARED);
> goto out_unmap;
> }
> }
>
> --
> 2.55.0
>

--
Cheers, Lorenzo