[PATCH 3/3] powerpc/mm: Change the swap encoding in pte.
Haren Myneni
hmyneni at gmail.com
Fri May 29 18:09:53 AEST 2015
Tested this patch on 16TB system and fixed the BUG_ON issue mentioned
here - https://lists.ozlabs.org/pipermail/linuxppc-dev/2015-May/128767.html
I was able to reproduce this issue in all previous releases (tested
from 3.14). So this patch should be also in stable tree.
Acked-by: Haren Myneni <hbabu at us.ibm.com>
On 5/28/15, Aneesh Kumar K.V <aneesh.kumar at linux.vnet.ibm.com> wrote:
> Current swap encoding in pte can't support large pfns
> above 4TB. Change the swap encoding such that we put
> the swap type in the PTE bits. Also add build checks
> to make sure we don't overlap with HPTEFLAGS.
>
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar at linux.vnet.ibm.com>
> ---
> arch/powerpc/include/asm/pgtable-ppc64.h | 26 +++++++++++++++++++++-----
> arch/powerpc/include/asm/pte-book3e.h | 1 +
> arch/powerpc/include/asm/pte-hash64.h | 1 +
> 3 files changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h
> b/arch/powerpc/include/asm/pgtable-ppc64.h
> index 43e6ad424c7f..954ae1201e42 100644
> --- a/arch/powerpc/include/asm/pgtable-ppc64.h
> +++ b/arch/powerpc/include/asm/pgtable-ppc64.h
> @@ -347,11 +347,27 @@ static inline void __ptep_set_access_flags(pte_t
> *ptep, pte_t entry)
> pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
>
> /* Encode and de-code a swap entry */
> -#define __swp_type(entry) (((entry).val >> 1) & 0x3f)
> -#define __swp_offset(entry) ((entry).val >> 8)
> -#define __swp_entry(type, offset) ((swp_entry_t){((type)<<
> 1)|((offset)<<8)})
> -#define __pte_to_swp_entry(pte) ((swp_entry_t){pte_val(pte) >>
> PTE_RPN_SHIFT})
> -#define __swp_entry_to_pte(x) ((pte_t) { (x).val << PTE_RPN_SHIFT })
> +#define MAX_SWAPFILES_CHECK() do { \
> + BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS); \
> + /* \
> + * Don't have overlapping bits with _PAGE_HPTEFLAGS \
> + * We filter HPTEFLAGS on set_pte. \
> + */ \
> + BUILD_BUG_ON(_PAGE_HPTEFLAGS & (0x1f << _PAGE_BIT_SWAP_TYPE)); \
> + } while (0)
> +/*
> + * on pte we don't need handle RADIX_TREE_EXCEPTIONAL_SHIFT;
> + */
> +#define SWP_TYPE_BITS 5
> +#define __swp_type(x) (((x).val >> _PAGE_BIT_SWAP_TYPE) \
> + & ((1UL << SWP_TYPE_BITS) - 1))
> +#define __swp_offset(x) ((x).val >> PTE_RPN_SHIFT)
> +#define __swp_entry(type, offset) ((swp_entry_t) { \
> + ((type) << _PAGE_BIT_SWAP_TYPE) \
> + | ((offset) << PTE_RPN_SHIFT) })
> +
> +#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) })
> +#define __swp_entry_to_pte(x) __pte((x).val)
>
> void pgtable_cache_add(unsigned shift, void (*ctor)(void *));
> void pgtable_cache_init(void);
> diff --git a/arch/powerpc/include/asm/pte-book3e.h
> b/arch/powerpc/include/asm/pte-book3e.h
> index 91a704952ca1..8d8473278d91 100644
> --- a/arch/powerpc/include/asm/pte-book3e.h
> +++ b/arch/powerpc/include/asm/pte-book3e.h
> @@ -11,6 +11,7 @@
> /* Architected bits */
> #define _PAGE_PRESENT 0x000001 /* software: pte contains a translation */
> #define _PAGE_SW1 0x000002
> +#define _PAGE_BIT_SWAP_TYPE 2
> #define _PAGE_BAP_SR 0x000004
> #define _PAGE_BAP_UR 0x000008
> #define _PAGE_BAP_SW 0x000010
> diff --git a/arch/powerpc/include/asm/pte-hash64.h
> b/arch/powerpc/include/asm/pte-hash64.h
> index fc852f7e7b3a..ef612c160da7 100644
> --- a/arch/powerpc/include/asm/pte-hash64.h
> +++ b/arch/powerpc/include/asm/pte-hash64.h
> @@ -16,6 +16,7 @@
> */
> #define _PAGE_PRESENT 0x0001 /* software: pte contains a translation */
> #define _PAGE_USER 0x0002 /* matches one of the PP bits */
> +#define _PAGE_BIT_SWAP_TYPE 2
> #define _PAGE_EXEC 0x0004 /* No execute on POWER4 and newer (we invert)
> */
> #define _PAGE_GUARDED 0x0008
> /* We can derive Memory coherence from _PAGE_NO_CACHE */
> --
> 2.1.4
>
>
More information about the Linuxppc-dev
mailing list