x86/irq, trace: Add __irq_entry annotation to x86's platform IRQ handlers
This patch adds the __irq_entry annotation to the default x86 platform IRQ handlers. ftrace's function_graph tracer uses the __irq_entry annotation to notify the entry and return of IRQ handlers. For example, before the patch: 354549.667252 | 3) d..1 | default_idle_call() { 354549.667252 | 3) d..1 | arch_cpu_idle() { 354549.667253 | 3) d..1 | default_idle() { 354549.696886 | 3) d..1 | smp_trace_reschedule_interrupt() { 354549.696886 | 3) d..1 | irq_enter() { 354549.696886 | 3) d..1 | rcu_irq_enter() { After the patch: 366416.254476 | 3) d..1 | arch_cpu_idle() { 366416.254476 | 3) d..1 | default_idle() { 366416.261566 | 3) d..1 ==========> | 366416.261566 | 3) d..1 | smp_trace_reschedule_interrupt() { 366416.261566 | 3) d..1 | irq_enter() { 366416.261566 | 3) d..1 | rcu_irq_enter() { KASAN also uses this annotation. The smp_apic_timer_interrupt() was already annotated. Signed-off-by: Daniel Bristot de Oliveira <bristot@redhat.com> Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Cc: Aaron Lu <aaron.lu@intel.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Baoquan He <bhe@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Claudio Fontana <claudio.fontana@huawei.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: Dou Liyang <douly.fnst@cn.fujitsu.com> Cc: Gu Zheng <guz.fnst@cn.fujitsu.com> Cc: Hidehiro Kawai <hidehiro.kawai.ez@hitachi.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Nicolai Stange <nicstange@gmail.com> Cc: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Tony Luck <tony.luck@intel.com> Cc: Wanpeng Li <wanpeng.li@hotmail.com> Cc: linux-edac@vger.kernel.org Link: http://lkml.kernel.org/r/059fdf437c2f0c09b13c18c8fe4e69999d3ffe69.1483528431.git.bristot@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
e02003b515
commit
c4158ff536
|
@ -1864,14 +1864,14 @@ static void __smp_spurious_interrupt(u8 vector)
|
|||
"should never happen.\n", vector, smp_processor_id());
|
||||
}
|
||||
|
||||
__visible void smp_spurious_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_spurious_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_spurious_interrupt(~regs->orig_ax);
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_spurious_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_spurious_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
u8 vector = ~regs->orig_ax;
|
||||
|
||||
|
@ -1922,14 +1922,14 @@ static void __smp_error_interrupt(struct pt_regs *regs)
|
|||
|
||||
}
|
||||
|
||||
__visible void smp_error_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_error_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_error_interrupt(regs);
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_error_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_error_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
trace_error_apic_entry(ERROR_APIC_VECTOR);
|
||||
|
|
|
@ -559,7 +559,7 @@ void send_cleanup_vector(struct irq_cfg *cfg)
|
|||
__send_cleanup_vector(data);
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_irq_move_cleanup_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_irq_move_cleanup_interrupt(void)
|
||||
{
|
||||
unsigned vector, me;
|
||||
|
||||
|
|
|
@ -814,14 +814,14 @@ static inline void __smp_deferred_error_interrupt(void)
|
|||
deferred_error_int_vector();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_deferred_error_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_deferred_error_interrupt(void)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_deferred_error_interrupt();
|
||||
exiting_ack_irq();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_trace_deferred_error_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_trace_deferred_error_interrupt(void)
|
||||
{
|
||||
entering_irq();
|
||||
trace_deferred_error_apic_entry(DEFERRED_ERROR_VECTOR);
|
||||
|
|
|
@ -404,14 +404,16 @@ static inline void __smp_thermal_interrupt(void)
|
|||
smp_thermal_vector();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_thermal_interrupt(struct pt_regs *regs)
|
||||
asmlinkage __visible void __irq_entry
|
||||
smp_thermal_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_thermal_interrupt();
|
||||
exiting_ack_irq();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_trace_thermal_interrupt(struct pt_regs *regs)
|
||||
asmlinkage __visible void __irq_entry
|
||||
smp_trace_thermal_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
trace_thermal_apic_entry(THERMAL_APIC_VECTOR);
|
||||
|
|
|
@ -23,14 +23,14 @@ static inline void __smp_threshold_interrupt(void)
|
|||
mce_threshold_vector();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_threshold_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_threshold_interrupt(void)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_threshold_interrupt();
|
||||
exiting_ack_irq();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_trace_threshold_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_trace_threshold_interrupt(void)
|
||||
{
|
||||
entering_irq();
|
||||
trace_threshold_apic_entry(THRESHOLD_APIC_VECTOR);
|
||||
|
|
|
@ -264,7 +264,7 @@ void __smp_x86_platform_ipi(void)
|
|||
x86_platform_ipi_callback();
|
||||
}
|
||||
|
||||
__visible void smp_x86_platform_ipi(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_x86_platform_ipi(struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
|
||||
|
@ -315,7 +315,7 @@ __visible void smp_kvm_posted_intr_wakeup_ipi(struct pt_regs *regs)
|
|||
}
|
||||
#endif
|
||||
|
||||
__visible void smp_trace_x86_platform_ipi(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_x86_platform_ipi(struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <linux/hardirq.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/trace/irq_vectors.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
static inline void __smp_irq_work_interrupt(void)
|
||||
{
|
||||
|
@ -16,14 +17,14 @@ static inline void __smp_irq_work_interrupt(void)
|
|||
irq_work_run();
|
||||
}
|
||||
|
||||
__visible void smp_irq_work_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_irq_work_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
__smp_irq_work_interrupt();
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_irq_work_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_irq_work_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
trace_irq_work_entry(IRQ_WORK_VECTOR);
|
||||
|
|
|
@ -259,7 +259,7 @@ static inline void __smp_reschedule_interrupt(void)
|
|||
scheduler_ipi();
|
||||
}
|
||||
|
||||
__visible void smp_reschedule_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ack_APIC_irq();
|
||||
__smp_reschedule_interrupt();
|
||||
|
@ -268,7 +268,7 @@ __visible void smp_reschedule_interrupt(struct pt_regs *regs)
|
|||
*/
|
||||
}
|
||||
|
||||
__visible void smp_trace_reschedule_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_reschedule_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
/*
|
||||
* Need to call irq_enter() before calling the trace point.
|
||||
|
@ -292,14 +292,15 @@ static inline void __smp_call_function_interrupt(void)
|
|||
inc_irq_stat(irq_call_count);
|
||||
}
|
||||
|
||||
__visible void smp_call_function_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_call_function_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
__smp_call_function_interrupt();
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_call_function_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry
|
||||
smp_trace_call_function_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
trace_call_function_entry(CALL_FUNCTION_VECTOR);
|
||||
|
@ -314,14 +315,16 @@ static inline void __smp_call_function_single_interrupt(void)
|
|||
inc_irq_stat(irq_call_count);
|
||||
}
|
||||
|
||||
__visible void smp_call_function_single_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry
|
||||
smp_call_function_single_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
__smp_call_function_single_interrupt();
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry
|
||||
smp_trace_call_function_single_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);
|
||||
|
|
Loading…
Reference in New Issue