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) <[email protected]>
> Assisted-by: Claude:claude-opus-4-6

With a small nit below

Acked-by: Mike Rapoport (Microsoft) <[email protected]>

> ---
>  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.

Reply via email to