aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/include/asm/tlbflush.h
diff options
context:
space:
mode:
authorDave Hansen <dave@sr71.net>2013-09-11 17:20:24 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-11 18:57:09 -0400
commit6df46865ff8715932e7d42e52cac17e8461758cb (patch)
tree7c7e1d43b22a2bec2d4a6fce95ddc3cbd481aa1e /arch/x86/include/asm/tlbflush.h
parent9824cf9753ecbe8f5b47aa9b2f218207defea211 (diff)
mm: vmstats: track TLB flush stats on UP too
The previous patch doing vmstats for TLB flushes ("mm: vmstats: tlb flush counters") effectively missed UP since arch/x86/mm/tlb.c is only compiled for SMP. UP systems do not do remote TLB flushes, so compile those counters out on UP. arch/x86/kernel/cpu/mtrr/generic.c calls __flush_tlb() directly. This is probably an optimization since both the mtrr code and __flush_tlb() write cr4. It would probably be safe to make that a flush_tlb_all() (and then get these statistics), but the mtrr code is ancient and I'm hesitant to touch it other than to just stick in the counters. [akpm@linux-foundation.org: tweak comments] Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Ingo Molnar <mingo@elte.hu> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/x86/include/asm/tlbflush.h')
-rw-r--r--arch/x86/include/asm/tlbflush.h37
1 files changed, 31 insertions, 6 deletions
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h
index cf512003e663..e6d90babc245 100644
--- a/arch/x86/include/asm/tlbflush.h
+++ b/arch/x86/include/asm/tlbflush.h
@@ -62,6 +62,7 @@ static inline void __flush_tlb_all(void)
62 62
63static inline void __flush_tlb_one(unsigned long addr) 63static inline void __flush_tlb_one(unsigned long addr)
64{ 64{
65 count_vm_event(NR_TLB_LOCAL_FLUSH_ONE);
65 __flush_tlb_single(addr); 66 __flush_tlb_single(addr);
66} 67}
67 68
@@ -84,14 +85,38 @@ static inline void __flush_tlb_one(unsigned long addr)
84 85
85#ifndef CONFIG_SMP 86#ifndef CONFIG_SMP
86 87
87#define flush_tlb() __flush_tlb() 88/* "_up" is for UniProcessor.
88#define flush_tlb_all() __flush_tlb_all() 89 *
89#define local_flush_tlb() __flush_tlb() 90 * This is a helper for other header functions. *Not* intended to be called
91 * directly. All global TLB flushes need to either call this, or to bump the
92 * vm statistics themselves.
93 */
94static inline void __flush_tlb_up(void)
95{
96 count_vm_event(NR_TLB_LOCAL_FLUSH_ALL);
97 __flush_tlb();
98}
99
100static inline void flush_tlb_all(void)
101{
102 count_vm_event(NR_TLB_LOCAL_FLUSH_ALL);
103 __flush_tlb_all();
104}
105
106static inline void flush_tlb(void)
107{
108 __flush_tlb_up();
109}
110
111static inline void local_flush_tlb(void)
112{
113 __flush_tlb_up();
114}
90 115
91static inline void flush_tlb_mm(struct mm_struct *mm) 116static inline void flush_tlb_mm(struct mm_struct *mm)
92{ 117{
93 if (mm == current->active_mm) 118 if (mm == current->active_mm)
94 __flush_tlb(); 119 __flush_tlb_up();
95} 120}
96 121
97static inline void flush_tlb_page(struct vm_area_struct *vma, 122static inline void flush_tlb_page(struct vm_area_struct *vma,
@@ -105,14 +130,14 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,
105 unsigned long start, unsigned long end) 130 unsigned long start, unsigned long end)
106{ 131{
107 if (vma->vm_mm == current->active_mm) 132 if (vma->vm_mm == current->active_mm)
108 __flush_tlb(); 133 __flush_tlb_up();
109} 134}
110 135
111static inline void flush_tlb_mm_range(struct mm_struct *mm, 136static inline void flush_tlb_mm_range(struct mm_struct *mm,
112 unsigned long start, unsigned long end, unsigned long vmflag) 137 unsigned long start, unsigned long end, unsigned long vmflag)
113{ 138{
114 if (mm == current->active_mm) 139 if (mm == current->active_mm)
115 __flush_tlb(); 140 __flush_tlb_up();
116} 141}
117 142
118static inline void native_flush_tlb_others(const struct cpumask *cpumask, 143static inline void native_flush_tlb_others(const struct cpumask *cpumask,