diff options
Diffstat (limited to 'arch/x86/mm/tlb.c')
-rw-r--r-- | arch/x86/mm/tlb.c | 14 |
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 | ||