Documentation/admin-guide/mm/transhuge.rst | 6 +- mm/khugepaged.c | 414 +++++++++++++++-------------- 2 files changed, 222 insertions(+), 198 deletions(-)
The following changes stem from a number of reviews during my khugepaged
mTHP support series [1]. Some of these are minor code cleanups, issues or
reviews that we decided to deferred to a followup series, or in the case
of the more major patch of the series, changes [2] Lance Yang attempted
while my series was in-flight and we decided to wait till later to try.
The first 3 patches introduce helper functions to increase code reuse and
readability. This includes a per-scan state clearing function, extracting
the young page check into a helper, and a count_collapse_event() function
to reduce a repetative pattern used across mTHP collapse.
The 4th patch was the byproduct of me throwing Claude at all the
comments in khugepaged verifying and looking for any outdated info.
The 5th patch is based on Lance Yang's commit series [2] trying to extract
the PTE state checking into a helper function. This required a bit of
rewriting due to differences after mTHP collapse was introduced. I also
took into account the changes requested during his patches review cycle.
The remaining 2 patches were review points during my mTHP series that we
agreed can be deferred to a later series.
Thank you to those whos reviews and work I leveraged to achieve these
cleanups.
Changes in v4:
- Add Acks/RB tags
- [patch2] rename pte_is_referenced() to folio_pte_referenced()
- [patch2] keep cc->is_khugepaged out of the helper gate
- [patch2] simplify/clarify the helper comment
V3 Changes:
- Add Acks/RB tags
- rename collapse_is_referenced() to pte_is_referenced()
- fix count_collapse_event() call-site indentation to match kernel style
- fold in the follow-up fix so collapse_scan_pmd() always assigns the
local folio from collapse_check_pte()
- normalize khugepaged comment references to use parentheses
V2 Changes:
- Add Acks/RB tags
- rename collapse_is_young() to collapse_is_referenced()
- delete unncessary comment for collapse_control_init_scan()
- merge fixup from V1 (fixes stale folio reference) into patch 5
- keep original ordering for checks in patch 5
- merge patch 7 into patch 4
- conflict resolution from uffd_rwp changes
V3: https://lore.kernel.org/all/20260804-khugepaged_pte_refactor-v3-0-0364cad642a0@linux.dev
V2: https://lore.kernel.org/all/20260715025941.1571316-1-npache@redhat.com/
V1: https://lore.kernel.org/all/20260706154500.39178-1-npache@redhat.com/
[1] - https://lore.kernel.org/all/20260605161422.213817-1-npache@redhat.com/
[2] - https://lore.kernel.org/all/20251008043748.45554-1-lance.yang@linux.dev/
Signed-off-by: Nico Pache (Red Hat) <nico.pache@linux.dev>
---
Nico Pache (Red Hat) (7):
mm/khugepaged: refactor per-scan state clearing into collapse_control_init_scan()
mm/khugepaged: extract reference check into folio_pte_referenced() helper
mm/khugepaged: introduce a count_collapse_event() helper
mm/khugepaged: fix outdated comments
mm/khugepaged: Refactor the PTE state checks into a helper
mm/khugepaged: unmap pte before releasing vma write lock
mm: Documentation: clarify where the mTHP stats live
Documentation/admin-guide/mm/transhuge.rst | 6 +-
mm/khugepaged.c | 414 +++++++++++++++--------------
2 files changed, 222 insertions(+), 198 deletions(-)
---
base-commit: 005d5c898c17ecadec427819a20640e37c357997
change-id: 20260804-khugepaged_pte_refactor-5eb76e14b93a
Best regards,
--
Nico Pache (Red Hat) <nico.pache@linux.dev>
On Tue, 11 Aug 2026 06:48:32 -0600 "Nico Pache (Red Hat)" <nico.pache@linux.dev> wrote:
> The following changes stem from a number of reviews during my khugepaged
> mTHP support series [1]. Some of these are minor code cleanups, issues or
> reviews that we decided to deferred to a followup series, or in the case
> of the more major patch of the series, changes [2] Lance Yang attempted
> while my series was in-flight and we decided to wait till later to try.
Thanks, I've updated mm.git's mm-unstable branch to this version.
> Changes in v4:
> - Add Acks/RB tags
> - [patch2] rename pte_is_referenced() to folio_pte_referenced()
> - [patch2] keep cc->is_khugepaged out of the helper gate
> - [patch2] simplify/clarify the helper comment
Here's how v4 altered mm.git:
mm/khugepaged.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
--- a/mm/khugepaged.c~b
+++ a/mm/khugepaged.c
@@ -693,20 +693,19 @@ static void release_pte_pages(pte_t *pte
}
/*
- * pte_is_referenced() - Check for enough referenced PTEs to justify collapsing
+ * folio_pte_referenced() - Check if a folio or its PTE mapping was recently used
*
- * If collapse was initiated by khugepaged, check that the page has been
- * recently accessed (young pte) to justify collapsing the page.
- *
- * Return: true if the page has been recently accessed.
+ * Return: true if recent access was observed through either the folio state
+ * or the current PTE mapping.
*/
-static inline bool pte_is_referenced(struct collapse_control *cc, pte_t pteval,
- struct folio *folio, struct vm_area_struct *vma, unsigned long addr)
+static inline bool folio_pte_referenced(struct folio *folio,
+ struct vm_area_struct *vma, unsigned long addr, pte_t pteval)
{
- return cc->is_khugepaged &&
- (pte_young(pteval) || folio_test_young(folio) ||
- folio_test_referenced(folio) ||
- mmu_notifier_test_young(vma->vm_mm, addr));
+ /* The folio was referenced previously ... */
+ if (folio_test_young(folio) || folio_test_referenced(folio))
+ return true;
+ /* ... or the PTE mapping was recently used */
+ 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,
@@ -910,7 +909,8 @@ static enum scan_result __collapse_huge_
if (folio_test_large(folio))
list_add_tail(&folio->lru, compound_pagelist);
next:
- if (pte_is_referenced(cc, pteval, folio, vma, addr))
+ if (cc->is_khugepaged &&
+ folio_pte_referenced(folio, vma, addr, pteval))
referenced++;
}
@@ -1790,7 +1790,8 @@ static enum scan_result collapse_scan_pm
goto out_unmap;
}
- if (pte_is_referenced(cc, pteval, folio, vma, addr))
+ if (cc->is_khugepaged &&
+ folio_pte_referenced(folio, vma, addr, pteval))
referenced++;
}
if (cc->is_khugepaged &&
_
On 8/11/26 20:23, Andrew Morton wrote: > On Tue, 11 Aug 2026 06:48:32 -0600 "Nico Pache (Red Hat)" <nico.pache@linux.dev> wrote: > >> The following changes stem from a number of reviews during my khugepaged >> mTHP support series [1]. Some of these are minor code cleanups, issues or >> reviews that we decided to deferred to a followup series, or in the case >> of the more major patch of the series, changes [2] Lance Yang attempted >> while my series was in-flight and we decided to wait till later to try. > > Thanks, I've updated mm.git's mm-unstable branch to this version. > >> Changes in v4: >> - Add Acks/RB tags >> - [patch2] rename pte_is_referenced() to folio_pte_referenced() >> - [patch2] keep cc->is_khugepaged out of the helper gate >> - [patch2] simplify/clarify the helper comment > > Here's how v4 altered mm.git: I want to review #5 before this goes upstream. Will try getting it done tomorrow. -- Cheers, David
© 2016 - 2026 Red Hat, Inc.