|
@@ -49,6 +49,7 @@ void leave_mm(int cpu)
|
|
|
if (cpumask_test_cpu(cpu, mm_cpumask(active_mm))) {
|
|
|
cpumask_clear_cpu(cpu, mm_cpumask(active_mm));
|
|
|
load_cr3(swapper_pg_dir);
|
|
|
+ trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH, TLB_FLUSH_ALL);
|
|
|
}
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(leave_mm);
|
|
@@ -107,15 +108,19 @@ static void flush_tlb_func(void *info)
|
|
|
|
|
|
count_vm_tlb_event(NR_TLB_REMOTE_FLUSH_RECEIVED);
|
|
|
if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK) {
|
|
|
- if (f->flush_end == TLB_FLUSH_ALL)
|
|
|
+ if (f->flush_end == TLB_FLUSH_ALL) {
|
|
|
local_flush_tlb();
|
|
|
- else {
|
|
|
+ trace_tlb_flush(TLB_REMOTE_SHOOTDOWN, TLB_FLUSH_ALL);
|
|
|
+ } else {
|
|
|
unsigned long addr;
|
|
|
+ unsigned long nr_pages =
|
|
|
+ f->flush_end - f->flush_start / PAGE_SIZE;
|
|
|
addr = f->flush_start;
|
|
|
while (addr < f->flush_end) {
|
|
|
__flush_tlb_single(addr);
|
|
|
addr += PAGE_SIZE;
|
|
|
}
|
|
|
+ trace_tlb_flush(TLB_REMOTE_SHOOTDOWN, nr_pages);
|
|
|
}
|
|
|
} else
|
|
|
leave_mm(smp_processor_id());
|
|
@@ -153,6 +158,7 @@ void flush_tlb_current_task(void)
|
|
|
|
|
|
count_vm_tlb_event(NR_TLB_LOCAL_FLUSH_ALL);
|
|
|
local_flush_tlb();
|
|
|
+ trace_tlb_flush(TLB_LOCAL_SHOOTDOWN, TLB_FLUSH_ALL);
|
|
|
if (cpumask_any_but(mm_cpumask(mm), smp_processor_id()) < nr_cpu_ids)
|
|
|
flush_tlb_others(mm_cpumask(mm), mm, 0UL, TLB_FLUSH_ALL);
|
|
|
preempt_enable();
|
|
@@ -191,6 +197,7 @@ void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
|
|
|
__flush_tlb_single(addr);
|
|
|
}
|
|
|
}
|
|
|
+ trace_tlb_flush(TLB_LOCAL_MM_SHOOTDOWN, base_pages_to_flush);
|
|
|
out:
|
|
|
if (base_pages_to_flush == TLB_FLUSH_ALL) {
|
|
|
start = 0UL;
|