diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/include/asm/trace/common.h | 15 | ||||
-rw-r--r-- | arch/x86/include/asm/trace/exceptions.h | 6 | ||||
-rw-r--r-- | arch/x86/include/asm/trace/irq_vectors.h | 29 | ||||
-rw-r--r-- | arch/x86/kernel/smp.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/tracepoint.c | 27 | ||||
-rw-r--r-- | arch/x86/mm/fault.c | 2 |
6 files changed, 59 insertions, 22 deletions
diff --git a/arch/x86/include/asm/trace/common.h b/arch/x86/include/asm/trace/common.h index b1eb7b18ee8a..57c8da027d99 100644 --- a/arch/x86/include/asm/trace/common.h +++ b/arch/x86/include/asm/trace/common.h @@ -1,15 +1,16 @@ #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 diff --git a/arch/x86/include/asm/trace/exceptions.h b/arch/x86/include/asm/trace/exceptions.h index 960a5b50ac3b..5665bf205b8d 100644 --- a/arch/x86/include/asm/trace/exceptions.h +++ b/arch/x86/include/asm/trace/exceptions.h @@ -7,6 +7,9 @@ #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, @@ -35,8 +38,7 @@ DEFINE_EVENT_FN(x86_exceptions, name, \ 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); diff --git a/arch/x86/include/asm/trace/irq_vectors.h b/arch/x86/include/asm/trace/irq_vectors.h index 7825b4426e7e..a1bdc25b6507 100644 --- a/arch/x86/include/asm/trace/irq_vectors.h +++ b/arch/x86/include/asm/trace/irq_vectors.h @@ -7,6 +7,9 @@ #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), @@ -26,15 +29,22 @@ DECLARE_EVENT_CLASS(x86_irq_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 @@ -43,9 +53,16 @@ DEFINE_EVENT_FN(x86_irq_vector, name##_exit, \ 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 diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index cfe865b85bc5..5c574dff4c1a 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c @@ -262,7 +262,7 @@ __visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs) 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. diff --git a/arch/x86/kernel/tracepoint.c b/arch/x86/kernel/tracepoint.c index 4cae92f15495..c6636d1f60b9 100644 --- a/arch/x86/kernel/tracepoint.c +++ b/arch/x86/kernel/tracepoint.c @@ -10,15 +10,32 @@ #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 diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 58d7b3a4ec2e..f9bb6608f6f1 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -1510,7 +1510,7 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code) 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); |