irq_vectors.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #undef TRACE_SYSTEM
  2. #define TRACE_SYSTEM irq_vectors
  3. #if !defined(_TRACE_IRQ_VECTORS_H) || defined(TRACE_HEADER_MULTI_READ)
  4. #define _TRACE_IRQ_VECTORS_H
  5. #include <linux/tracepoint.h>
  6. extern void trace_irq_vector_regfunc(void);
  7. extern void trace_irq_vector_unregfunc(void);
  8. DECLARE_EVENT_CLASS(x86_irq_vector,
  9. TP_PROTO(int vector),
  10. TP_ARGS(vector),
  11. TP_STRUCT__entry(
  12. __field( int, vector )
  13. ),
  14. TP_fast_assign(
  15. __entry->vector = vector;
  16. ),
  17. TP_printk("vector=%d", __entry->vector) );
  18. #define DEFINE_IRQ_VECTOR_EVENT(name) \
  19. DEFINE_EVENT_FN(x86_irq_vector, name##_entry, \
  20. TP_PROTO(int vector), \
  21. TP_ARGS(vector), \
  22. trace_irq_vector_regfunc, \
  23. trace_irq_vector_unregfunc); \
  24. DEFINE_EVENT_FN(x86_irq_vector, name##_exit, \
  25. TP_PROTO(int vector), \
  26. TP_ARGS(vector), \
  27. trace_irq_vector_regfunc, \
  28. trace_irq_vector_unregfunc);
  29. /*
  30. * local_timer - called when entering/exiting a local timer interrupt
  31. * vector handler
  32. */
  33. DEFINE_IRQ_VECTOR_EVENT(local_timer);
  34. /*
  35. * reschedule - called when entering/exiting a reschedule vector handler
  36. */
  37. DEFINE_IRQ_VECTOR_EVENT(reschedule);
  38. /*
  39. * spurious_apic - called when entering/exiting a spurious apic vector handler
  40. */
  41. DEFINE_IRQ_VECTOR_EVENT(spurious_apic);
  42. /*
  43. * error_apic - called when entering/exiting an error apic vector handler
  44. */
  45. DEFINE_IRQ_VECTOR_EVENT(error_apic);
  46. /*
  47. * x86_platform_ipi - called when entering/exiting a x86 platform ipi interrupt
  48. * vector handler
  49. */
  50. DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi);
  51. /*
  52. * irq_work - called when entering/exiting a irq work interrupt
  53. * vector handler
  54. */
  55. DEFINE_IRQ_VECTOR_EVENT(irq_work);
  56. /*
  57. * We must dis-allow sampling irq_work_exit() because perf event sampling
  58. * itself can cause irq_work, which would lead to an infinite loop;
  59. *
  60. * 1) irq_work_exit happens
  61. * 2) generates perf sample
  62. * 3) generates irq_work
  63. * 4) goto 1
  64. */
  65. TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0);
  66. /*
  67. * call_function - called when entering/exiting a call function interrupt
  68. * vector handler
  69. */
  70. DEFINE_IRQ_VECTOR_EVENT(call_function);
  71. /*
  72. * call_function_single - called when entering/exiting a call function
  73. * single interrupt vector handler
  74. */
  75. DEFINE_IRQ_VECTOR_EVENT(call_function_single);
  76. /*
  77. * threshold_apic - called when entering/exiting a threshold apic interrupt
  78. * vector handler
  79. */
  80. DEFINE_IRQ_VECTOR_EVENT(threshold_apic);
  81. /*
  82. * thermal_apic - called when entering/exiting a thermal apic interrupt
  83. * vector handler
  84. */
  85. DEFINE_IRQ_VECTOR_EVENT(thermal_apic);
  86. #undef TRACE_INCLUDE_PATH
  87. #define TRACE_INCLUDE_PATH .
  88. #define TRACE_INCLUDE_FILE irq_vectors
  89. #endif /* _TRACE_IRQ_VECTORS_H */
  90. /* This part must be outside protection */
  91. #include <trace/define_trace.h>