[PATCH RFC v2 0/9] mm/huge_memory: refactor __split_huge_pmd_locked()
From: Yin Tirui
Date: Tue Nov 10 2026 - 13:00:57 EST
__split_huge_pmd_locked() currently decides from the VMA --
vma_is_anonymous(), then vma_is_special_huge() (now replaced by
!vma_is_mm_managed()) -- before inspecting the PMD entry, so split and
zap use different classification logic. The entry itself should decide.
The function also mixes the present and non-present cases, resulting
in duplicated code.
This series uses the PMD entry and its folio to decide how to handle each
PMD, as zap_huge_pmd() does. It separates the present and non-present paths
and moves their common work into helper functions. After this change,
__split_huge_pmd_locked() only selects the appropriate helper.
v1 -> v2:
https://lore.kernel.org/linux-mm/cover.1787941780.git.yintirui@xxxxxxxxx/#t
- Rebase onto mainline.
- Use !vma_is_mm_managed() in place of vma_is_special_huge() in patch 3.
- Use vma_has_deposited_pgtable() in patch 4, following Lance Yang's
pgtable deposit cleanup.
https://lore.kernel.org/linux-mm/20260917054015.23553-1-lance.yang@xxxxxxxxx/
Yin Tirui (9):
mm/huge_memory: read the huge PMD entry once when splitting it
mm/huge_memory: add and use huge_zero_pmd_can_split()
mm/huge_memory: add and use unmap_huge_pmd_entry()
mm/huge_memory: use normal_or_softleaf_folio_pmd() in the PMD split
path
mm/huge_memory: dispatch on the folio when splitting a huge PMD
mm/huge_memory: add and use split_huge_pmd_anon_rmap()
mm/huge_memory: add struct split_pmd_state
mm/huge_memory: split present and non-present huge PMDs separately
mm/huge_memory: unify the migration and device private PTE loops
mm/huge_memory.c | 525 +++++++++++++++++++++++++++--------------------
1 file changed, 302 insertions(+), 223 deletions(-)
--
2.34.1