From 6714161c25358f59c23e0f0b198a8679f173dca0 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Thu, 20 Jul 2017 22:11:30 +0900 Subject: [PATCH] profile remote TLB invalidations --- kernel/include/profile.h | 3 ++- kernel/mem.c | 12 ++++++++++++ kernel/profile.c | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/kernel/include/profile.h b/kernel/include/profile.h index cdd33875..35a0fa92 100644 --- a/kernel/include/profile.h +++ b/kernel/include/profile.h @@ -32,7 +32,8 @@ struct profile_event { * for each added profiled event. */ enum profile_event_type { - PROFILE_page_fault = PROFILE_EVENT_MIN, + PROFILE_tlb_invalidate = PROFILE_EVENT_MIN, + PROFILE_page_fault, PROFILE_page_fault_anon_clr, PROFILE_page_fault_file, PROFILE_page_fault_dev_file, diff --git a/kernel/mem.c b/kernel/mem.c index 25259538..867f4225 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -970,6 +970,9 @@ void remote_flush_tlb_cpumask(struct process_vm *vm, void tlb_flush_handler(int vector) { +#ifdef PROFILE_ENABLE + unsigned long t_s = rdtsc(); +#endif // PROFILE_ENABLE int flags = cpu_disable_interrupt_save(); struct tlb_flush_entry *flush_entry = &tlb_flush_vector[vector - @@ -992,6 +995,15 @@ void tlb_flush_handler(int vector) } cpu_restore_interrupt(flags); +#ifdef PROFILE_ENABLE + { + unsigned long t_e = rdtsc(); + profile_event_add(PROFILE_tlb_invalidate, (t_e - t_s)); + if (cpu_local_var(current)->profile) + cpu_local_var(current)->profile_elapsed_ts += + (t_e - t_s); + } +#endif // PROFILE_ENABLE } static void page_fault_handler(void *fault_addr, uint64_t reason, void *regs) diff --git a/kernel/profile.c b/kernel/profile.c index 14cb9f01..da3c355c 100644 --- a/kernel/profile.c +++ b/kernel/profile.c @@ -57,6 +57,7 @@ extern char *syscall_name[]; char *profile_event_names[] = { + "remote_tlb_invalidate", "page_fault", "page_fault_anon_clr_mem", "page_fault_file",