forked from mirrors/linux
		
	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: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
		
							parent
							
								
									447def3b06
								
							
						
					
					
						commit
						737b434d3d
					
				
					 5 changed files with 17 additions and 30 deletions
				
			
		| 
						 | 
					@ -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 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#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,
 | 
				
			||||||
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)
 | 
				
			||||||
	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,
 | 
				
			||||||
				  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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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,
 | 
				
			||||||
	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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue