Re: [RESEND v7 07/29] x86: mm: add PMD swap-exclusive helpers

From: Usama Arif

Date: Tue Sep 22 2026 - 10:07:39 EST




On 16/09/2026 15:31, Kiryl Shutsemau wrote:
> On Mon, Sep 14, 2026 at 05:27:57AM -0700, Usama Arif wrote:
>> A later patch keeps a PMD-mapped anonymous THP mapped by a PMD across the
>> swap round-trip, so PG_anon_exclusive now has to survive in a swap PMD and
>> not just in a swap PTE.
>>
>> x86-64 encodes a swap PMD exactly like a swap PTE, so the new helpers reuse
>> _PAGE_SWP_EXCLUSIVE, bit 3, which the swap-entry layout already reserves
>> for PG_anon_exclusive. 32-bit x86 aliases that bit to _PAGE_PSE and does
>> not select ARCH_HAS_PMD_SOFTLEAVES.
>>
>> Cc: Thomas Gleixner <tglx@xxxxxxxxxx>
>> Cc: Ingo Molnar <mingo@xxxxxxxxxx>
>> Cc: Borislav Petkov <bp@xxxxxxxxx>
>> Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
>> Cc: x86@xxxxxxxxxx
>> Signed-off-by: Usama Arif <usama.arif@xxxxxxxxx>
>> ---
>> arch/x86/include/asm/pgtable.h | 17 +++++++++++++++++
>> 1 file changed, 17 insertions(+)
>>
>> diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
>> index d551120a7c889..a2d1cd03cba23 100644
>> --- a/arch/x86/include/asm/pgtable.h
>> +++ b/arch/x86/include/asm/pgtable.h
>> @@ -1525,6 +1525,23 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)
>> return pte_clear_flags(pte, _PAGE_SWP_EXCLUSIVE);
>> }
>>
>> +#ifdef CONFIG_ARCH_HAS_PMD_SOFTLEAVES
>> +static inline pmd_t pmd_swp_mkexclusive(pmd_t pmd)
>> +{
>> + return pmd_set_flags(pmd, _PAGE_SWP_EXCLUSIVE);
>> +}
>> +
>> +static inline bool pmd_swp_exclusive(pmd_t pmd)
>> +{
>> + return pmd_flags(pmd) & _PAGE_SWP_EXCLUSIVE;
>> +}
>> +
>> +static inline pmd_t pmd_swp_clear_exclusive(pmd_t pmd)
>> +{
>> + return pmd_clear_flags(pmd, _PAGE_SWP_EXCLUSIVE);
>> +}
>> +#endif
>> +
>
> I was about to comment that it is broken on 32-bit as
> _PAGE_SWP_EXCLUSIVE there is _PAGE_PSE which would make exclusive swap
> entries pmd_present(). But CONFIG_ARCH_HAS_PMD_SOFTLEAVES is only
> selected for X86_64.
>
> Do we want some BUILD_BUG_ON() to catch if anyone would try to enable
> it for 32-bit machines?

I added static_assert(_PAGE_SWP_EXCLUSIVE != _PAGE_PSE);

Thanks for the review!

>
> Otherwise:
>
> Reviewed-by: Kiryl Shutsemau (Meta) <kas@xxxxxxxxxx>
>
>> #ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY
>> static inline pte_t pte_swp_mksoft_dirty(pte_t pte)
>> {
>> --
>> 2.53.0-Meta
>>
>