1 #ifdef CONFIG_PREEMPTIRQ_TRACEPOINTS 2 3 #undef TRACE_SYSTEM 4 #define TRACE_SYSTEM preemptirq 5 6 #if !defined(_TRACE_PREEMPTIRQ_H) || defined(TRACE_HEADER_MULTI_READ) 7 #define _TRACE_PREEMPTIRQ_H 8 9 #include <linux/ktime.h> 10 #include <linux/tracepoint.h> 11 #include <linux/string.h> 12 #include <asm/sections.h> 13 14 DECLARE_EVENT_CLASS(preemptirq_template, 15 16 TP_PROTO(unsigned long ip, unsigned long parent_ip), 17 18 TP_ARGS(ip, parent_ip), 19 20 TP_STRUCT__entry( 21 __field(s32, caller_offs) 22 __field(s32, parent_offs) 23 ), 24 25 TP_fast_assign( 26 __entry->caller_offs = (s32)(ip - (unsigned long)_stext); 27 __entry->parent_offs = (s32)(parent_ip - (unsigned long)_stext); 28 ), 29 30 TP_printk("caller=%pS parent=%pS", 31 (void *)((unsigned long)(_stext) + __entry->caller_offs), 32 (void *)((unsigned long)(_stext) + __entry->parent_offs)) 33 ); 34 35 #ifdef CONFIG_TRACE_IRQFLAGS 36 DEFINE_EVENT(preemptirq_template, irq_disable, 37 TP_PROTO(unsigned long ip, unsigned long parent_ip), 38 TP_ARGS(ip, parent_ip)); 39 40 DEFINE_EVENT(preemptirq_template, irq_enable, 41 TP_PROTO(unsigned long ip, unsigned long parent_ip), 42 TP_ARGS(ip, parent_ip)); 43 #else 44 #define trace_irq_enable(...) 45 #define trace_irq_disable(...) 46 #endif 47 48 #ifdef CONFIG_TRACE_PREEMPT_TOGGLE 49 DEFINE_EVENT(preemptirq_template, preempt_disable, 50 TP_PROTO(unsigned long ip, unsigned long parent_ip), 51 TP_ARGS(ip, parent_ip)); 52 53 DEFINE_EVENT(preemptirq_template, preempt_enable, 54 TP_PROTO(unsigned long ip, unsigned long parent_ip), 55 TP_ARGS(ip, parent_ip)); 56 #else 57 #define trace_preempt_enable(...) 58 #define trace_preempt_disable(...) 59 #endif 60 61 #endif /* _TRACE_PREEMPTIRQ_H */ 62 63 #include <trace/define_trace.h> 64 65 #else /* !CONFIG_PREEMPTIRQ_TRACEPOINTS */ 66 #define trace_irq_enable(...) 67 #define trace_irq_disable(...) 68 #define trace_preempt_enable(...) 69 #define trace_preempt_disable(...) 70 #endif 71