tracing/function-graph-tracer: annotate do_IRQ and smp_apic_timer_interrupt
Impact: move most important x86 irq entry-points to 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 <fweisbec@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
a0343e8231
commit
bcbc4f20b5
|
@ -30,6 +30,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/dmi.h>
|
#include <linux/dmi.h>
|
||||||
#include <linux/dmar.h>
|
#include <linux/dmar.h>
|
||||||
|
#include <linux/ftrace.h>
|
||||||
|
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
|
@ -800,7 +801,7 @@ static void local_apic_timer_interrupt(void)
|
||||||
* [ if a single-CPU system runs an SMP kernel then we call the local
|
* [ if a single-CPU system runs an SMP kernel then we call the local
|
||||||
* interrupt as well. Thus we cannot inline the local irq ... ]
|
* 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);
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/ftrace.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/io_apic.h>
|
#include <asm/io_apic.h>
|
||||||
#include <asm/idle.h>
|
#include <asm/idle.h>
|
||||||
|
@ -47,7 +48,7 @@ static inline void stack_overflow_check(struct pt_regs *regs)
|
||||||
* SMP cross-CPU interrupts have their own specific
|
* SMP cross-CPU interrupts have their own specific
|
||||||
* handlers).
|
* 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 pt_regs *old_regs = set_irq_regs(regs);
|
||||||
struct irq_desc *desc;
|
struct irq_desc *desc;
|
||||||
|
|
|
@ -377,6 +377,16 @@ struct ftrace_graph_ret {
|
||||||
*/
|
*/
|
||||||
#define __notrace_funcgraph notrace
|
#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_RETFUNC_DEPTH 50
|
||||||
#define FTRACE_RETSTACK_ALLOC_SIZE 32
|
#define FTRACE_RETSTACK_ALLOC_SIZE 32
|
||||||
/* Type of the callback handlers for tracing function graph*/
|
/* Type of the callback handlers for tracing function graph*/
|
||||||
|
@ -414,6 +424,7 @@ static inline void unpause_graph_tracing(void)
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define __notrace_funcgraph
|
#define __notrace_funcgraph
|
||||||
|
#define __irq_entry
|
||||||
|
|
||||||
static inline void ftrace_graph_init_task(struct task_struct *t) { }
|
static inline void ftrace_graph_init_task(struct task_struct *t) { }
|
||||||
static inline void ftrace_graph_exit_task(struct task_struct *t) { }
|
static inline void ftrace_graph_exit_task(struct task_struct *t) { }
|
||||||
|
|
Loading…
Reference in New Issue