x86, trace: Add irq vector tracepoints
[linux-2.6-block.git] / arch / x86 / kernel / smp.c
index d85837574a79d3d07ffb9ce9718bbf6ff995c696..f4fe0b8879e0e79eaecf1c4aeda245d6d0ab0b70 100644 (file)
@@ -30,6 +30,7 @@
 #include <asm/proto.h>
 #include <asm/apic.h>
 #include <asm/nmi.h>
+#include <asm/trace/irq_vectors.h>
 /*
  *     Some notes on x86 processor bugs affecting SMP operation:
  *
@@ -264,6 +265,17 @@ void smp_reschedule_interrupt(struct pt_regs *regs)
         */
 }
 
+void smp_trace_reschedule_interrupt(struct pt_regs *regs)
+{
+       ack_APIC_irq();
+       trace_reschedule_entry(RESCHEDULE_VECTOR);
+       __smp_reschedule_interrupt();
+       trace_reschedule_exit(RESCHEDULE_VECTOR);
+       /*
+        * KVM uses this interrupt to force a cpu out of guest mode
+        */
+}
+
 static inline void call_function_entering_irq(void)
 {
        ack_APIC_irq();
@@ -283,6 +295,15 @@ void smp_call_function_interrupt(struct pt_regs *regs)
        exiting_irq();
 }
 
+void smp_trace_call_function_interrupt(struct pt_regs *regs)
+{
+       call_function_entering_irq();
+       trace_call_function_entry(CALL_FUNCTION_VECTOR);
+       __smp_call_function_interrupt();
+       trace_call_function_exit(CALL_FUNCTION_VECTOR);
+       exiting_irq();
+}
+
 static inline void __smp_call_function_single_interrupt(void)
 {
        generic_smp_call_function_single_interrupt();
@@ -296,6 +317,15 @@ void smp_call_function_single_interrupt(struct pt_regs *regs)
        exiting_irq();
 }
 
+void smp_trace_call_function_single_interrupt(struct pt_regs *regs)
+{
+       call_function_entering_irq();
+       trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);
+       __smp_call_function_single_interrupt();
+       trace_call_function_single_exit(CALL_FUNCTION_SINGLE_VECTOR);
+       exiting_irq();
+}
+
 static int __init nonmi_ipi_setup(char *str)
 {
        smp_no_nmi_ipi = true;