lkml.org 
[lkml]   [2019]   [Mar]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 11/27] powerpc/mm: split asm/hugetlb.h into dedicated subarch files
    Date
    Three subarches support hugepages:
    - fsl book3e
    - book3s/64
    - 8xx

    This patch splits asm/hugetlb.h to reduce the #ifdef mess.

    Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
    ---
    arch/powerpc/include/asm/book3s/64/hugetlb.h | 41 +++++++++++
    arch/powerpc/include/asm/hugetlb.h | 89 ++----------------------
    arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h | 32 +++++++++
    arch/powerpc/include/asm/nohash/hugetlb-book3e.h | 31 +++++++++
    4 files changed, 108 insertions(+), 85 deletions(-)
    create mode 100644 arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h
    create mode 100644 arch/powerpc/include/asm/nohash/hugetlb-book3e.h

    diff --git a/arch/powerpc/include/asm/book3s/64/hugetlb.h b/arch/powerpc/include/asm/book3s/64/hugetlb.h
    index ec2a55a553c7..2f9cf2bc601c 100644
    --- a/arch/powerpc/include/asm/book3s/64/hugetlb.h
    +++ b/arch/powerpc/include/asm/book3s/64/hugetlb.h
    @@ -62,4 +62,45 @@ extern pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma,
    extern void huge_ptep_modify_prot_commit(struct vm_area_struct *vma,
    unsigned long addr, pte_t *ptep,
    pte_t old_pte, pte_t new_pte);
    +/*
    + * This should work for other subarchs too. But right now we use the
    + * new format only for 64bit book3s
    + */
    +static inline pte_t *hugepd_page(hugepd_t hpd)
    +{
    + if (WARN_ON(!hugepd_ok(hpd)))
    + return NULL;
    + /*
    + * We have only four bits to encode, MMU page size
    + */
    + BUILD_BUG_ON((MMU_PAGE_COUNT - 1) > 0xf);
    + return __va(hpd_val(hpd) & HUGEPD_ADDR_MASK);
    +}
    +
    +static inline unsigned int hugepd_mmu_psize(hugepd_t hpd)
    +{
    + return (hpd_val(hpd) & HUGEPD_SHIFT_MASK) >> 2;
    +}
    +
    +static inline unsigned int hugepd_shift(hugepd_t hpd)
    +{
    + return mmu_psize_to_shift(hugepd_mmu_psize(hpd));
    +}
    +static inline void flush_hugetlb_page(struct vm_area_struct *vma,
    + unsigned long vmaddr)
    +{
    + if (radix_enabled())
    + return radix__flush_hugetlb_page(vma, vmaddr);
    +}
    +
    +static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
    + unsigned int pdshift)
    +{
    + unsigned long idx = (addr & ((1UL << pdshift) - 1)) >> hugepd_shift(hpd);
    +
    + return hugepd_page(hpd) + idx;
    +}
    +
    +void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
    +
    #endif
    diff --git a/arch/powerpc/include/asm/hugetlb.h b/arch/powerpc/include/asm/hugetlb.h
    index 48c29686c78e..fd5c0873a57d 100644
    --- a/arch/powerpc/include/asm/hugetlb.h
    +++ b/arch/powerpc/include/asm/hugetlb.h
    @@ -6,85 +6,13 @@
    #include <asm/page.h>

    #ifdef CONFIG_PPC_BOOK3S_64
    -
    #include <asm/book3s/64/hugetlb.h>
    -/*
    - * This should work for other subarchs too. But right now we use the
    - * new format only for 64bit book3s
    - */
    -static inline pte_t *hugepd_page(hugepd_t hpd)
    -{
    - if (WARN_ON(!hugepd_ok(hpd)))
    - return NULL;
    - /*
    - * We have only four bits to encode, MMU page size
    - */
    - BUILD_BUG_ON((MMU_PAGE_COUNT - 1) > 0xf);
    - return __va(hpd_val(hpd) & HUGEPD_ADDR_MASK);
    -}
    -
    -static inline unsigned int hugepd_mmu_psize(hugepd_t hpd)
    -{
    - return (hpd_val(hpd) & HUGEPD_SHIFT_MASK) >> 2;
    -}
    -
    -static inline unsigned int hugepd_shift(hugepd_t hpd)
    -{
    - return mmu_psize_to_shift(hugepd_mmu_psize(hpd));
    -}
    -static inline void flush_hugetlb_page(struct vm_area_struct *vma,
    - unsigned long vmaddr)
    -{
    - if (radix_enabled())
    - return radix__flush_hugetlb_page(vma, vmaddr);
    -}
    -
    -#else
    -
    -static inline pte_t *hugepd_page(hugepd_t hpd)
    -{
    - if (WARN_ON(!hugepd_ok(hpd)))
    - return NULL;
    -#ifdef CONFIG_PPC_8xx
    - return (pte_t *)__va(hpd_val(hpd) & ~HUGEPD_SHIFT_MASK);
    -#else
    - return (pte_t *)((hpd_val(hpd) &
    - ~HUGEPD_SHIFT_MASK) | PD_HUGE);
    -#endif
    -}
    -
    -static inline unsigned int hugepd_shift(hugepd_t hpd)
    -{
    -#ifdef CONFIG_PPC_8xx
    - return ((hpd_val(hpd) & _PMD_PAGE_MASK) >> 1) + 17;
    -#else
    - return hpd_val(hpd) & HUGEPD_SHIFT_MASK;
    -#endif
    -}
    -
    +#elif defined(CONFIG_PPC_FSL_BOOK3E)
    +#include <asm/nohash/hugetlb-book3e.h>
    +#elif defined(CONFIG_PPC_8xx)
    +#include <asm/nohash/32/hugetlb-8xx.h>
    #endif /* CONFIG_PPC_BOOK3S_64 */

    -
    -static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
    - unsigned pdshift)
    -{
    - /*
    - * On FSL BookE, we have multiple higher-level table entries that
    - * point to the same hugepte. Just use the first one since they're all
    - * identical. So for that case, idx=0.
    - */
    - unsigned long idx = 0;
    -
    - pte_t *dir = hugepd_page(hpd);
    -#ifdef CONFIG_PPC_8xx
    - idx = (addr & ((1UL << pdshift) - 1)) >> PAGE_SHIFT;
    -#elif !defined(CONFIG_PPC_FSL_BOOK3E)
    - idx = (addr & ((1UL << pdshift) - 1)) >> hugepd_shift(hpd);
    -#endif
    -
    - return dir + idx;
    -}
    -
    void flush_dcache_icache_hugepage(struct page *page);

    int slice_is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
    @@ -101,15 +29,6 @@ static inline int is_hugepage_only_range(struct mm_struct *mm,

    void book3e_hugetlb_preload(struct vm_area_struct *vma, unsigned long ea,
    pte_t pte);
    -#ifdef CONFIG_PPC_8xx
    -static inline void flush_hugetlb_page(struct vm_area_struct *vma,
    - unsigned long vmaddr)
    -{
    - flush_tlb_page(vma, vmaddr);
    -}
    -#else
    -void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
    -#endif

    #define __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE
    void hugetlb_free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
    diff --git a/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h
    new file mode 100644
    index 000000000000..209e6a219835
    --- /dev/null
    +++ b/arch/powerpc/include/asm/nohash/32/hugetlb-8xx.h
    @@ -0,0 +1,32 @@
    +/* SPDX-License-Identifier: GPL-2.0 */
    +#ifndef _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H
    +#define _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H
    +
    +static inline pte_t *hugepd_page(hugepd_t hpd)
    +{
    + if (WARN_ON(!hugepd_ok(hpd)))
    + return NULL;
    +
    + return (pte_t *)__va(hpd_val(hpd) & ~HUGEPD_SHIFT_MASK);
    +}
    +
    +static inline unsigned int hugepd_shift(hugepd_t hpd)
    +{
    + return ((hpd_val(hpd) & _PMD_PAGE_MASK) >> 1) + 17;
    +}
    +
    +static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
    + unsigned int pdshift)
    +{
    + unsigned long idx = (addr & ((1UL << pdshift) - 1)) >> PAGE_SHIFT;
    +
    + return hugepd_page(hpd) + idx;
    +}
    +
    +static inline void flush_hugetlb_page(struct vm_area_struct *vma,
    + unsigned long vmaddr)
    +{
    + flush_tlb_page(vma, vmaddr);
    +}
    +
    +#endif /* _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H */
    diff --git a/arch/powerpc/include/asm/nohash/hugetlb-book3e.h b/arch/powerpc/include/asm/nohash/hugetlb-book3e.h
    new file mode 100644
    index 000000000000..e94f1cd048ee
    --- /dev/null
    +++ b/arch/powerpc/include/asm/nohash/hugetlb-book3e.h
    @@ -0,0 +1,31 @@
    +/* SPDX-License-Identifier: GPL-2.0 */
    +#ifndef _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H
    +#define _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H
    +
    +static inline pte_t *hugepd_page(hugepd_t hpd)
    +{
    + if (WARN_ON(!hugepd_ok(hpd)))
    + return NULL;
    +
    + return (pte_t *)((hpd_val(hpd) & ~HUGEPD_SHIFT_MASK) | PD_HUGE);
    +}
    +
    +static inline unsigned int hugepd_shift(hugepd_t hpd)
    +{
    + return hpd_val(hpd) & HUGEPD_SHIFT_MASK;
    +}
    +
    +static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
    + unsigned int pdshift)
    +{
    + /*
    + * On FSL BookE, we have multiple higher-level table entries that
    + * point to the same hugepte. Just use the first one since they're all
    + * identical. So for that case, idx=0.
    + */
    + return hugepd_page(hpd);
    +}
    +
    +void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
    +
    +#endif /* _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H */
    --
    2.13.3
    \
     
     \ /
      Last update: 2019-03-20 11:09    [W:4.390 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site