diff options
Diffstat (limited to 'arch/powerpc/include/asm/pgalloc-32.h')
| -rw-r--r-- | arch/powerpc/include/asm/pgalloc-32.h | 45 | 
1 files changed, 45 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/pgalloc-32.h b/arch/powerpc/include/asm/pgalloc-32.h index 580cf73b96e..27b2386f738 100644 --- a/arch/powerpc/include/asm/pgalloc-32.h +++ b/arch/powerpc/include/asm/pgalloc-32.h @@ -37,6 +37,17 @@ extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);  extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);  extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); +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); +} +  static inline void pgtable_free(void *table, unsigned index_size)  {  	BUG_ON(index_size); /* 32-bit doesn't use this */ @@ -45,4 +56,38 @@ static inline void pgtable_free(void *table, unsigned index_size)  #define check_pgt_cache()	do { } while (0) +#ifdef CONFIG_SMP +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 +static inline void pgtable_free_tlb(struct mmu_gather *tlb, +				    void *table, int shift) +{ +	pgtable_free(table, shift); +} +#endif + +static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, +				  unsigned long address) +{ +	struct page *page = page_address(table); + +	tlb_flush_pgtable(tlb, address); +	pgtable_page_dtor(page); +	pgtable_free_tlb(tlb, page, 0); +}  #endif /* _ASM_POWERPC_PGALLOC_32_H */  |