osnoise.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #undef TRACE_SYSTEM
  3. #define TRACE_SYSTEM osnoise
  4. #if !defined(_OSNOISE_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
  5. #ifndef _OSNOISE_TRACE_H
  6. #define _OSNOISE_TRACE_H
  7. /*
  8. * osnoise sample structure definition. Used to store the statistics of a
  9. * sample run.
  10. */
  11. struct osnoise_sample {
  12. u64 runtime; /* runtime */
  13. u64 noise; /* noise */
  14. u64 max_sample; /* max single noise sample */
  15. int hw_count; /* # HW (incl. hypervisor) interference */
  16. int nmi_count; /* # NMIs during this sample */
  17. int irq_count; /* # IRQs during this sample */
  18. int softirq_count; /* # softirqs during this sample */
  19. int thread_count; /* # threads during this sample */
  20. };
  21. #ifdef CONFIG_TIMERLAT_TRACER
  22. /*
  23. * timerlat sample structure definition. Used to store the statistics of
  24. * a sample run.
  25. */
  26. struct timerlat_sample {
  27. u64 timer_latency; /* timer_latency */
  28. unsigned int seqnum; /* unique sequence */
  29. int context; /* timer context */
  30. };
  31. #endif // CONFIG_TIMERLAT_TRACER
  32. #endif // _OSNOISE_TRACE_H
  33. #include <linux/tracepoint.h>
  34. TRACE_EVENT(osnoise_sample,
  35. TP_PROTO(struct osnoise_sample *s),
  36. TP_ARGS(s),
  37. TP_STRUCT__entry(
  38. __field( u64, runtime )
  39. __field( u64, noise )
  40. __field( u64, max_sample )
  41. __field( int, hw_count )
  42. __field( int, irq_count )
  43. __field( int, nmi_count )
  44. __field( int, softirq_count )
  45. __field( int, thread_count )
  46. ),
  47. TP_fast_assign(
  48. __entry->runtime = s->runtime;
  49. __entry->noise = s->noise;
  50. __entry->max_sample = s->max_sample;
  51. __entry->hw_count = s->hw_count;
  52. __entry->irq_count = s->irq_count;
  53. __entry->nmi_count = s->nmi_count;
  54. __entry->softirq_count = s->softirq_count;
  55. __entry->thread_count = s->thread_count;
  56. ),
  57. TP_printk("runtime=%llu noise=%llu max_sample=%llu hw_count=%d"
  58. " irq_count=%d nmi_count=%d softirq_count=%d"
  59. " thread_count=%d",
  60. __entry->runtime,
  61. __entry->noise,
  62. __entry->max_sample,
  63. __entry->hw_count,
  64. __entry->irq_count,
  65. __entry->nmi_count,
  66. __entry->softirq_count,
  67. __entry->thread_count)
  68. );
  69. #ifdef CONFIG_TIMERLAT_TRACER
  70. TRACE_EVENT(timerlat_sample,
  71. TP_PROTO(struct timerlat_sample *s),
  72. TP_ARGS(s),
  73. TP_STRUCT__entry(
  74. __field( u64, timer_latency )
  75. __field( unsigned int, seqnum )
  76. __field( int, context )
  77. ),
  78. TP_fast_assign(
  79. __entry->timer_latency = s->timer_latency;
  80. __entry->seqnum = s->seqnum;
  81. __entry->context = s->context;
  82. ),
  83. TP_printk("timer_latency=%llu seqnum=%u context=%d",
  84. __entry->timer_latency,
  85. __entry->seqnum,
  86. __entry->context)
  87. );
  88. #endif // CONFIG_TIMERLAT_TRACER
  89. TRACE_EVENT(thread_noise,
  90. TP_PROTO(struct task_struct *t, u64 start, u64 duration),
  91. TP_ARGS(t, start, duration),
  92. TP_STRUCT__entry(
  93. __array( char, comm, TASK_COMM_LEN)
  94. __field( u64, start )
  95. __field( u64, duration)
  96. __field( pid_t, pid )
  97. ),
  98. TP_fast_assign(
  99. memcpy(__entry->comm, t->comm, TASK_COMM_LEN);
  100. __entry->pid = t->pid;
  101. __entry->start = start;
  102. __entry->duration = duration;
  103. ),
  104. TP_printk("%8s:%d start %llu.%09u duration %llu ns",
  105. __entry->comm,
  106. __entry->pid,
  107. __print_ns_to_secs(__entry->start),
  108. __print_ns_without_secs(__entry->start),
  109. __entry->duration)
  110. );
  111. TRACE_EVENT(softirq_noise,
  112. TP_PROTO(int vector, u64 start, u64 duration),
  113. TP_ARGS(vector, start, duration),
  114. TP_STRUCT__entry(
  115. __field( u64, start )
  116. __field( u64, duration)
  117. __field( int, vector )
  118. ),
  119. TP_fast_assign(
  120. __entry->vector = vector;
  121. __entry->start = start;
  122. __entry->duration = duration;
  123. ),
  124. TP_printk("%8s:%d start %llu.%09u duration %llu ns",
  125. show_softirq_name(__entry->vector),
  126. __entry->vector,
  127. __print_ns_to_secs(__entry->start),
  128. __print_ns_without_secs(__entry->start),
  129. __entry->duration)
  130. );
  131. TRACE_EVENT(irq_noise,
  132. TP_PROTO(int vector, const char *desc, u64 start, u64 duration),
  133. TP_ARGS(vector, desc, start, duration),
  134. TP_STRUCT__entry(
  135. __field( u64, start )
  136. __field( u64, duration)
  137. __string( desc, desc )
  138. __field( int, vector )
  139. ),
  140. TP_fast_assign(
  141. __assign_str(desc);
  142. __entry->vector = vector;
  143. __entry->start = start;
  144. __entry->duration = duration;
  145. ),
  146. TP_printk("%s:%d start %llu.%09u duration %llu ns",
  147. __get_str(desc),
  148. __entry->vector,
  149. __print_ns_to_secs(__entry->start),
  150. __print_ns_without_secs(__entry->start),
  151. __entry->duration)
  152. );
  153. TRACE_EVENT(nmi_noise,
  154. TP_PROTO(u64 start, u64 duration),
  155. TP_ARGS(start, duration),
  156. TP_STRUCT__entry(
  157. __field( u64, start )
  158. __field( u64, duration)
  159. ),
  160. TP_fast_assign(
  161. __entry->start = start;
  162. __entry->duration = duration;
  163. ),
  164. TP_printk("start %llu.%09u duration %llu ns",
  165. __print_ns_to_secs(__entry->start),
  166. __print_ns_without_secs(__entry->start),
  167. __entry->duration)
  168. );
  169. TRACE_EVENT(sample_threshold,
  170. TP_PROTO(u64 start, u64 duration, u64 interference),
  171. TP_ARGS(start, duration, interference),
  172. TP_STRUCT__entry(
  173. __field( u64, start )
  174. __field( u64, duration)
  175. __field( u64, interference)
  176. ),
  177. TP_fast_assign(
  178. __entry->start = start;
  179. __entry->duration = duration;
  180. __entry->interference = interference;
  181. ),
  182. TP_printk("start %llu.%09u duration %llu ns interference %llu",
  183. __print_ns_to_secs(__entry->start),
  184. __print_ns_without_secs(__entry->start),
  185. __entry->duration,
  186. __entry->interference)
  187. );
  188. #endif /* _TRACE_OSNOISE_H */
  189. /* This part must be outside protection */
  190. #include <trace/define_trace.h>