tracing/function-graph-tracer: annotate do_IRQ and smp_apic_timer_interrupt
PATCH 2/3 tracing/function-graph-tracer: annotate do_IRQ and smp_apic_timer_interrupt
Impact: move most importants x86 irq entrypoints on a separate subsection
Annotate do_IRQ and smp_apic_timer_interrupt to put them into the .irqentry.text subsection. These function will so be recognized as hardirq entrypoints for the function-graph-tracer. We could also annotate other irq entries but the others are far less important but they can be added on request.
Signed-off-by Frederic Weisbecker <[email protected]>
--- arch/x86/kernel/apic.c | 3 ++- arch/x86/kernel/irq_64.c | 3 ++- include/linux/ftrace.h | 11 +++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-)
arch/x86/kernel/apic.c +2 -1
@@ -30,6 +30,7 @@#include <linux/module.h> #include <linux/dmi.h> #include <linux/dmar.h> +#include <linux/ftrace.h> #include <asm/intel_arch_perfmon.h> #include <asm/atomic.h>
@@ -795,7 +796,7 @@ static void local_apic_timer_interrupt(void)* [ if a single-CPU system runs an SMP kernel then we call the local * interrupt as well. Thus we cannot inline the local irq ... ] */ -void smp_apic_timer_interrupt (struct pt_regs *regs) +void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);
arch/x86/kernel/irq_64.c +2 -1
@@ -13,6 +13,7 @@#include <linux/seq_file.h> #include <linux/module.h> #include <linux/delay.h> +#include <linux/ftrace.h> #include <asm/uaccess.h> #include <asm/io_apic.h> #include <asm/idle.h>
@@ -45,7 +46,7 @@ static inline void stack_overflow_check(struct pt_regs *regs)* SMP cross-CPU interrupts have their own specific * handlers). */ -asmlinkage unsigned int do_IRQ(struct pt_regs *regs) +asmlinkage unsigned int __irq_entry do_IRQ(struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);struct irq_desc *desc;
include/linux/ftrace.h +11 -0
@@ -377,6 +377,16 @@ struct ftrace_graph_ret {*/ #define __notrace_funcgraph notrace +/* +* We want to which function is an entrypoint of a hardirq. +* That will help us to put a signal on output. +*/ +#define __irq_entry __attribute__((__section__(".irqentry.text"))) + +/* Limits of hardirq entrypoints */ +extern char __irqentry_text_start[]; +extern char __irqentry_text_end[]; +#define FTRACE_RETFUNC_DEPTH 50#define FTRACE_RETSTACK_ALLOC_SIZE 32/* Type of the callback handlers for tracing function graph*/
@@ -414,6 +424,7 @@ static inline void unpause_graph_tracing(void)#else #define __notrace_funcgraph +#define __irq_entrystatic inline void ftrace_graph_init_task (struct task_struct *t) { }static inline void ftrace_graph_exit_task (struct task_struct *t) { }
Signature · 1 line
1.6.0.4