Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #undef TRACE_SYSTEM
0003 #define TRACE_SYSTEM irq_vectors
0004 
0005 #if !defined(_TRACE_IRQ_VECTORS_H) || defined(TRACE_HEADER_MULTI_READ)
0006 #define _TRACE_IRQ_VECTORS_H
0007 
0008 #include <linux/tracepoint.h>
0009 #include <asm/trace/common.h>
0010 
0011 #ifdef CONFIG_X86_LOCAL_APIC
0012 
0013 DECLARE_EVENT_CLASS(x86_irq_vector,
0014 
0015     TP_PROTO(int vector),
0016 
0017     TP_ARGS(vector),
0018 
0019     TP_STRUCT__entry(
0020         __field(        int,    vector  )
0021     ),
0022 
0023     TP_fast_assign(
0024         __entry->vector = vector;
0025     ),
0026 
0027     TP_printk("vector=%d", __entry->vector) );
0028 
0029 #define DEFINE_IRQ_VECTOR_EVENT(name)       \
0030 DEFINE_EVENT_FN(x86_irq_vector, name##_entry,   \
0031     TP_PROTO(int vector),           \
0032     TP_ARGS(vector), NULL, NULL);       \
0033 DEFINE_EVENT_FN(x86_irq_vector, name##_exit,    \
0034     TP_PROTO(int vector),           \
0035     TP_ARGS(vector), NULL, NULL);
0036 
0037 /*
0038  * local_timer - called when entering/exiting a local timer interrupt
0039  * vector handler
0040  */
0041 DEFINE_IRQ_VECTOR_EVENT(local_timer);
0042 
0043 /*
0044  * spurious_apic - called when entering/exiting a spurious apic vector handler
0045  */
0046 DEFINE_IRQ_VECTOR_EVENT(spurious_apic);
0047 
0048 /*
0049  * error_apic - called when entering/exiting an error apic vector handler
0050  */
0051 DEFINE_IRQ_VECTOR_EVENT(error_apic);
0052 
0053 /*
0054  * x86_platform_ipi - called when entering/exiting a x86 platform ipi interrupt
0055  * vector handler
0056  */
0057 DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi);
0058 
0059 #ifdef CONFIG_IRQ_WORK
0060 /*
0061  * irq_work - called when entering/exiting a irq work interrupt
0062  * vector handler
0063  */
0064 DEFINE_IRQ_VECTOR_EVENT(irq_work);
0065 
0066 /*
0067  * We must dis-allow sampling irq_work_exit() because perf event sampling
0068  * itself can cause irq_work, which would lead to an infinite loop;
0069  *
0070  *  1) irq_work_exit happens
0071  *  2) generates perf sample
0072  *  3) generates irq_work
0073  *  4) goto 1
0074  */
0075 TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0);
0076 #endif
0077 
0078 /*
0079  * The ifdef is required because that tracepoint macro hell emits tracepoint
0080  * code in files which include this header even if the tracepoint is not
0081  * enabled. Brilliant stuff that.
0082  */
0083 #ifdef CONFIG_SMP
0084 /*
0085  * reschedule - called when entering/exiting a reschedule vector handler
0086  */
0087 DEFINE_IRQ_VECTOR_EVENT(reschedule);
0088 
0089 /*
0090  * call_function - called when entering/exiting a call function interrupt
0091  * vector handler
0092  */
0093 DEFINE_IRQ_VECTOR_EVENT(call_function);
0094 
0095 /*
0096  * call_function_single - called when entering/exiting a call function
0097  * single interrupt vector handler
0098  */
0099 DEFINE_IRQ_VECTOR_EVENT(call_function_single);
0100 #endif
0101 
0102 #ifdef CONFIG_X86_MCE_THRESHOLD
0103 /*
0104  * threshold_apic - called when entering/exiting a threshold apic interrupt
0105  * vector handler
0106  */
0107 DEFINE_IRQ_VECTOR_EVENT(threshold_apic);
0108 #endif
0109 
0110 #ifdef CONFIG_X86_MCE_AMD
0111 /*
0112  * deferred_error_apic - called when entering/exiting a deferred apic interrupt
0113  * vector handler
0114  */
0115 DEFINE_IRQ_VECTOR_EVENT(deferred_error_apic);
0116 #endif
0117 
0118 #ifdef CONFIG_X86_THERMAL_VECTOR
0119 /*
0120  * thermal_apic - called when entering/exiting a thermal apic interrupt
0121  * vector handler
0122  */
0123 DEFINE_IRQ_VECTOR_EVENT(thermal_apic);
0124 #endif
0125 
0126 TRACE_EVENT(vector_config,
0127 
0128     TP_PROTO(unsigned int irq, unsigned int vector,
0129          unsigned int cpu, unsigned int apicdest),
0130 
0131     TP_ARGS(irq, vector, cpu, apicdest),
0132 
0133     TP_STRUCT__entry(
0134         __field(    unsigned int,   irq     )
0135         __field(    unsigned int,   vector      )
0136         __field(    unsigned int,   cpu     )
0137         __field(    unsigned int,   apicdest    )
0138     ),
0139 
0140     TP_fast_assign(
0141         __entry->irq        = irq;
0142         __entry->vector     = vector;
0143         __entry->cpu        = cpu;
0144         __entry->apicdest   = apicdest;
0145     ),
0146 
0147     TP_printk("irq=%u vector=%u cpu=%u apicdest=0x%08x",
0148           __entry->irq, __entry->vector, __entry->cpu,
0149           __entry->apicdest)
0150 );
0151 
0152 DECLARE_EVENT_CLASS(vector_mod,
0153 
0154     TP_PROTO(unsigned int irq, unsigned int vector,
0155          unsigned int cpu, unsigned int prev_vector,
0156          unsigned int prev_cpu),
0157 
0158     TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu),
0159 
0160     TP_STRUCT__entry(
0161         __field(    unsigned int,   irq     )
0162         __field(    unsigned int,   vector      )
0163         __field(    unsigned int,   cpu     )
0164         __field(    unsigned int,   prev_vector )
0165         __field(    unsigned int,   prev_cpu    )
0166     ),
0167 
0168     TP_fast_assign(
0169         __entry->irq        = irq;
0170         __entry->vector     = vector;
0171         __entry->cpu        = cpu;
0172         __entry->prev_vector    = prev_vector;
0173         __entry->prev_cpu   = prev_cpu;
0174 
0175     ),
0176 
0177     TP_printk("irq=%u vector=%u cpu=%u prev_vector=%u prev_cpu=%u",
0178           __entry->irq, __entry->vector, __entry->cpu,
0179           __entry->prev_vector, __entry->prev_cpu)
0180 );
0181 
0182 #define DEFINE_IRQ_VECTOR_MOD_EVENT(name)               \
0183 DEFINE_EVENT_FN(vector_mod, name,                   \
0184     TP_PROTO(unsigned int irq, unsigned int vector,         \
0185          unsigned int cpu, unsigned int prev_vector,        \
0186          unsigned int prev_cpu),                \
0187     TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu), NULL, NULL);  \
0188 
0189 DEFINE_IRQ_VECTOR_MOD_EVENT(vector_update);
0190 DEFINE_IRQ_VECTOR_MOD_EVENT(vector_clear);
0191 
0192 DECLARE_EVENT_CLASS(vector_reserve,
0193 
0194     TP_PROTO(unsigned int irq, int ret),
0195 
0196     TP_ARGS(irq, ret),
0197 
0198     TP_STRUCT__entry(
0199         __field(    unsigned int,   irq )
0200         __field(    int,        ret )
0201     ),
0202 
0203     TP_fast_assign(
0204         __entry->irq = irq;
0205         __entry->ret = ret;
0206     ),
0207 
0208     TP_printk("irq=%u ret=%d", __entry->irq, __entry->ret)
0209 );
0210 
0211 #define DEFINE_IRQ_VECTOR_RESERVE_EVENT(name)   \
0212 DEFINE_EVENT_FN(vector_reserve, name,   \
0213     TP_PROTO(unsigned int irq, int ret),    \
0214     TP_ARGS(irq, ret), NULL, NULL);     \
0215 
0216 DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve_managed);
0217 DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve);
0218 
0219 TRACE_EVENT(vector_alloc,
0220 
0221     TP_PROTO(unsigned int irq, unsigned int vector, bool reserved,
0222          int ret),
0223 
0224     TP_ARGS(irq, vector, reserved, ret),
0225 
0226     TP_STRUCT__entry(
0227         __field(    unsigned int,   irq     )
0228         __field(    unsigned int,   vector      )
0229         __field(    bool,       reserved    )
0230         __field(    int,        ret     )
0231     ),
0232 
0233     TP_fast_assign(
0234         __entry->irq        = irq;
0235         __entry->vector     = ret < 0 ? 0 : vector;
0236         __entry->reserved   = reserved;
0237         __entry->ret        = ret > 0 ? 0 : ret;
0238     ),
0239 
0240     TP_printk("irq=%u vector=%u reserved=%d ret=%d",
0241           __entry->irq, __entry->vector,
0242           __entry->reserved, __entry->ret)
0243 );
0244 
0245 TRACE_EVENT(vector_alloc_managed,
0246 
0247     TP_PROTO(unsigned int irq, unsigned int vector,
0248          int ret),
0249 
0250     TP_ARGS(irq, vector, ret),
0251 
0252     TP_STRUCT__entry(
0253         __field(    unsigned int,   irq     )
0254         __field(    unsigned int,   vector      )
0255         __field(    int,        ret     )
0256     ),
0257 
0258     TP_fast_assign(
0259         __entry->irq        = irq;
0260         __entry->vector     = ret < 0 ? 0 : vector;
0261         __entry->ret        = ret > 0 ? 0 : ret;
0262     ),
0263 
0264     TP_printk("irq=%u vector=%u ret=%d",
0265           __entry->irq, __entry->vector, __entry->ret)
0266 );
0267 
0268 DECLARE_EVENT_CLASS(vector_activate,
0269 
0270     TP_PROTO(unsigned int irq, bool is_managed, bool can_reserve,
0271          bool reserve),
0272 
0273     TP_ARGS(irq, is_managed, can_reserve, reserve),
0274 
0275     TP_STRUCT__entry(
0276         __field(    unsigned int,   irq     )
0277         __field(    bool,       is_managed  )
0278         __field(    bool,       can_reserve )
0279         __field(    bool,       reserve     )
0280     ),
0281 
0282     TP_fast_assign(
0283         __entry->irq        = irq;
0284         __entry->is_managed = is_managed;
0285         __entry->can_reserve    = can_reserve;
0286         __entry->reserve    = reserve;
0287     ),
0288 
0289     TP_printk("irq=%u is_managed=%d can_reserve=%d reserve=%d",
0290           __entry->irq, __entry->is_managed, __entry->can_reserve,
0291           __entry->reserve)
0292 );
0293 
0294 #define DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(name)              \
0295 DEFINE_EVENT_FN(vector_activate, name,                  \
0296     TP_PROTO(unsigned int irq, bool is_managed,         \
0297          bool can_reserve, bool reserve),           \
0298     TP_ARGS(irq, is_managed, can_reserve, reserve), NULL, NULL);    \
0299 
0300 DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_activate);
0301 DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_deactivate);
0302 
0303 TRACE_EVENT(vector_teardown,
0304 
0305     TP_PROTO(unsigned int irq, bool is_managed, bool has_reserved),
0306 
0307     TP_ARGS(irq, is_managed, has_reserved),
0308 
0309     TP_STRUCT__entry(
0310         __field(    unsigned int,   irq     )
0311         __field(    bool,       is_managed  )
0312         __field(    bool,       has_reserved    )
0313     ),
0314 
0315     TP_fast_assign(
0316         __entry->irq        = irq;
0317         __entry->is_managed = is_managed;
0318         __entry->has_reserved   = has_reserved;
0319     ),
0320 
0321     TP_printk("irq=%u is_managed=%d has_reserved=%d",
0322           __entry->irq, __entry->is_managed, __entry->has_reserved)
0323 );
0324 
0325 TRACE_EVENT(vector_setup,
0326 
0327     TP_PROTO(unsigned int irq, bool is_legacy, int ret),
0328 
0329     TP_ARGS(irq, is_legacy, ret),
0330 
0331     TP_STRUCT__entry(
0332         __field(    unsigned int,   irq     )
0333         __field(    bool,       is_legacy   )
0334         __field(    int,        ret     )
0335     ),
0336 
0337     TP_fast_assign(
0338         __entry->irq        = irq;
0339         __entry->is_legacy  = is_legacy;
0340         __entry->ret        = ret;
0341     ),
0342 
0343     TP_printk("irq=%u is_legacy=%d ret=%d",
0344           __entry->irq, __entry->is_legacy, __entry->ret)
0345 );
0346 
0347 TRACE_EVENT(vector_free_moved,
0348 
0349     TP_PROTO(unsigned int irq, unsigned int cpu, unsigned int vector,
0350          bool is_managed),
0351 
0352     TP_ARGS(irq, cpu, vector, is_managed),
0353 
0354     TP_STRUCT__entry(
0355         __field(    unsigned int,   irq     )
0356         __field(    unsigned int,   cpu     )
0357         __field(    unsigned int,   vector      )
0358         __field(    bool,       is_managed  )
0359     ),
0360 
0361     TP_fast_assign(
0362         __entry->irq        = irq;
0363         __entry->cpu        = cpu;
0364         __entry->vector     = vector;
0365         __entry->is_managed = is_managed;
0366     ),
0367 
0368     TP_printk("irq=%u cpu=%u vector=%u is_managed=%d",
0369           __entry->irq, __entry->cpu, __entry->vector,
0370           __entry->is_managed)
0371 );
0372 
0373 
0374 #endif /* CONFIG_X86_LOCAL_APIC */
0375 
0376 #undef TRACE_INCLUDE_PATH
0377 #undef TRACE_INCLUDE_FILE
0378 #define TRACE_INCLUDE_PATH .
0379 #define TRACE_INCLUDE_FILE irq_vectors
0380 #endif /*  _TRACE_IRQ_VECTORS_H */
0381 
0382 /* This part must be outside protection */
0383 #include <trace/define_trace.h>