[PATCH v2 02/12] mm/khugepaged: count collapses where khugepaged makes them

From: Kiryl Shutsemau

Date: Thu Sep 10 2026 - 08:17:00 EST


From: "Kiryl Shutsemau (Meta)" <kas@xxxxxxxxxx>

collapse_single_pmd() bumps khugepaged_pages_collapsed for its caller, and
tests cc->is_khugepaged to know whether it should: the counter belongs to
the daemon, and MADV_COLLAPSE must not touch it.

The daemon sees every result of every collapse it asks for, so it can keep
its own counter without the shared path testing who called.

Assisted-by: LLM
Reviewed-by: Zi Yan <ziy@xxxxxxxxxx>
Reviewed-by: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx>
Signed-off-by: Kiryl Shutsemau (Meta) <kas@xxxxxxxxxx>
---
mm/khugepaged.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 75c876acf527..4979a93e3648 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -2815,10 +2815,8 @@ static enum scan_result collapse_single_pmd(unsigned long addr,

mmap_assert_locked(mm);

- if (vma_is_anonymous(vma)) {
- result = collapse_scan_pmd(mm, vma, addr, lock_dropped, cc);
- goto end;
- }
+ if (vma_is_anonymous(vma))
+ return collapse_scan_pmd(mm, vma, addr, lock_dropped, cc);

file = get_file(vma->vm_file);
pgoff = linear_page_index(vma, addr);
@@ -2854,9 +2852,6 @@ static enum scan_result collapse_single_pmd(unsigned long addr,
result = SCAN_SUCCEED;
mmap_read_unlock(mm);
}
-end:
- if (cc->is_khugepaged && result == SCAN_SUCCEED)
- ++khugepaged_pages_collapsed;
return result;
}

@@ -2933,6 +2928,8 @@ static void collapse_scan_mm_slot(unsigned int progress_max,

*result = collapse_single_pmd(khugepaged_scan.address,
vma, &lock_dropped, cc);
+ if (*result == SCAN_SUCCEED)
+ khugepaged_pages_collapsed++;
/* move to next address */
khugepaged_scan.address += HPAGE_PMD_SIZE;
if (lock_dropped)
--
2.54.0