perfmon3: X86 64-bit hooks
PATCH 8/24 perfmon3: X86 64-bit hooks
This patch adds the necessary hooks to the X86 64-bit code to support initialization, interrupts, context switching, and termination of a perfmon session.
Signed-off-by Stephane Eranian <[email protected]>
-
arch/x86/kernel/entry_64.S +7 -1
@@ -888,7 +888,13 @@ ENTRY(spurious_interrupt) apicinterrupt SPURIOUS_APIC_VECTOR,smp_spurious_interrupt END(spurious_interrupt) - + +#ifdef CONFIG_PERFMON +ENTRY(pmu_interrupt) + apicinterrupt LOCAL_PERFMON_VECTOR,smp_pmu_interrupt +END(pmu_interrupt) +#endif + /* * Exception entry points. */
arch/x86/kernel/process_64.c +10 -0
@@ -36,6 +36,7 @@#include <linux/kprobes.h> #include <linux/kdebug.h> #include <linux/tick.h> +#include <linux/perfmon_kern.h> #include <linux/prctl.h> #include <asm/uaccess.h>
@@ -240,6 +241,7 @@ t->io_bitmap_max =0 ;put_cpu (); } +pfm_exit_thread (); }void flush_thread (void )
@@ -344,6 +346,8 @@savesegment (es, p->thread.es);savesegment (ds, p->thread.ds); +pfm_copy_thread (p); +if (unlikely (test_tsk_thread_flag (me,TIF_IO_BITMAP ))) { p->thread.io_bitmap_ptr =kmalloc (IO_BITMAP_BYTES ,GFP_KERNEL );if (!p->thread.io_bitmap_ptr) {
@@ -472,6 +476,9 @@ prev = &prev_p->thread, next = &next_p->thread; +if (test_tsk_thread_flag (prev_p,TIF_PERFMON_CTXSW )) +pfm_ctxsw_out (prev_p, next_p); + debugctl = prev->debugctlmsr;if (next->ds_area_msr != prev->ds_area_msr) {/* we clear debugctl to make sure DS
@@ -484,6 +491,9 @@if (next->debugctlmsr != debugctl)update_debugctlmsr (next->debugctlmsr); +if (test_tsk_thread_flag (next_p,TIF_PERFMON_CTXSW )) +pfm_ctxsw_in (prev_p, next_p); +if (test_tsk_thread_flag (next_p,TIF_DEBUG )) {loaddebug (next,0 );loaddebug (next,1 );
arch/x86/kernel/signal_64.c +5 -0
@@ -19,6 +19,7 @@#include <linux/stddef.h> #include <linux/personality.h> #include <linux/compiler.h> +#include <linux/perfmon_kern.h> #include <asm/processor.h> #include <asm/ucontext.h> #include <asm/uaccess.h>
@@ -555,6 +556,10 @@mce_notify_user ();#endif /* CONFIG_X86_MCE */ +/* process perfmon asynchronous work (e.g. block thread or reset) */ +if (thread_info_flags & _TIF_PERFMON_WORK) +pfm_handle_work (regs); +/* deal with pending signal delivery */ if (thread_info_flags & _TIF_SIGPENDING)do_signal (regs);
arch/x86/kernel/irqinit_64.c +5 -0
@@ -11,6 +11,7 @@#include <linux/kernel_stat.h> #include <linux/sysdev.h> #include <linux/bitops.h> +#include <linux/perfmon_kern.h> #include <asm/acpi.h> #include <asm/atomic.h>
@@ -217,6 +218,10 @@alloc_intr_gate (SPURIOUS_APIC_VECTOR , spurious_interrupt);alloc_intr_gate (ERROR_APIC_VECTOR , error_interrupt); +#ifdef CONFIG_PERFMON +alloc_intr_gate (LOCAL_PERFMON_VECTOR , pmu_interrupt); +#endif +if (!acpi_ioapic)setup_irq (2 , &irq2); }