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

From: Kiryl Shutsemau

Date: Fri Sep 04 2026 - 12:31:40 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: Claude-Code:claude-opus-5
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 f1f8d4375e96..a6dfd8cddc50 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -2822,10 +2822,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);
@@ -2861,9 +2859,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;
}

@@ -2940,6 +2935,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