diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2011-05-24 20:11:48 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-25 11:39:13 -0400 |
commit | d6bf29b44ddf3ca915f77b9383bee8b7a209f3fd (patch) | |
tree | 777e98ebcbf207ea8442e977bd93053bb23a8df8 /arch/powerpc/include/asm | |
parent | d16dfc550f5326a4000f3322582a7c05dec91d7a (diff) |
powerpc: mmu_gather rework
Fix up powerpc to the new mmu_gather stuff.
PPC has an extra batching queue to RCU free the actual pagetable
allocations, use the ARCH extentions for that for now.
For the ppc64_tlb_batch, which tracks the vaddrs to unhash from the
hardware hash-table, keep using per-cpu arrays but flush on context switch
and use a TLF bit to track the lazy_mmu state.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: David Miller <davem@davemloft.net>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Richard Weinberger <richard@nod.at>
Cc: Tony Luck <tony.luck@intel.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Nick Piggin <npiggin@kernel.dk>
Cc: Namhyung Kim <namhyung@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/powerpc/include/asm')
-rw-r--r-- | arch/powerpc/include/asm/pgalloc.h | 4 | ||||
-rw-r--r-- | arch/powerpc/include/asm/thread_info.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/tlb.h | 10 |
3 files changed, 14 insertions, 2 deletions
diff --git a/arch/powerpc/include/asm/pgalloc.h b/arch/powerpc/include/asm/pgalloc.h index abe8532bd14e..df1b4cbb2e70 100644 --- a/arch/powerpc/include/asm/pgalloc.h +++ b/arch/powerpc/include/asm/pgalloc.h | |||
@@ -32,13 +32,13 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) | |||
32 | 32 | ||
33 | #ifdef CONFIG_SMP | 33 | #ifdef CONFIG_SMP |
34 | extern void pgtable_free_tlb(struct mmu_gather *tlb, void *table, unsigned shift); | 34 | extern void pgtable_free_tlb(struct mmu_gather *tlb, void *table, unsigned shift); |
35 | extern void pte_free_finish(void); | 35 | extern void pte_free_finish(struct mmu_gather *tlb); |
36 | #else /* CONFIG_SMP */ | 36 | #else /* CONFIG_SMP */ |
37 | static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, unsigned shift) | 37 | static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, unsigned shift) |
38 | { | 38 | { |
39 | pgtable_free(table, shift); | 39 | pgtable_free(table, shift); |
40 | } | 40 | } |
41 | static inline void pte_free_finish(void) { } | 41 | static inline void pte_free_finish(struct mmu_gather *tlb) { } |
42 | #endif /* !CONFIG_SMP */ | 42 | #endif /* !CONFIG_SMP */ |
43 | 43 | ||
44 | static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage, | 44 | static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage, |
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index d8529ef13b23..37c353e8af7c 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h | |||
@@ -139,10 +139,12 @@ static inline struct thread_info *current_thread_info(void) | |||
139 | #define TLF_NAPPING 0 /* idle thread enabled NAP mode */ | 139 | #define TLF_NAPPING 0 /* idle thread enabled NAP mode */ |
140 | #define TLF_SLEEPING 1 /* suspend code enabled SLEEP mode */ | 140 | #define TLF_SLEEPING 1 /* suspend code enabled SLEEP mode */ |
141 | #define TLF_RESTORE_SIGMASK 2 /* Restore signal mask in do_signal */ | 141 | #define TLF_RESTORE_SIGMASK 2 /* Restore signal mask in do_signal */ |
142 | #define TLF_LAZY_MMU 3 /* tlb_batch is active */ | ||
142 | 143 | ||
143 | #define _TLF_NAPPING (1 << TLF_NAPPING) | 144 | #define _TLF_NAPPING (1 << TLF_NAPPING) |
144 | #define _TLF_SLEEPING (1 << TLF_SLEEPING) | 145 | #define _TLF_SLEEPING (1 << TLF_SLEEPING) |
145 | #define _TLF_RESTORE_SIGMASK (1 << TLF_RESTORE_SIGMASK) | 146 | #define _TLF_RESTORE_SIGMASK (1 << TLF_RESTORE_SIGMASK) |
147 | #define _TLF_LAZY_MMU (1 << TLF_LAZY_MMU) | ||
146 | 148 | ||
147 | #ifndef __ASSEMBLY__ | 149 | #ifndef __ASSEMBLY__ |
148 | #define HAVE_SET_RESTORE_SIGMASK 1 | 150 | #define HAVE_SET_RESTORE_SIGMASK 1 |
diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h index e2b428b0f7ba..8f0ed7adcd12 100644 --- a/arch/powerpc/include/asm/tlb.h +++ b/arch/powerpc/include/asm/tlb.h | |||
@@ -28,6 +28,16 @@ | |||
28 | #define tlb_start_vma(tlb, vma) do { } while (0) | 28 | #define tlb_start_vma(tlb, vma) do { } while (0) |
29 | #define tlb_end_vma(tlb, vma) do { } while (0) | 29 | #define tlb_end_vma(tlb, vma) do { } while (0) |
30 | 30 | ||
31 | #define HAVE_ARCH_MMU_GATHER 1 | ||
32 | |||
33 | struct pte_freelist_batch; | ||
34 | |||
35 | struct arch_mmu_gather { | ||
36 | struct pte_freelist_batch *batch; | ||
37 | }; | ||
38 | |||
39 | #define ARCH_MMU_GATHER_INIT (struct arch_mmu_gather){ .batch = NULL, } | ||
40 | |||
31 | extern void tlb_flush(struct mmu_gather *tlb); | 41 | extern void tlb_flush(struct mmu_gather *tlb); |
32 | 42 | ||
33 | /* Get the generic bits... */ | 43 | /* Get the generic bits... */ |