0001
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
0039
0040
0041 DEFINE_IRQ_VECTOR_EVENT(local_timer);
0042
0043
0044
0045
0046 DEFINE_IRQ_VECTOR_EVENT(spurious_apic);
0047
0048
0049
0050
0051 DEFINE_IRQ_VECTOR_EVENT(error_apic);
0052
0053
0054
0055
0056
0057 DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi);
0058
0059 #ifdef CONFIG_IRQ_WORK
0060
0061
0062
0063
0064 DEFINE_IRQ_VECTOR_EVENT(irq_work);
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0);
0076 #endif
0077
0078
0079
0080
0081
0082
0083 #ifdef CONFIG_SMP
0084
0085
0086
0087 DEFINE_IRQ_VECTOR_EVENT(reschedule);
0088
0089
0090
0091
0092
0093 DEFINE_IRQ_VECTOR_EVENT(call_function);
0094
0095
0096
0097
0098
0099 DEFINE_IRQ_VECTOR_EVENT(call_function_single);
0100 #endif
0101
0102 #ifdef CONFIG_X86_MCE_THRESHOLD
0103
0104
0105
0106
0107 DEFINE_IRQ_VECTOR_EVENT(threshold_apic);
0108 #endif
0109
0110 #ifdef CONFIG_X86_MCE_AMD
0111
0112
0113
0114
0115 DEFINE_IRQ_VECTOR_EVENT(deferred_error_apic);
0116 #endif
0117
0118 #ifdef CONFIG_X86_THERMAL_VECTOR
0119
0120
0121
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
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
0381
0382
0383 #include <trace/define_trace.h>