Re: [PATCH v6 02/12] mm: add PMD swap entry detection support

From: David Hildenbrand (Arm)

Date: Tue Aug 18 2026 - 10:40:46 EST


On 8/18/26 15:09, Usama Arif wrote:
> Currently when a PMD-mapped THP is swapped out, the PMD is always
> split into HPAGE_PMD_NR PTE-level swap entries. To preserve huge
> page information across swap cycles, later patches will install a
> single PMD-level swap entry instead. Add the infrastructure to detect
> those entries.
>
> Teach the softleaf layer to recognise PMD swap entries:
> pmd_is_swap_entry() detects them and softleaf_is_valid_pmd_entry()
> accepts them as a valid non-present type. Because swap entries do not
> encode a PFN, make pmd_softleaf_to_folio() warn and return NULL for them
> instead of passing the swap offset to softleaf_to_folio(). Clear the
> exclusive overlay bit in softleaf_from_pmd() before decoding, matching
> how soft_dirty and uffd bits are already stripped.
>
> Add pmd_swp_mkexclusive(), pmd_swp_exclusive(), and
> pmd_swp_clear_exclusive() helpers to each architecture that supports
> PMD softleaf entries (x86, arm64, s390, riscv, loongarch, powerpc),
> mirroring the existing PTE swap exclusive helpers in each arch's
> pgtable.h.

Ah, for migration entries we still use a dedicated migratetype. I actually have
on my todo list to move to PTE bits as well.

(likely the _swp_ part should then be renamed to indicate that this is for
softdirty entries, not just swap entries)

> Provide generic no-op PMD swap exclusive fallbacks for
> architectures without PMD softleaf support, matching the generic PMD
> swap soft-dirty fallbacks.

No softleaf implies to migration and no swap, so this would work.

You should extend mm/debug_vm_pgtable.c in a separate commit to test what
pte_swap_exclusive_tests() tests for PMDs.

>
> Signed-off-by: Usama Arif <usama.arif@xxxxxxxxx>
> ---
> arch/arm64/include/asm/pgtable.h | 6 +++++
> arch/loongarch/include/asm/pgtable.h | 19 ++++++++++++++
> arch/powerpc/include/asm/book3s/64/pgtable.h | 17 +++++++++++++
> arch/riscv/include/asm/pgtable.h | 15 +++++++++++
> arch/s390/include/asm/pgtable.h | 17 +++++++++++++
> arch/x86/include/asm/pgtable.h | 17 +++++++++++++

I'm sorry for asking you to compete with Kiryll's series by creating one patch
for each architecture that directly jumps at arch maintainers :)

[...]

> #ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY
> static inline pte_t pte_swp_mksoft_dirty(pte_t pte)
> {
> diff --git a/include/linux/leafops.h b/include/linux/leafops.h
> index 7c13c58a5e218..4a6c52974b305 100644
> --- a/include/linux/leafops.h
> +++ b/include/linux/leafops.h
> @@ -102,6 +102,8 @@ static inline softleaf_t softleaf_from_pmd(pmd_t pmd)
> pmd = pmd_swp_clear_soft_dirty(pmd);
> if (pmd_swp_uffd(pmd))
> pmd = pmd_swp_clear_uffd(pmd);
> + if (pmd_swp_exclusive(pmd))
> + pmd = pmd_swp_clear_exclusive(pmd);

Can't we just unconditionally clear these flags?

pmd = pmd_swp_clear_uffd(pmd);
pmd = pmd_swp_clear_exclusive(pmd);

Avoids these rather unnecessary conditionals unless I am missing something.


> arch_entry = __pmd_to_swp_entry(pmd);
>
> /* Temporary until swp_entry_t eliminated. */
> @@ -634,18 +636,30 @@ static inline bool pmd_is_migration_entry(pmd_t pmd)
> */
> static inline bool softleaf_is_valid_pmd_entry(softleaf_t entry)
> {
> - /* Only device private, migration entries valid for PMD. */
> + /* Device private, migration, and swap entries valid for PMD. */

Can we just drop that comment? I mean, it's as clear as it gets in the code
immediately below :)

> return softleaf_is_device_private(entry) ||
> - softleaf_is_migration(entry);
> + softleaf_is_migration(entry) ||
> + softleaf_is_swap(entry);
> +}
> +

--
Cheers,

David