[PATCH v7 4/7] powerpc: mm: Implement p{m,u,4}d_leaf on all platforms

Christophe Leroy christophe.leroy at csgroup.eu
Wed Feb 15 18:16:59 AEDT 2023



Le 15/02/2023 à 03:01, Rohan McLure a écrit :
> The check that a higher-level entry in multi-level pages contains a page
> translation entry (pte) is performed by p{m,u,4}d_leaf stubs, which may
> be specialised for each choice of mmu. In a prior commit, we replace
> uses to the catch-all stubs, p{m,u,4}d_is_leaf with p{m,u,4}d_leaf.
> 
> Replace the catch-all stub definitions for p{m,u,4}d_is_leaf with
> definitions for p{m,u,4}d_leaf. A future patch will assume that
> p{m,u,4}d_leaf is defined on all platforms.
> 
> In particular, implement pud_leaf for Book3E-64, pmd_leaf for all Book3E
> and Book3S-64 platforms, with a catch-all definition for p4d_leaf.
> 
> Signed-off-by: Rohan McLure <rmclure at linux.ibm.com>

Reviewed-by: Christophe Leroy <christophe.leroy at csgroup.eu>

> ---
> v5: Split patch that replaces p{m,u,4}d_is_leaf into two patches, first
> replacing callsites and afterward providing generic definition.
> Remove ifndef-defines implementing p{m,u}d_leaf in favour of
> implementing stubs in headers belonging to the particular platforms
> needing them.
> ---
>   arch/powerpc/include/asm/book3s/32/pgtable.h |  5 +++++
>   arch/powerpc/include/asm/book3s/64/pgtable.h | 10 ++++-----
>   arch/powerpc/include/asm/nohash/64/pgtable.h |  6 ++++++
>   arch/powerpc/include/asm/nohash/pgtable.h    |  6 ++++++
>   arch/powerpc/include/asm/pgtable.h           | 22 ++------------------
>   5 files changed, 23 insertions(+), 26 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/book3s/32/pgtable.h b/arch/powerpc/include/asm/book3s/32/pgtable.h
> index 75823f39e042..a090cb13a4a0 100644
> --- a/arch/powerpc/include/asm/book3s/32/pgtable.h
> +++ b/arch/powerpc/include/asm/book3s/32/pgtable.h
> @@ -242,6 +242,11 @@ static inline void pmd_clear(pmd_t *pmdp)
>   	*pmdp = __pmd(0);
>   }
>   
> +#define pmd_leaf pmd_leaf
> +static inline bool pmd_leaf(pmd_t pmd)
> +{
> +	return false;
> +}
>   
>   /*
>    * When flushing the tlb entry for a page, we also need to flush the hash
> diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h
> index 7e0d546f4b3c..589d2dbe3873 100644
> --- a/arch/powerpc/include/asm/book3s/64/pgtable.h
> +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h
> @@ -1359,16 +1359,14 @@ static inline bool is_pte_rw_upgrade(unsigned long old_val, unsigned long new_va
>   /*
>    * Like pmd_huge() and pmd_large(), but works regardless of config options
>    */
> -#define pmd_is_leaf pmd_is_leaf
> -#define pmd_leaf pmd_is_leaf
> -static inline bool pmd_is_leaf(pmd_t pmd)
> +#define pmd_leaf pmd_leaf
> +static inline bool pmd_leaf(pmd_t pmd)
>   {
>   	return !!(pmd_raw(pmd) & cpu_to_be64(_PAGE_PTE));
>   }
>   
> -#define pud_is_leaf pud_is_leaf
> -#define pud_leaf pud_is_leaf
> -static inline bool pud_is_leaf(pud_t pud)
> +#define pud_leaf pud_leaf
> +static inline bool pud_leaf(pud_t pud)
>   {
>   	return !!(pud_raw(pud) & cpu_to_be64(_PAGE_PTE));
>   }
> diff --git a/arch/powerpc/include/asm/nohash/64/pgtable.h b/arch/powerpc/include/asm/nohash/64/pgtable.h
> index 879e9a6e5a87..d391a45e0f11 100644
> --- a/arch/powerpc/include/asm/nohash/64/pgtable.h
> +++ b/arch/powerpc/include/asm/nohash/64/pgtable.h
> @@ -141,6 +141,12 @@ static inline void pud_clear(pud_t *pudp)
>   	*pudp = __pud(0);
>   }
>   
> +#define pud_leaf pud_leaf
> +static inline bool pud_leaf(pud_t pud)
> +{
> +	return false;
> +}
> +
>   #define pud_none(pud)		(!pud_val(pud))
>   #define	pud_bad(pud)		(!is_kernel_addr(pud_val(pud)) \
>   				 || (pud_val(pud) & PUD_BAD_BITS))
> diff --git a/arch/powerpc/include/asm/nohash/pgtable.h b/arch/powerpc/include/asm/nohash/pgtable.h
> index f36dd2e2d591..43b50fd8d236 100644
> --- a/arch/powerpc/include/asm/nohash/pgtable.h
> +++ b/arch/powerpc/include/asm/nohash/pgtable.h
> @@ -60,6 +60,12 @@ static inline bool pte_hw_valid(pte_t pte)
>   	return pte_val(pte) & _PAGE_PRESENT;
>   }
>   
> +#define pmd_leaf pmd_leaf
> +static inline bool pmd_leaf(pmd_t pmd)
> +{
> +	return false;
> +}
> +
>   /*
>    * Don't just check for any non zero bits in __PAGE_USER, since for book3e
>    * and PTE_64BIT, PAGE_KERNEL_X contains _PAGE_BAP_SR which is also in
> diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h
> index 17d30359d1f4..284408829fa3 100644
> --- a/arch/powerpc/include/asm/pgtable.h
> +++ b/arch/powerpc/include/asm/pgtable.h
> @@ -128,29 +128,11 @@ static inline void pte_frag_set(mm_context_t *ctx, void *p)
>   }
>   #endif
>   
> -#ifndef pmd_is_leaf
> -#define pmd_is_leaf pmd_is_leaf
> -static inline bool pmd_is_leaf(pmd_t pmd)
> +#define p4d_leaf p4d_leaf
> +static inline bool p4d_leaf(p4d_t p4d)
>   {
>   	return false;
>   }
> -#endif
> -
> -#ifndef pud_is_leaf
> -#define pud_is_leaf pud_is_leaf
> -static inline bool pud_is_leaf(pud_t pud)
> -{
> -	return false;
> -}
> -#endif
> -
> -#ifndef p4d_is_leaf
> -#define p4d_is_leaf p4d_is_leaf
> -static inline bool p4d_is_leaf(p4d_t p4d)
> -{
> -	return false;
> -}
> -#endif
>   
>   #define pmd_pgtable pmd_pgtable
>   static inline pgtable_t pmd_pgtable(pmd_t pmd)


More information about the Linuxppc-dev mailing list