FILE
irq_vectors.h
File preview with syntax highlighting.
linux-6.19.14/arch/x86/include/asm/trace/irq_vectors.h
1/* SPDX-License-Identifier: GPL-2.0 */ 2#undef TRACE_SYSTEM 3#define TRACE_SYSTEM irq_vectors 4 5#if !defined(_TRACE_IRQ_VECTORS_H) || defined(TRACE_HEADER_MULTI_READ) 6#define _TRACE_IRQ_VECTORS_H 7 8#include <linux/tracepoint.h> 9 10#ifdef CONFIG_X86_LOCAL_APIC 11 12DECLARE_EVENT_CLASS(x86_irq_vector, 13 14 TP_PROTO(int vector), 15 16 TP_ARGS(vector), 17 18 TP_STRUCT__entry( 19 __field( int, vector ) 20 ), 21 22 TP_fast_assign( 23 __entry->vector = vector; 24 ), 25 26 TP_printk("vector=%d", __entry->vector) ); 27 28#define DEFINE_IRQ_VECTOR_EVENT(name) \ 29DEFINE_EVENT_FN(x86_irq_vector, name##_entry, \ 30 TP_PROTO(int vector), \ 31 TP_ARGS(vector), NULL, NULL); \ 32DEFINE_EVENT_FN(x86_irq_vector, name##_exit, \ 33 TP_PROTO(int vector), \ 34 TP_ARGS(vector), NULL, NULL); 35 36/* 37 * local_timer - called when entering/exiting a local timer interrupt 38 * vector handler 39 */ 40DEFINE_IRQ_VECTOR_EVENT(local_timer); 41 42/* 43 * spurious_apic - called when entering/exiting a spurious apic vector handler 44 */ 45DEFINE_IRQ_VECTOR_EVENT(spurious_apic); 46 47/* 48 * error_apic - called when entering/exiting an error apic vector handler 49 */ 50DEFINE_IRQ_VECTOR_EVENT(error_apic); 51 52/* 53 * x86_platform_ipi - called when entering/exiting a x86 platform ipi interrupt 54 * vector handler 55 */ 56DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi); 57 58#ifdef CONFIG_IRQ_WORK 59/* 60 * irq_work - called when entering/exiting a irq work interrupt 61 * vector handler 62 */ 63DEFINE_IRQ_VECTOR_EVENT(irq_work); 64 65/* 66 * We must dis-allow sampling irq_work_exit() because perf event sampling 67 * itself can cause irq_work, which would lead to an infinite loop; 68 * 69 * 1) irq_work_exit happens 70 * 2) generates perf sample 71 * 3) generates irq_work 72 * 4) goto 1 73 */ 74TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0); 75#endif 76 77/* 78 * The ifdef is required because that tracepoint macro hell emits tracepoint 79 * code in files which include this header even if the tracepoint is not 80 * enabled. Brilliant stuff that. 81 */ 82#ifdef CONFIG_SMP 83/* 84 * reschedule - called when entering/exiting a reschedule vector handler 85 */ 86DEFINE_IRQ_VECTOR_EVENT(reschedule); 87 88/* 89 * call_function - called when entering/exiting a call function interrupt 90 * vector handler 91 */ 92DEFINE_IRQ_VECTOR_EVENT(call_function); 93 94/* 95 * call_function_single - called when entering/exiting a call function 96 * single interrupt vector handler 97 */ 98DEFINE_IRQ_VECTOR_EVENT(call_function_single); 99#endif 100 101#ifdef CONFIG_X86_MCE_THRESHOLD 102/* 103 * threshold_apic - called when entering/exiting a threshold apic interrupt 104 * vector handler 105 */ 106DEFINE_IRQ_VECTOR_EVENT(threshold_apic); 107#endif 108 109#ifdef CONFIG_X86_MCE_AMD 110/* 111 * deferred_error_apic - called when entering/exiting a deferred apic interrupt 112 * vector handler 113 */ 114DEFINE_IRQ_VECTOR_EVENT(deferred_error_apic); 115#endif 116 117#ifdef CONFIG_X86_THERMAL_VECTOR 118/* 119 * thermal_apic - called when entering/exiting a thermal apic interrupt 120 * vector handler 121 */ 122DEFINE_IRQ_VECTOR_EVENT(thermal_apic); 123#endif 124 125TRACE_EVENT(vector_config, 126 127 TP_PROTO(unsigned int irq, unsigned int vector, 128 unsigned int cpu, unsigned int apicdest), 129 130 TP_ARGS(irq, vector, cpu, apicdest), 131 132 TP_STRUCT__entry( 133 __field( unsigned int, irq ) 134 __field( unsigned int, vector ) 135 __field( unsigned int, cpu ) 136 __field( unsigned int, apicdest ) 137 ), 138 139 TP_fast_assign( 140 __entry->irq = irq; 141 __entry->vector = vector; 142 __entry->cpu = cpu; 143 __entry->apicdest = apicdest; 144 ), 145 146 TP_printk("irq=%u vector=%u cpu=%u apicdest=0x%08x", 147 __entry->irq, __entry->vector, __entry->cpu, 148 __entry->apicdest) 149); 150 151DECLARE_EVENT_CLASS(vector_mod, 152 153 TP_PROTO(unsigned int irq, unsigned int vector, 154 unsigned int cpu, unsigned int prev_vector, 155 unsigned int prev_cpu), 156 157 TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu), 158 159 TP_STRUCT__entry( 160 __field( unsigned int, irq ) 161 __field( unsigned int, vector ) 162 __field( unsigned int, cpu ) 163 __field( unsigned int, prev_vector ) 164 __field( unsigned int, prev_cpu ) 165 ), 166 167 TP_fast_assign( 168 __entry->irq = irq; 169 __entry->vector = vector; 170 __entry->cpu = cpu; 171 __entry->prev_vector = prev_vector; 172 __entry->prev_cpu = prev_cpu; 173 174 ), 175 176 TP_printk("irq=%u vector=%u cpu=%u prev_vector=%u prev_cpu=%u", 177 __entry->irq, __entry->vector, __entry->cpu, 178 __entry->prev_vector, __entry->prev_cpu) 179); 180 181#define DEFINE_IRQ_VECTOR_MOD_EVENT(name) \ 182DEFINE_EVENT_FN(vector_mod, name, \ 183 TP_PROTO(unsigned int irq, unsigned int vector, \ 184 unsigned int cpu, unsigned int prev_vector, \ 185 unsigned int prev_cpu), \ 186 TP_ARGS(irq, vector, cpu, prev_vector, prev_cpu), NULL, NULL); \ 187 188DEFINE_IRQ_VECTOR_MOD_EVENT(vector_update); 189DEFINE_IRQ_VECTOR_MOD_EVENT(vector_clear); 190 191DECLARE_EVENT_CLASS(vector_reserve, 192 193 TP_PROTO(unsigned int irq, int ret), 194 195 TP_ARGS(irq, ret), 196 197 TP_STRUCT__entry( 198 __field( unsigned int, irq ) 199 __field( int, ret ) 200 ), 201 202 TP_fast_assign( 203 __entry->irq = irq; 204 __entry->ret = ret; 205 ), 206 207 TP_printk("irq=%u ret=%d", __entry->irq, __entry->ret) 208); 209 210#define DEFINE_IRQ_VECTOR_RESERVE_EVENT(name) \ 211DEFINE_EVENT_FN(vector_reserve, name, \ 212 TP_PROTO(unsigned int irq, int ret), \ 213 TP_ARGS(irq, ret), NULL, NULL); \ 214 215DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve_managed); 216DEFINE_IRQ_VECTOR_RESERVE_EVENT(vector_reserve); 217 218TRACE_EVENT(vector_alloc, 219 220 TP_PROTO(unsigned int irq, unsigned int vector, bool reserved, 221 int ret), 222 223 TP_ARGS(irq, vector, reserved, ret), 224 225 TP_STRUCT__entry( 226 __field( unsigned int, irq ) 227 __field( unsigned int, vector ) 228 __field( bool, reserved ) 229 __field( int, ret ) 230 ), 231 232 TP_fast_assign( 233 __entry->irq = irq; 234 __entry->vector = ret < 0 ? 0 : vector; 235 __entry->reserved = reserved; 236 __entry->ret = ret > 0 ? 0 : ret; 237 ), 238 239 TP_printk("irq=%u vector=%u reserved=%d ret=%d", 240 __entry->irq, __entry->vector, 241 __entry->reserved, __entry->ret) 242); 243 244TRACE_EVENT(vector_alloc_managed, 245 246 TP_PROTO(unsigned int irq, unsigned int vector, 247 int ret), 248 249 TP_ARGS(irq, vector, ret), 250 251 TP_STRUCT__entry( 252 __field( unsigned int, irq ) 253 __field( unsigned int, vector ) 254 __field( int, ret ) 255 ), 256 257 TP_fast_assign( 258 __entry->irq = irq; 259 __entry->vector = ret < 0 ? 0 : vector; 260 __entry->ret = ret > 0 ? 0 : ret; 261 ), 262 263 TP_printk("irq=%u vector=%u ret=%d", 264 __entry->irq, __entry->vector, __entry->ret) 265); 266 267DECLARE_EVENT_CLASS(vector_activate, 268 269 TP_PROTO(unsigned int irq, bool is_managed, bool can_reserve, 270 bool reserve), 271 272 TP_ARGS(irq, is_managed, can_reserve, reserve), 273 274 TP_STRUCT__entry( 275 __field( unsigned int, irq ) 276 __field( bool, is_managed ) 277 __field( bool, can_reserve ) 278 __field( bool, reserve ) 279 ), 280 281 TP_fast_assign( 282 __entry->irq = irq; 283 __entry->is_managed = is_managed; 284 __entry->can_reserve = can_reserve; 285 __entry->reserve = reserve; 286 ), 287 288 TP_printk("irq=%u is_managed=%d can_reserve=%d reserve=%d", 289 __entry->irq, __entry->is_managed, __entry->can_reserve, 290 __entry->reserve) 291); 292 293#define DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(name) \ 294DEFINE_EVENT_FN(vector_activate, name, \ 295 TP_PROTO(unsigned int irq, bool is_managed, \ 296 bool can_reserve, bool reserve), \ 297 TP_ARGS(irq, is_managed, can_reserve, reserve), NULL, NULL); \ 298 299DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_activate); 300DEFINE_IRQ_VECTOR_ACTIVATE_EVENT(vector_deactivate); 301 302TRACE_EVENT(vector_teardown, 303 304 TP_PROTO(unsigned int irq, bool is_managed, bool has_reserved), 305 306 TP_ARGS(irq, is_managed, has_reserved), 307 308 TP_STRUCT__entry( 309 __field( unsigned int, irq ) 310 __field( bool, is_managed ) 311 __field( bool, has_reserved ) 312 ), 313 314 TP_fast_assign( 315 __entry->irq = irq; 316 __entry->is_managed = is_managed; 317 __entry->has_reserved = has_reserved; 318 ), 319 320 TP_printk("irq=%u is_managed=%d has_reserved=%d", 321 __entry->irq, __entry->is_managed, __entry->has_reserved) 322); 323 324TRACE_EVENT(vector_setup, 325 326 TP_PROTO(unsigned int irq, bool is_legacy, int ret), 327 328 TP_ARGS(irq, is_legacy, ret), 329 330 TP_STRUCT__entry( 331 __field( unsigned int, irq ) 332 __field( bool, is_legacy ) 333 __field( int, ret ) 334 ), 335 336 TP_fast_assign( 337 __entry->irq = irq; 338 __entry->is_legacy = is_legacy; 339 __entry->ret = ret; 340 ), 341 342 TP_printk("irq=%u is_legacy=%d ret=%d", 343 __entry->irq, __entry->is_legacy, __entry->ret) 344); 345 346TRACE_EVENT(vector_free_moved, 347 348 TP_PROTO(unsigned int irq, unsigned int cpu, unsigned int vector, 349 bool is_managed), 350 351 TP_ARGS(irq, cpu, vector, is_managed), 352 353 TP_STRUCT__entry( 354 __field( unsigned int, irq ) 355 __field( unsigned int, cpu ) 356 __field( unsigned int, vector ) 357 __field( bool, is_managed ) 358 ), 359 360 TP_fast_assign( 361 __entry->irq = irq; 362 __entry->cpu = cpu; 363 __entry->vector = vector; 364 __entry->is_managed = is_managed; 365 ), 366 367 TP_printk("irq=%u cpu=%u vector=%u is_managed=%d", 368 __entry->irq, __entry->cpu, __entry->vector, 369 __entry->is_managed) 370); 371 372 373#endif /* CONFIG_X86_LOCAL_APIC */ 374 375#undef TRACE_INCLUDE_PATH 376#undef TRACE_INCLUDE_FILE 377#define TRACE_INCLUDE_PATH . 378#define TRACE_INCLUDE_FILE irq_vectors 379#endif /* _TRACE_IRQ_VECTORS_H */ 380 381/* This part must be outside protection */ 382#include <trace/define_trace.h>
~/
Read-only file preview.