Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #undef TRACE_SYSTEM 3 : : #define TRACE_SYSTEM irq 4 : : 5 : : #if !defined(_TRACE_IRQ_H) || defined(TRACE_HEADER_MULTI_READ) 6 : : #define _TRACE_IRQ_H 7 : : 8 : : #include <linux/tracepoint.h> 9 : : 10 : : struct irqaction; 11 : : struct softirq_action; 12 : : 13 : : #define SOFTIRQ_NAME_LIST \ 14 : : softirq_name(HI) \ 15 : : softirq_name(TIMER) \ 16 : : softirq_name(NET_TX) \ 17 : : softirq_name(NET_RX) \ 18 : : softirq_name(BLOCK) \ 19 : : softirq_name(IRQ_POLL) \ 20 : : softirq_name(TASKLET) \ 21 : : softirq_name(SCHED) \ 22 : : softirq_name(HRTIMER) \ 23 : : softirq_name_end(RCU) 24 : : 25 : : #undef softirq_name 26 : : #undef softirq_name_end 27 : : 28 : : #define softirq_name(sirq) TRACE_DEFINE_ENUM(sirq##_SOFTIRQ); 29 : : #define softirq_name_end(sirq) TRACE_DEFINE_ENUM(sirq##_SOFTIRQ); 30 : : 31 : : SOFTIRQ_NAME_LIST 32 : : 33 : : #undef softirq_name 34 : : #undef softirq_name_end 35 : : 36 : : #define softirq_name(sirq) { sirq##_SOFTIRQ, #sirq }, 37 : : #define softirq_name_end(sirq) { sirq##_SOFTIRQ, #sirq } 38 : : 39 : : #define show_softirq_name(val) \ 40 : : __print_symbolic(val, SOFTIRQ_NAME_LIST) 41 : : 42 : : /** 43 : : * irq_handler_entry - called immediately before the irq action handler 44 : : * @irq: irq number 45 : : * @action: pointer to struct irqaction 46 : : * 47 : : * The struct irqaction pointed to by @action contains various 48 : : * information about the handler, including the device name, 49 : : * @action->name, and the device id, @action->dev_id. When used in 50 : : * conjunction with the irq_handler_exit tracepoint, we can figure 51 : : * out irq handler latencies. 52 : : */ 53 : 3 : TRACE_EVENT(irq_handler_entry, 54 : : 55 : : TP_PROTO(int irq, struct irqaction *action), 56 : : 57 : : TP_ARGS(irq, action), 58 : : 59 : : TP_STRUCT__entry( 60 : : __field( int, irq ) 61 : : __string( name, action->name ) 62 : : ), 63 : : 64 : : TP_fast_assign( 65 : : __entry->irq = irq; 66 : : __assign_str(name, action->name); 67 : : ), 68 : : 69 : : TP_printk("irq=%d name=%s", __entry->irq, __get_str(name)) 70 : : ); 71 : : 72 : : /** 73 : : * irq_handler_exit - called immediately after the irq action handler returns 74 : : * @irq: irq number 75 : : * @action: pointer to struct irqaction 76 : : * @ret: return value 77 : : * 78 : : * If the @ret value is set to IRQ_HANDLED, then we know that the corresponding 79 : : * @action->handler successfully handled this irq. Otherwise, the irq might be 80 : : * a shared irq line, or the irq was not handled successfully. Can be used in 81 : : * conjunction with the irq_handler_entry to understand irq handler latencies. 82 : : */ 83 : 3 : TRACE_EVENT(irq_handler_exit, 84 : : 85 : : TP_PROTO(int irq, struct irqaction *action, int ret), 86 : : 87 : : TP_ARGS(irq, action, ret), 88 : : 89 : : TP_STRUCT__entry( 90 : : __field( int, irq ) 91 : : __field( int, ret ) 92 : : ), 93 : : 94 : : TP_fast_assign( 95 : : __entry->irq = irq; 96 : : __entry->ret = ret; 97 : : ), 98 : : 99 : : TP_printk("irq=%d ret=%s", 100 : : __entry->irq, __entry->ret ? "handled" : "unhandled") 101 : : ); 102 : : 103 : 3 : DECLARE_EVENT_CLASS(softirq, 104 : : 105 : : TP_PROTO(unsigned int vec_nr), 106 : : 107 : : TP_ARGS(vec_nr), 108 : : 109 : : TP_STRUCT__entry( 110 : : __field( unsigned int, vec ) 111 : : ), 112 : : 113 : : TP_fast_assign( 114 : : __entry->vec = vec_nr; 115 : : ), 116 : : 117 : : TP_printk("vec=%u [action=%s]", __entry->vec, 118 : : show_softirq_name(__entry->vec)) 119 : : ); 120 : : 121 : : /** 122 : : * softirq_entry - called immediately before the softirq handler 123 : : * @vec_nr: softirq vector number 124 : : * 125 : : * When used in combination with the softirq_exit tracepoint 126 : : * we can determine the softirq handler routine. 127 : : */ 128 : 3 : DEFINE_EVENT(softirq, softirq_entry, 129 : : 130 : : TP_PROTO(unsigned int vec_nr), 131 : : 132 : : TP_ARGS(vec_nr) 133 : : ); 134 : : 135 : : /** 136 : : * softirq_exit - called immediately after the softirq handler returns 137 : : * @vec_nr: softirq vector number 138 : : * 139 : : * When used in combination with the softirq_entry tracepoint 140 : : * we can determine the softirq handler routine. 141 : : */ 142 : 3 : DEFINE_EVENT(softirq, softirq_exit, 143 : : 144 : : TP_PROTO(unsigned int vec_nr), 145 : : 146 : : TP_ARGS(vec_nr) 147 : : ); 148 : : 149 : : /** 150 : : * softirq_raise - called immediately when a softirq is raised 151 : : * @vec_nr: softirq vector number 152 : : * 153 : : * When used in combination with the softirq_entry tracepoint 154 : : * we can determine the softirq raise to run latency. 155 : : */ 156 : 3 : DEFINE_EVENT(softirq, softirq_raise, 157 : : 158 : : TP_PROTO(unsigned int vec_nr), 159 : : 160 : : TP_ARGS(vec_nr) 161 : : ); 162 : : 163 : : #endif /* _TRACE_IRQ_H */ 164 : : 165 : : /* This part must be outside protection */ 166 : : #include <trace/define_trace.h>