Message ID | 20090723055957.9D90EDDD1B@ozlabs.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Hi Ben, On Thu, 23 Jul 2009 15:59:46 +1000 Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote: > > +#ifdef CONFIG_PPC_BOOK3E > +extern void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address); > +#else > +#define tlb_flush_pgtable(tlb, address) do { } while(0) static inline void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address) {} > #else > -#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, (pte)) > +#define __pte_free_tlb(tlb,pte,address) \ > +do { \ > + tlb_flush_pgtable(tlb, address); \ > + pte_free((tlb)->mm, (pte)); \ > +} while (0) This could (should?) be a static inline as well.
--- linux-work.orig/arch/powerpc/include/asm/pgalloc.h 2009-07-22 16:47:46.000000000 +1000 +++ linux-work/arch/powerpc/include/asm/pgalloc.h 2009-07-22 16:47:49.000000000 +1000 @@ -4,6 +4,12 @@ #include <linux/mm.h> +#ifdef CONFIG_PPC_BOOK3E +extern void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address); +#else +#define tlb_flush_pgtable(tlb, address) do { } while(0) +#endif + static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) { free_page((unsigned long)pte); @@ -41,11 +47,16 @@ extern void pgtable_free_tlb(struct mmu_ #define __pte_free_tlb(tlb,ptepage,address) \ do { \ pgtable_page_dtor(ptepage); \ + tlb_flush_pgtable(tlb, address); \ pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \ PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1)); \ } while (0) #else -#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, (pte)) +#define __pte_free_tlb(tlb,pte,address) \ +do { \ + tlb_flush_pgtable(tlb, address); \ + pte_free((tlb)->mm, (pte)); \ +} while (0) #endif
64-bit BookE will use that hook to maintain the virtually linear page tables or the indirect entries in the TLB when using the HW loader. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> --- arch/powerpc/include/asm/pgalloc.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)