CC linux-mm. On Fri, Jul 31, 2020 at 6:10 PM Huacai Chen <chenhc@xxxxxxxxxx> wrote: > > NUMA balancing is available on nearly all architectures, but MIPS lacks > it for a long time. In theory, the current NUMA balancing framework only > need a "PROTNONE" page table bit and some APIs to manipulate it. So, it > is time for us to add MIPS's NUMA balancing support (Only for 64bit now > because NUMA balancing depends on huge page implicitly). > > Signed-off-by: Huacai Chen <chenhc@xxxxxxxxxx> > --- > arch/mips/Kconfig | 1 + > arch/mips/include/asm/pgtable-64.h | 2 +- > arch/mips/include/asm/pgtable-bits.h | 17 +++++++++++++++++ > arch/mips/include/asm/pgtable.h | 18 +++++++++++++++--- > 4 files changed, 34 insertions(+), 4 deletions(-) > > diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig > index 499a20d..62d2b95 100644 > --- a/arch/mips/Kconfig > +++ b/arch/mips/Kconfig > @@ -9,6 +9,7 @@ config MIPS > select ARCH_HAS_PTE_SPECIAL if !(32BIT && CPU_HAS_RIXI) > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > select ARCH_HAS_UBSAN_SANITIZE_ALL > + select ARCH_SUPPORTS_NUMA_BALANCING if 64BIT > select ARCH_SUPPORTS_UPROBES > select ARCH_USE_BUILTIN_BSWAP > select ARCH_USE_CMPXCHG_LOCKREF if 64BIT > diff --git a/arch/mips/include/asm/pgtable-64.h b/arch/mips/include/asm/pgtable-64.h > index 1e7d6ce..2aef74b 100644 > --- a/arch/mips/include/asm/pgtable-64.h > +++ b/arch/mips/include/asm/pgtable-64.h > @@ -266,7 +266,7 @@ static inline int pmd_present(pmd_t pmd) > { > #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT > if (unlikely(pmd_val(pmd) & _PAGE_HUGE)) > - return pmd_val(pmd) & _PAGE_PRESENT; > + return pmd_val(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE); > #endif > > return pmd_val(pmd) != (unsigned long) invalid_pte_table; > diff --git a/arch/mips/include/asm/pgtable-bits.h b/arch/mips/include/asm/pgtable-bits.h > index e26dc41..f697c32 100644 > --- a/arch/mips/include/asm/pgtable-bits.h > +++ b/arch/mips/include/asm/pgtable-bits.h > @@ -52,6 +52,9 @@ enum pgtable_bits { > _PAGE_WRITE_SHIFT, > _PAGE_ACCESSED_SHIFT, > _PAGE_MODIFIED_SHIFT, > +#if defined(CONFIG_ARCH_SUPPORTS_NUMA_BALANCING) > + _PAGE_PROTNONE_SHIFT, > +#endif > #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL) > _PAGE_SPECIAL_SHIFT, > #endif > @@ -84,6 +87,9 @@ enum pgtable_bits { > _PAGE_WRITE_SHIFT, > _PAGE_ACCESSED_SHIFT, > _PAGE_MODIFIED_SHIFT, > +#if defined(CONFIG_ARCH_SUPPORTS_NUMA_BALANCING) > + _PAGE_PROTNONE_SHIFT, > +#endif > #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL) > _PAGE_SPECIAL_SHIFT, > #endif > @@ -102,6 +108,9 @@ enum pgtable_bits { > _PAGE_WRITE_SHIFT, > _PAGE_ACCESSED_SHIFT, > _PAGE_MODIFIED_SHIFT, > +#if defined(CONFIG_ARCH_SUPPORTS_NUMA_BALANCING) > + _PAGE_PROTNONE_SHIFT, > +#endif > #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL) > _PAGE_SPECIAL_SHIFT, > #endif > @@ -131,6 +140,9 @@ enum pgtable_bits { > #if defined(CONFIG_MIPS_HUGE_TLB_SUPPORT) > _PAGE_HUGE_SHIFT, > #endif > +#if defined(CONFIG_ARCH_SUPPORTS_NUMA_BALANCING) > + _PAGE_PROTNONE_SHIFT, > +#endif > #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL) > _PAGE_SPECIAL_SHIFT, > #endif > @@ -158,6 +170,11 @@ enum pgtable_bits { > #if defined(CONFIG_MIPS_HUGE_TLB_SUPPORT) > # define _PAGE_HUGE (1 << _PAGE_HUGE_SHIFT) > #endif > +#if defined(CONFIG_ARCH_SUPPORTS_NUMA_BALANCING) > +# define _PAGE_PROTNONE (1 <<_PAGE_PROTNONE_SHIFT) > +#else > +# define _PAGE_PROTNONE 0 > +#endif > #if defined(CONFIG_ARCH_HAS_PTE_SPECIAL) > # define _PAGE_SPECIAL (1 << _PAGE_SPECIAL_SHIFT) > #else > diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h > index dd7a0f5..3434073 100644 > --- a/arch/mips/include/asm/pgtable.h > +++ b/arch/mips/include/asm/pgtable.h > @@ -25,7 +25,7 @@ > struct mm_struct; > struct vm_area_struct; > > -#define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_NO_READ | \ > +#define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_NO_READ | \ > _page_cachable_default) > #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | \ > _page_cachable_default) > @@ -188,7 +188,7 @@ static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *pt > #else > > #define pte_none(pte) (!(pte_val(pte) & ~_PAGE_GLOBAL)) > -#define pte_present(pte) (pte_val(pte) & _PAGE_PRESENT) > +#define pte_present(pte) (pte_val(pte) & (_PAGE_PRESENT | _PAGE_PROTNONE)) > #define pte_no_exec(pte) (pte_val(pte) & _PAGE_NO_EXEC) > > /* > @@ -707,7 +707,7 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) > > static inline pmd_t pmd_mkinvalid(pmd_t pmd) > { > - pmd_val(pmd) &= ~(_PAGE_PRESENT | _PAGE_VALID | _PAGE_DIRTY); > + pmd_val(pmd) &= ~(_PAGE_PRESENT | _PAGE_VALID | _PAGE_PROTNONE | _PAGE_DIRTY); > > return pmd; > } > @@ -729,6 +729,18 @@ static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm, > > #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ > > +#ifdef CONFIG_NUMA_BALANCING > +static inline long pte_protnone(pte_t pte) > +{ > + return (pte_val(pte) & _PAGE_PROTNONE); > +} > + > +static inline long pmd_protnone(pmd_t pmd) > +{ > + return (pmd_val(pmd) & _PAGE_PROTNONE); > +} > +#endif /* CONFIG_NUMA_BALANCING */ > + > #ifdef _PAGE_HUGE > #define pmd_leaf(pmd) ((pmd_val(pmd) & _PAGE_HUGE) != 0) > #define pud_leaf(pud) ((pud_val(pud) & _PAGE_HUGE) != 0) > -- > 2.7.0 >