aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/mm/tlb.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/mm/tlb.c')
-rw-r--r--arch/x86/mm/tlb.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
index 8f4cc3dfac32..fe9b9f776361 100644
--- a/arch/x86/mm/tlb.c
+++ b/arch/x86/mm/tlb.c
@@ -104,10 +104,8 @@ static void flush_tlb_func(void *info)
104 104
105 inc_irq_stat(irq_tlb_count); 105 inc_irq_stat(irq_tlb_count);
106 106
107 if (f->flush_mm != this_cpu_read(cpu_tlbstate.active_mm)) 107 if (f->flush_mm && f->flush_mm != this_cpu_read(cpu_tlbstate.active_mm))
108 return; 108 return;
109 if (!f->flush_end)
110 f->flush_end = f->flush_start + PAGE_SIZE;
111 109
112 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH_RECEIVED); 110 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH_RECEIVED);
113 if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK) { 111 if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK) {
@@ -135,12 +133,20 @@ void native_flush_tlb_others(const struct cpumask *cpumask,
135 unsigned long end) 133 unsigned long end)
136{ 134{
137 struct flush_tlb_info info; 135 struct flush_tlb_info info;
136
137 if (end == 0)
138 end = start + PAGE_SIZE;
138 info.flush_mm = mm; 139 info.flush_mm = mm;
139 info.flush_start = start; 140 info.flush_start = start;
140 info.flush_end = end; 141 info.flush_end = end;
141 142
142 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH); 143 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH);
143 trace_tlb_flush(TLB_REMOTE_SEND_IPI, end - start); 144 if (end == TLB_FLUSH_ALL)
145 trace_tlb_flush(TLB_REMOTE_SEND_IPI, TLB_FLUSH_ALL);
146 else
147 trace_tlb_flush(TLB_REMOTE_SEND_IPI,
148 (end - start) >> PAGE_SHIFT);
149
144 if (is_uv_system()) { 150 if (is_uv_system()) {
145 unsigned int cpu; 151 unsigned int cpu;
146 152