Re: [PATCH 01/14] mm: decouple protnone helpers from CONFIG_NUMA_BALANCING

From: Mike Rapoport

Date: Mon May 04 2026 - 03:49:34 EST


On Mon, Apr 27, 2026 at 12:45:49PM +0100, Kiryl Shutsemau (Meta) wrote:
> pte_protnone() and pmd_protnone() detect present-but-inaccessible page
> table entries. This capability is useful beyond NUMA balancing — for
> example, userfaultfd working set tracking uses protnone PTEs to track
> page access without unmapping pages.
>
> Introduce CONFIG_ARCH_HAS_PTE_PROTNONE to decouple the protnone PTE
> infrastructure from CONFIG_NUMA_BALANCING. The six architectures that
> support protnone PTEs (x86_64, arm64, powerpc, s390, riscv, loongarch)
> now select this option, and CONFIG_NUMA_BALANCING depends on it.
>
> No functional change — the same set of architectures continues to have
> working protnone support, but the infrastructure is now available
> independently of NUMA balancing.
>
> Signed-off-by: Kiryl Shutsemau (Meta) <kas@xxxxxxxxxx>
> Assisted-by: Claude:claude-opus-4-6

With a small nit below

Acked-by: Mike Rapoport (Microsoft) <rppt@xxxxxxxxxx>

> ---
> arch/arm64/Kconfig | 1 +
> arch/arm64/include/asm/pgtable.h | 7 ++-----
> arch/loongarch/Kconfig | 1 +
> arch/loongarch/include/asm/pgtable.h | 4 ++--
> arch/powerpc/include/asm/book3s/64/pgtable.h | 8 +++----
> arch/powerpc/platforms/Kconfig.cputype | 1 +
> arch/riscv/Kconfig | 1 +
> arch/riscv/include/asm/pgtable.h | 7 ++-----
> arch/s390/Kconfig | 1 +
> arch/s390/include/asm/pgtable.h | 4 ++--
> arch/x86/Kconfig | 1 +
> arch/x86/include/asm/pgtable.h | 8 ++-----
> include/linux/pgtable.h | 22 +++++++++-----------
> init/Kconfig | 8 +++++++
> mm/debug_vm_pgtable.c | 4 ++--
> 15 files changed, 40 insertions(+), 38 deletions(-)
>
> @@ -2052,18 +2052,12 @@ static inline int pud_trans_unstable(pud_t *pud)
> return 0;
> }
>
> -#ifndef CONFIG_NUMA_BALANCING
> +#ifndef CONFIG_ARCH_HAS_PTE_PROTNONE
> /*
> - * In an inaccessible (PROT_NONE) VMA, pte_protnone() may indicate "yes". It is
> - * perfectly valid to indicate "no" in that case, which is why our default
> - * implementation defaults to "always no".
> - *
> - * In an accessible VMA, however, pte_protnone() reliably indicates PROT_NONE
> - * page protection due to NUMA hinting. NUMA hinting faults only apply in
> - * accessible VMAs.
> - *
> - * So, to reliably identify PROT_NONE PTEs that require a NUMA hinting fault,
> - * looking at the VMA accessibility is sufficient.

I think it's better to rephrase the original comment so that it'll actually
describe what pte_protnone() means rather than remove it altogether.

> + * Stubs for architectures that do not support present-but-inaccessible
> + * (PROT_NONE) page table entries. Generic code may still reference
> + * PAGE_NONE from paths that fold to dead code on these arches; the
> + * BUILD_BUG() fallback fires only if such a reference is actually live.
> */
> static inline int pte_protnone(pte_t pte)
> {
> @@ -2074,7 +2068,11 @@ static inline int pmd_protnone(pmd_t pmd)
> {
> return 0;
> }
> -#endif /* CONFIG_NUMA_BALANCING */
> +
> +#ifndef PAGE_NONE
> +#define PAGE_NONE ({ BUILD_BUG(); (pgprot_t){0}; })
> +#endif
> +#endif /* CONFIG_ARCH_HAS_PTE_PROTNONE */
>
> #endif /* CONFIG_MMU */

--
Sincerely yours,
Mike.