#ifndef _ASM_TRACE_COMMON_H
 #define _ASM_TRACE_COMMON_H
 
-extern int trace_irq_vector_regfunc(void);
-extern void trace_irq_vector_unregfunc(void);
-
 #ifdef CONFIG_TRACING
-DECLARE_STATIC_KEY_FALSE(trace_irqvectors_key);
-#define trace_irqvectors_enabled()                     \
-       static_branch_unlikely(&trace_irqvectors_key)
+DECLARE_STATIC_KEY_FALSE(trace_pagefault_key);
+#define trace_pagefault_enabled()                      \
+       static_branch_unlikely(&trace_pagefault_key)
+DECLARE_STATIC_KEY_FALSE(trace_resched_ipi_key);
+#define trace_resched_ipi_enabled()                    \
+       static_branch_unlikely(&trace_resched_ipi_key)
 #else
-static inline bool trace_irqvectors_enabled(void) { return false; }
+static inline bool trace_pagefault_enabled(void) { return false; }
+static inline bool trace_resched_ipi_enabled(void) { return false; }
 #endif
 
 #endif
 
 #include <linux/tracepoint.h>
 #include <asm/trace/common.h>
 
+extern int trace_pagefault_reg(void);
+extern void trace_pagefault_unreg(void);
+
 DECLARE_EVENT_CLASS(x86_exceptions,
 
        TP_PROTO(unsigned long address, struct pt_regs *regs,
        TP_PROTO(unsigned long address, struct pt_regs *regs,   \
                 unsigned long error_code),                     \
        TP_ARGS(address, regs, error_code),                     \
-       trace_irq_vector_regfunc,                               \
-       trace_irq_vector_unregfunc);
+       trace_pagefault_reg, trace_pagefault_unreg);
 
 DEFINE_PAGE_FAULT_EVENT(page_fault_user);
 DEFINE_PAGE_FAULT_EVENT(page_fault_kernel);
 
 #include <linux/tracepoint.h>
 #include <asm/trace/common.h>
 
+extern int trace_resched_ipi_reg(void);
+extern void trace_resched_ipi_unreg(void);
+
 DECLARE_EVENT_CLASS(x86_irq_vector,
 
        TP_PROTO(int vector),
        TP_printk("vector=%d", __entry->vector) );
 
 #define DEFINE_IRQ_VECTOR_EVENT(name)          \
+DEFINE_EVENT_FN(x86_irq_vector, name##_entry,  \
+       TP_PROTO(int vector),                   \
+       TP_ARGS(vector), NULL, NULL);           \
+DEFINE_EVENT_FN(x86_irq_vector, name##_exit,   \
+       TP_PROTO(int vector),                   \
+       TP_ARGS(vector), NULL, NULL);
+
+#define DEFINE_RESCHED_IPI_EVENT(name)         \
 DEFINE_EVENT_FN(x86_irq_vector, name##_entry,  \
        TP_PROTO(int vector),                   \
        TP_ARGS(vector),                        \
-       trace_irq_vector_regfunc,               \
-       trace_irq_vector_unregfunc);            \
+       trace_resched_ipi_reg,                  \
+       trace_resched_ipi_unreg);               \
 DEFINE_EVENT_FN(x86_irq_vector, name##_exit,   \
        TP_PROTO(int vector),                   \
        TP_ARGS(vector),                        \
-       trace_irq_vector_regfunc,               \
-       trace_irq_vector_unregfunc);
-
+       trace_resched_ipi_reg,                  \
+       trace_resched_ipi_unreg);
 
 /*
  * local_timer - called when entering/exiting a local timer interrupt
  */
 DEFINE_IRQ_VECTOR_EVENT(local_timer);
 
+/*
+ * The ifdef is required because that tracepoint macro hell emits tracepoint
+ * code in files which include this header even if the tracepoint is not
+ * enabled. Brilliant stuff that.
+ */
+#ifdef CONFIG_SMP
 /*
  * reschedule - called when entering/exiting a reschedule vector handler
  */
-DEFINE_IRQ_VECTOR_EVENT(reschedule);
+DEFINE_RESCHED_IPI_EVENT(reschedule);
+#endif
 
 /*
  * spurious_apic - called when entering/exiting a spurious apic vector handler
 
        ack_APIC_irq();
        inc_irq_stat(irq_resched_count);
 
-       if (trace_irqvectors_enabled()) {
+       if (trace_resched_ipi_enabled()) {
                /*
                 * scheduler_ipi() might call irq_enter() as well, but
                 * nested calls are fine.
 
 #include <asm/hw_irq.h>
 #include <asm/desc.h>
 
-DEFINE_STATIC_KEY_FALSE(trace_irqvectors_key);
+DEFINE_STATIC_KEY_FALSE(trace_pagefault_key);
 
-int trace_irq_vector_regfunc(void)
+int trace_pagefault_reg(void)
 {
-       static_branch_inc(&trace_irqvectors_key);
+       static_branch_inc(&trace_pagefault_key);
        return 0;
 }
 
-void trace_irq_vector_unregfunc(void)
+void trace_pagefault_unreg(void)
 {
-       static_branch_dec(&trace_irqvectors_key);
+       static_branch_dec(&trace_pagefault_key);
 }
+
+#ifdef CONFIG_SMP
+
+DEFINE_STATIC_KEY_FALSE(trace_resched_ipi_key);
+
+int trace_resched_ipi_reg(void)
+{
+       static_branch_inc(&trace_resched_ipi_key);
+       return 0;
+}
+
+void trace_resched_ipi_unreg(void)
+{
+       static_branch_dec(&trace_resched_ipi_key);
+}
+
+#endif
 
        enum ctx_state prev_state;
 
        prev_state = exception_enter();
-       if (trace_irqvectors_enabled())
+       if (trace_pagefault_enabled())
                trace_page_fault_entries(address, regs, error_code);
 
        __do_page_fault(regs, error_code, address);