@@ -139,14 +139,27 @@ static inline void __tlb_reset_range(struct mmu_gather *tlb)
}
}
+/*
+ * arch_tlb_mustflush specifies if tlb_flush is to be called even if the
+ * TLB range is empty (this can be the case for freeing page table pages
+ * if the arch does not adjust TLB range to cover them).
+ */
+#ifndef arch_tlb_mustflush
+#define arch_tlb_mustflush(tlb) false
+#endif
+
static inline void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb)
{
- if (!tlb->end)
+ unsigned long start = tlb->start;
+ unsigned long end = tlb->end;
+
+ if (!(end || arch_tlb_mustflush(tlb)))
return;
tlb_flush(tlb);
- mmu_notifier_invalidate_range(tlb->mm, tlb->start, tlb->end);
__tlb_reset_range(tlb);
+ if (end)
+ mmu_notifier_invalidate_range(tlb->mm, start, end);
}
static inline void tlb_remove_page_size(struct mmu_gather *tlb,
powerpc wants to de-couple page table caching structure flushes from TLB flushes, which will make it possible to have mmu_gather with freed page table pages but no TLB range. These must be sent to tlb_flush, so allow the arch to specify when mmu_gather with empty ranges should have tlb_flush called. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- include/asm-generic/tlb.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)