In order to convert ia64, arm and sh to generic tlb we need to provide some extra infrastructure to track the range of the flushed page tables. Signed-off-by: Peter Zijlstra --- arch/Kconfig | 3 +++ include/asm-generic/tlb.h | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) Index: linux-2.6/arch/Kconfig =================================================================== --- linux-2.6.orig/arch/Kconfig +++ linux-2.6/arch/Kconfig @@ -181,4 +181,7 @@ config HAVE_ARCH_MUTEX_CPU_RELAX config HAVE_RCU_TABLE_FREE bool +config HAVE_MMU_GATHER_RANGE + bool + source "kernel/gcov/Kconfig" Index: linux-2.6/include/asm-generic/tlb.h =================================================================== --- linux-2.6.orig/include/asm-generic/tlb.h +++ linux-2.6/include/asm-generic/tlb.h @@ -87,6 +87,10 @@ struct mmu_gather { fast_mode : 1; /* No batching */ unsigned int fullmm; /* Flush full mm */ +#ifdef CONFIG_HAVE_MMU_GATHER_RANGE + unsigned long start, end; +#endif + struct mmu_gather_batch *active; struct mmu_gather_batch local; struct page *__pages[MMU_GATHER_BUNDLE]; @@ -228,6 +232,35 @@ static inline void tlb_remove_page(struc tlb_flush_mmu(tlb); } +#ifdef CONFIG_HAVE_MMU_GATHER_RANGE +static inline void +__tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long address) +{ + if (!tlb->fullmm) { + tlb->start = min(tlb->start, address); + address += PAGE_SIZE; + tlb->end = max(tlb->end, address); + } +} + +static inline void +tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) +{ + if (!tlb->fullmm) { + flush_cache_range(vma, vma->vm_start, vma->vm_end); + tlb->start = TASK_SIZE; + tlb->end = 0; + } +} + +static inline void +tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) +{ + if (!tlb->fullmm && tlb->end) + flush_tlb_range(vma, tlb->start, tlb->end); +} +#endif + /** * tlb_remove_tlb_entry - remember a pte unmapping for later tlb invalidation. * @@ -261,6 +294,8 @@ static inline void tlb_remove_page(struc __pmd_free_tlb(tlb, pmdp, address); \ } while (0) +#ifndef tlb_migrate_finish #define tlb_migrate_finish(mm) do {} while (0) +#endif #endif /* _ASM_GENERIC__TLB_H */ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/