[PATCH 0/8] mm/huge_memory: refactor zap_huge_pmd()

From: Lorenzo Stoakes (Oracle)

Date: Wed Mar 18 2026 - 16:40:36 EST


The zap_huge_pmd() function is overly complicated, clean it up and also add
an assert in the case that we encounter a buggy PMD entry that doesn't
match expectations.

This is motivated by a bug discovered [0] where the PMD entry was none of:

- A non-DAX, PFN or mixed map.
- The huge zero folio
- A present PMD entry
- A softleaf entry

In zap_huge_pmd(), but due to the bug we manged to reach this code.

It is useful to explicitly call this out rather than have an arbitrary NULL
pointer dereference happen, which also improves understanding of what's
going on.

[0]:https://lore.kernel.org/all/6b3d7ad7-49e1-407a-903d-3103704160d8@lucifer.local/

Lorenzo Stoakes (Oracle) (8):
mm/huge_memory: simplify vma_is_specal_huge()
mm/huge: avoid big else branch in zap_huge_pmd()
mm/huge_memory: have zap_huge_pmd return a boolean, add kdoc
mm/huge_memory: handle buggy PMD entry in zap_huge_pmd()
mm/huge_memory: add a common exit path to zap_huge_pmd()
mm/huge_memory: remove unnecessary VM_BUG_ON_PAGE()
mm/huge_memory: deduplicate zap deposited table call
mm/huge_memory: deduplicate zap_huge_pmd() further by tracking state

include/linux/huge_mm.h | 8 +--
include/linux/mm.h | 16 -----
mm/huge_memory.c | 145 +++++++++++++++++++++++-----------------
3 files changed, 89 insertions(+), 80 deletions(-)

--
2.53.0