Commit 737b434d authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/mm: convert Book3E 64 to pte_fragment

Book3E 64 is the only subarch not using pte_fragment. In order
to allow refactorisation, this patch converts it to pte_fragment.
Reviewed-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 447def3b
...@@ -228,13 +228,7 @@ static inline void enter_lazy_tlb(struct mm_struct *mm, ...@@ -228,13 +228,7 @@ static inline void enter_lazy_tlb(struct mm_struct *mm,
#endif #endif
} }
#ifdef CONFIG_PPC_BOOK3E_64
static inline void arch_exit_mmap(struct mm_struct *mm)
{
}
#else
extern void arch_exit_mmap(struct mm_struct *mm); extern void arch_exit_mmap(struct mm_struct *mm);
#endif
static inline void arch_unmap(struct mm_struct *mm, static inline void arch_unmap(struct mm_struct *mm,
struct vm_area_struct *vma, struct vm_area_struct *vma,
......
...@@ -4,11 +4,13 @@ ...@@ -4,11 +4,13 @@
#define MAX_PHYSMEM_BITS 44 #define MAX_PHYSMEM_BITS 44
#include <asm/page.h>
/* Freescale Book-E software loaded TLB or Book-3e (ISA 2.06+) MMU */ /* Freescale Book-E software loaded TLB or Book-3e (ISA 2.06+) MMU */
#include <asm/nohash/mmu-book3e.h> #include <asm/nohash/mmu-book3e.h>
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
typedef struct page *pgtable_t; typedef pte_t *pgtable_t;
#endif #endif
#endif /* _ASM_POWERPC_NOHASH_64_MMU_H_ */ #endif /* _ASM_POWERPC_NOHASH_64_MMU_H_ */
...@@ -76,10 +76,10 @@ static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, ...@@ -76,10 +76,10 @@ static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
pgtable_t pte_page) pgtable_t pte_page)
{ {
pmd_set(pmd, (unsigned long)page_address(pte_page)); pmd_set(pmd, (unsigned long)pte_page);
} }
#define pmd_pgtable(pmd) pmd_page(pmd) #define pmd_pgtable(pmd) ((pgtable_t)pmd_page_vaddr(pmd))
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
{ {
...@@ -92,44 +92,35 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) ...@@ -92,44 +92,35 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
kmem_cache_free(PGT_CACHE(PMD_CACHE_INDEX), pmd); kmem_cache_free(PGT_CACHE(PMD_CACHE_INDEX), pmd);
} }
pte_t *pte_fragment_alloc(struct mm_struct *mm, int kernel);
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
{ {
return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO); return (pte_t *)pte_fragment_alloc(mm, 1);
} }
static inline pgtable_t pte_alloc_one(struct mm_struct *mm) static inline pgtable_t pte_alloc_one(struct mm_struct *mm)
{ {
struct page *page; return (pgtable_t)pte_fragment_alloc(mm, 0);
pte_t *pte;
pte = (pte_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO | __GFP_ACCOUNT);
if (!pte)
return NULL;
page = virt_to_page(pte);
if (!pgtable_page_ctor(page)) {
__free_page(page);
return NULL;
}
return page;
} }
void pte_frag_destroy(void *pte_frag);
void pte_fragment_free(unsigned long *table, int kernel);
static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
{ {
free_page((unsigned long)pte); pte_fragment_free((unsigned long *)pte, 1);
} }
static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
{ {
pgtable_page_dtor(ptepage); pte_fragment_free((unsigned long *)ptepage, 0);
__free_page(ptepage);
} }
static inline void pgtable_free(void *table, int shift) static inline void pgtable_free(void *table, int shift)
{ {
if (!shift) { if (!shift) {
pgtable_page_dtor(virt_to_page(table)); pte_fragment_free((unsigned long *)table, 0);
free_page((unsigned long)table);
} else { } else {
BUG_ON(shift > MAX_PGTABLE_INDEX_SIZE); BUG_ON(shift > MAX_PGTABLE_INDEX_SIZE);
kmem_cache_free(PGT_CACHE(shift), table); kmem_cache_free(PGT_CACHE(shift), table);
...@@ -166,7 +157,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, ...@@ -166,7 +157,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table,
unsigned long address) unsigned long address)
{ {
tlb_flush_pgtable(tlb, address); tlb_flush_pgtable(tlb, address);
pgtable_free_tlb(tlb, page_address(table), 0); pgtable_free_tlb(tlb, table, 0);
} }
#define __pmd_free_tlb(tlb, pmd, addr) \ #define __pmd_free_tlb(tlb, pmd, addr) \
......
...@@ -7,12 +7,12 @@ ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) ...@@ -7,12 +7,12 @@ ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC)
obj-y := fault.o mem.o pgtable.o mmap.o \ obj-y := fault.o mem.o pgtable.o mmap.o \
init_$(BITS).o pgtable_$(BITS).o \ init_$(BITS).o pgtable_$(BITS).o \
pgtable-frag.o \
init-common.o mmu_context.o drmem.o init-common.o mmu_context.o drmem.o
obj-$(CONFIG_PPC_MMU_NOHASH) += nohash/ obj-$(CONFIG_PPC_MMU_NOHASH) += nohash/
obj-$(CONFIG_PPC_BOOK3S_32) += book3s32/ obj-$(CONFIG_PPC_BOOK3S_32) += book3s32/
obj-$(CONFIG_PPC_BOOK3S_64) += book3s64/ obj-$(CONFIG_PPC_BOOK3S_64) += book3s64/
obj-$(CONFIG_PPC_BOOK3S_64) += pgtable-frag.o obj-$(CONFIG_PPC_BOOK3S_64) += pgtable-frag.o
obj-$(CONFIG_PPC32) += pgtable-frag.o
obj-$(CONFIG_NEED_MULTIPLE_NODES) += numa.o obj-$(CONFIG_NEED_MULTIPLE_NODES) += numa.o
obj-$(CONFIG_PPC_MM_SLICES) += slice.o obj-$(CONFIG_PPC_MM_SLICES) += slice.o
obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
......
...@@ -98,7 +98,7 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next, ...@@ -98,7 +98,7 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
switch_mmu_context(prev, next, tsk); switch_mmu_context(prev, next, tsk);
} }
#ifdef CONFIG_PPC32 #ifndef CONFIG_PPC_BOOK3S_64
void arch_exit_mmap(struct mm_struct *mm) void arch_exit_mmap(struct mm_struct *mm)
{ {
void *frag = pte_frag_get(&mm->context); void *frag = pte_frag_get(&mm->context);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment