From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail172.messagelabs.com (mail172.messagelabs.com [216.82.254.3]) by kanga.kvack.org (Postfix) with ESMTP id 4D3ED8D0054 for ; Thu, 17 Feb 2011 12:11:01 -0500 (EST) Message-Id: <20110217163235.727265214@chello.nl> Date: Thu, 17 Feb 2011 17:23:42 +0100 From: Peter Zijlstra Subject: [PATCH 15/17] arm, mm: Convert arm to generic tlb References: <20110217162327.434629380@chello.nl> Content-Disposition: inline; filename=mm-arm-tlb-range.patch Sender: owner-linux-mm@kvack.org List-ID: To: Andrea Arcangeli , Avi Kivity , Thomas Gleixner , Rik van Riel , Ingo Molnar , akpm@linux-foundation.org, Linus Torvalds Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, Benjamin Herrenschmidt , David Miller , Hugh Dickins , Mel Gorman , Nick Piggin , Peter Zijlstra , Paul McKenney , Yanmin Zhang , Russell King Cc: Russell King Signed-off-by: Peter Zijlstra --- arch/arm/Kconfig | 1 arch/arm/include/asm/tlb.h | 90 +--------------------------------------- arch/arm/include/asm/tlbflush.h | 5 -- 3 files changed, 6 insertions(+), 90 deletions(-) Index: linux-2.6/arch/arm/Kconfig =================================================================== --- linux-2.6.orig/arch/arm/Kconfig +++ linux-2.6/arch/arm/Kconfig @@ -28,6 +28,7 @@ config ARM select HAVE_C_RECORDMCOUNT select HAVE_GENERIC_HARDIRQS select HAVE_SPARSE_IRQ + select HAVE_MMU_GATHER_RANGE if MMU help The ARM series is a line of low-power-consumption RISC chip designs licensed by ARM Ltd and targeted at embedded applications and Index: linux-2.6/arch/arm/include/asm/tlb.h =================================================================== --- linux-2.6.orig/arch/arm/include/asm/tlb.h +++ linux-2.6/arch/arm/include/asm/tlb.h @@ -23,96 +23,14 @@ #ifndef CONFIG_MMU #include -#include #else /* !CONFIG_MMU */ -#include - -/* - * TLB handling. This allows us to remove pages from the page - * tables, and efficiently handle the TLB issues. - */ -struct mmu_gather { - struct mm_struct *mm; - unsigned int fullmm; - unsigned long range_start; - unsigned long range_end; -}; - -static inline void -tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int full_mm_flush) -{ - tlb->mm = mm; - tlb->fullmm = full_mm_flush; -} - -static inline void -tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) -{ - if (tlb->fullmm) - flush_tlb_mm(tlb->mm); - - /* keep the page table cache within bounds */ - check_pgt_cache(); -} - -/* - * Memorize the range for the TLB flush. - */ -static inline void -tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long addr) -{ - if (!tlb->fullmm) { - if (addr < tlb->range_start) - tlb->range_start = addr; - if (addr + PAGE_SIZE > tlb->range_end) - tlb->range_end = addr + PAGE_SIZE; - } -} - -/* - * In the case of tlb vma handling, we can optimise these away in the - * case where we're doing a full MM flush. When we're doing a munmap, - * the vmas are adjusted to only cover the region to be torn down. - */ -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->range_start = TASK_SIZE; - tlb->range_end = 0; - } -} - -static inline void -tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) -{ - if (!tlb->fullmm && tlb->range_end > 0) - flush_tlb_range(vma, tlb->range_start, tlb->range_end); -} - -static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page) -{ - free_page_and_swap_cache(page); - return 0; -} - -static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page) -{ - might_sleep(); - __tlb_remove_page(tlb, page); -} - -static inline void tlb_flush_mmu(struct mmu_gather *tlb) -{ -} +#define __pte_free_tlb(tlb, ptep, addr) pte_free((tlb)->mm, ptep) +#define __pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp) -#define pte_free_tlb(tlb, ptep, addr) pte_free((tlb)->mm, ptep) -#define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp) +#endif /* CONFIG_MMU */ -#define tlb_migrate_finish(mm) do { } while (0) +#include -#endif /* CONFIG_MMU */ #endif Index: linux-2.6/arch/arm/include/asm/tlbflush.h =================================================================== --- linux-2.6.orig/arch/arm/include/asm/tlbflush.h +++ linux-2.6/arch/arm/include/asm/tlbflush.h @@ -10,12 +10,9 @@ #ifndef _ASMARM_TLBFLUSH_H #define _ASMARM_TLBFLUSH_H - -#ifndef CONFIG_MMU - #define tlb_flush(tlb) ((void) tlb) -#else /* CONFIG_MMU */ +#ifdef CONFIG_MMU #include -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: email@kvack.org