root/include/trace/events/irq.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 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 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 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 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 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 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>

/* [<][>][^][v][top][bottom][index][help] */