 2672391169
			
		
	
	
	2672391169
	
	
	
		
			
			In case other architectures require RCU freed page-tables to implement gup_fast() and software filled hashes and similar things, provide the means to do so by moving the logic into generic code. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Requested-by: David Miller <davem@davemloft.net> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Russell King <rmk@arm.linux.org.uk> Cc: Paul Mundt <lethal@linux-sh.org> Cc: Jeff Dike <jdike@addtoit.com> Cc: Richard Weinberger <richard@nod.at> Cc: Tony Luck <tony.luck@intel.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Hugh Dickins <hughd@google.com> Cc: Mel Gorman <mel@csn.ul.ie> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Nick Piggin <npiggin@kernel.dk> Cc: Namhyung Kim <namhyung@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			1.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _ASM_POWERPC_PGALLOC_H
 | |
| #define _ASM_POWERPC_PGALLOC_H
 | |
| #ifdef __KERNEL__
 | |
| 
 | |
| #include <linux/mm.h>
 | |
| 
 | |
| #ifdef CONFIG_PPC_BOOK3E
 | |
| extern void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address);
 | |
| #else /* CONFIG_PPC_BOOK3E */
 | |
| static inline void tlb_flush_pgtable(struct mmu_gather *tlb,
 | |
| 				     unsigned long address)
 | |
| {
 | |
| }
 | |
| #endif /* !CONFIG_PPC_BOOK3E */
 | |
| 
 | |
| static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
 | |
| {
 | |
| 	free_page((unsigned long)pte);
 | |
| }
 | |
| 
 | |
| static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
 | |
| {
 | |
| 	pgtable_page_dtor(ptepage);
 | |
| 	__free_page(ptepage);
 | |
| }
 | |
| 
 | |
| #ifdef CONFIG_PPC64
 | |
| #include <asm/pgalloc-64.h>
 | |
| #else
 | |
| #include <asm/pgalloc-32.h>
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_SMP
 | |
| struct mmu_gather;
 | |
| extern void tlb_remove_table(struct mmu_gather *, void *);
 | |
| 
 | |
| static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift)
 | |
| {
 | |
| 	unsigned long pgf = (unsigned long)table;
 | |
| 	BUG_ON(shift > MAX_PGTABLE_INDEX_SIZE);
 | |
| 	pgf |= shift;
 | |
| 	tlb_remove_table(tlb, (void *)pgf);
 | |
| }
 | |
| 
 | |
| static inline void __tlb_remove_table(void *_table)
 | |
| {
 | |
| 	void *table = (void *)((unsigned long)_table & ~MAX_PGTABLE_INDEX_SIZE);
 | |
| 	unsigned shift = (unsigned long)_table & MAX_PGTABLE_INDEX_SIZE;
 | |
| 
 | |
| 	pgtable_free(table, shift);
 | |
| }
 | |
| #else /* CONFIG_SMP */
 | |
| static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, unsigned shift)
 | |
| {
 | |
| 	pgtable_free(table, shift);
 | |
| }
 | |
| #endif /* !CONFIG_SMP */
 | |
| 
 | |
| static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage,
 | |
| 				  unsigned long address)
 | |
| {
 | |
| 	tlb_flush_pgtable(tlb, address);
 | |
| 	pgtable_page_dtor(ptepage);
 | |
| 	pgtable_free_tlb(tlb, page_address(ptepage), 0);
 | |
| }
 | |
| 
 | |
| #endif /* __KERNEL__ */
 | |
| #endif /* _ASM_POWERPC_PGALLOC_H */
 |