mt_sched_mon.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #ifndef _MT_SCHED_MON_H
  2. #define _MT_SCHED_MON_H
  3. /*CPU holding event: ISR/SoftIRQ/Tasklet/Timer*/
  4. struct sched_block_event {
  5. int type;
  6. unsigned long cur_event;
  7. unsigned long last_event;
  8. unsigned long long cur_ts;
  9. unsigned long long last_ts;
  10. unsigned long long last_te;
  11. unsigned long cur_count;
  12. unsigned long last_count;
  13. int preempt_count;
  14. };
  15. #define MAX_NR_IRQS 512
  16. struct mt_irq_count {
  17. unsigned int irqs[MAX_NR_IRQS];
  18. };
  19. #include <asm/hardirq.h>
  20. #ifdef CONFIG_SMP
  21. struct mt_local_irq_count {
  22. unsigned int ipis[NR_IPI];
  23. };
  24. #endif
  25. #define CPU_DOWN 1
  26. #define SCHED_TICK 0
  27. DECLARE_PER_CPU(struct sched_block_event, ISR_mon);
  28. DECLARE_PER_CPU(struct sched_block_event, SoftIRQ_mon);
  29. DECLARE_PER_CPU(struct sched_block_event, tasklet_mon);
  30. DECLARE_PER_CPU(struct sched_block_event, hrt_mon);
  31. DECLARE_PER_CPU(struct sched_block_event, sft_mon);
  32. DECLARE_PER_CPU(struct mt_irq_count, irq_count_mon);
  33. DECLARE_PER_CPU(struct mt_local_irq_count, ipi_count_mon);
  34. DECLARE_PER_CPU(unsigned long long, save_irq_count_time);
  35. DECLARE_PER_CPU(int, mt_timer_irq);
  36. #ifdef CONFIG_MT_SCHED_MONITOR
  37. extern void mt_trace_ISR_start(int id);
  38. extern void mt_trace_ISR_end(int id);
  39. extern void mt_trace_SoftIRQ_start(int id);
  40. extern void mt_trace_SoftIRQ_end(int id);
  41. extern void mt_trace_tasklet_start(void *func);
  42. extern void mt_trace_tasklet_end(void *func);
  43. extern void mt_trace_hrt_start(void *func);
  44. extern void mt_trace_hrt_end(void *func);
  45. extern void mt_trace_sft_start(void *func);
  46. extern void mt_trace_sft_end(void *func);
  47. extern void mt_save_irq_counts(int action);
  48. extern void mt_trace_rqlock_start(raw_spinlock_t *lock);
  49. extern void mt_trace_rqlock_end(raw_spinlock_t *lock);
  50. #else
  51. static inline void mt_trace_ISR_start(int id) {};
  52. static inline void mt_trace_ISR_end(int id) {};
  53. static inline void mt_trace_SoftIRQ_start(int id) {};
  54. static inline void mt_trace_SoftIRQ_end(int id) {};
  55. static inline void mt_trace_tasklet_start(void *func) {};
  56. static inline void mt_trace_tasklet_end(void *func) {};
  57. static inline void mt_trace_hrt_start(void *func) {};
  58. static inline void mt_trace_hrt_end(void *func) {};
  59. static inline void mt_trace_sft_start(void *func) {};
  60. static inline void mt_trace_sft_end(void *func) {};
  61. static inline void mt_save_irq_counts(int action) {};
  62. static inline void mt_trace_rqlock_start(raw_spinlock_t *lock) {};
  63. static inline void mt_trace_rqlock_end(raw_spinlock_t *lock) {};
  64. #endif
  65. extern spinlock_t mt_irq_count_lock;
  66. extern void mt_show_last_irq_counts(void);
  67. extern void mt_show_current_irq_counts(void);
  68. extern void mt_sched_monitor_switch(int on);
  69. /*Schedule disable event: IRQ/Preempt disable monitor*/
  70. struct sched_stop_event {
  71. unsigned long long cur_ts;
  72. unsigned long long last_ts;
  73. unsigned long long last_te;
  74. unsigned long long lock_dur;
  75. unsigned long lock_owner;
  76. raw_spinlock_t *lock;
  77. };
  78. struct sched_lock_event {
  79. unsigned long long lock_ts;
  80. unsigned long long lock_te;
  81. unsigned long long lock_dur;
  82. unsigned long lock_owner;
  83. };
  84. DECLARE_PER_CPU(struct sched_stop_event, IRQ_disable_mon);
  85. DECLARE_PER_CPU(struct sched_stop_event, Preempt_disable_mon);
  86. DECLARE_PER_CPU(struct sched_lock_event, Raw_spin_lock_mon);
  87. DECLARE_PER_CPU(struct sched_lock_event, rq_lock_mon);
  88. #ifdef CONFIG_PREEMPT_MONITOR
  89. extern void MT_trace_irq_on(void);
  90. extern void MT_trace_irq_off(void);
  91. extern void MT_trace_preempt_on(void);
  92. extern void MT_trace_preempt_off(void);
  93. extern void MT_trace_check_preempt_dur(void);
  94. extern void MT_trace_raw_spin_lock_s(raw_spinlock_t *lock);
  95. extern void MT_trace_raw_spin_lock_e(raw_spinlock_t *lock);
  96. #else
  97. static inline void MT_trace_irq_on(void) {};
  98. static inline void MT_trace_irq_off(void) {};
  99. static inline void MT_trace_preempt_on(void) {};
  100. static inline void MT_trace_preempt_off(void) {};
  101. static inline void MT_trace_check_preempt_dur(void) {};
  102. static inline void MT_trace_raw_spin_lock_s(raw_spinlock_t *lock) {};
  103. static inline void MT_trace_raw_spin_lock_e(raw_spinlock_t *lock) {};
  104. #endif
  105. /* [IRQ-disable] White List
  106. * Flags for special scenario*/
  107. DECLARE_PER_CPU(int, MT_trace_in_sched);
  108. DECLARE_PER_CPU(int, MT_trace_in_resume_console);
  109. extern void mt_aee_dump_sched_traces(void);
  110. extern void mt_dump_sched_traces(void);
  111. DECLARE_PER_CPU(int, mtsched_mon_enabled);
  112. DECLARE_PER_CPU(unsigned long long, local_timer_ts);
  113. DECLARE_PER_CPU(unsigned long long, local_timer_te);
  114. #include <linux/sched.h>
  115. #define MON_STOP 0
  116. #define MON_START 1
  117. #define MON_RESET 2
  118. #ifdef CONFIG_MT_RT_THROTTLE_MON
  119. extern void save_mt_rt_mon_info(struct task_struct *p, unsigned long long ts);
  120. extern void end_mt_rt_mon_info(struct task_struct *p);
  121. extern void check_mt_rt_mon_info(struct task_struct *p);
  122. extern void mt_rt_mon_switch(int on);
  123. extern void mt_rt_mon_print_task(void);
  124. extern void mt_rt_mon_print_task_from_buffer(void);
  125. extern int mt_rt_mon_enable(void);
  126. #else
  127. static inline void
  128. save_mt_rt_mon_info(struct task_struct *p, unsigned long long ts) {};
  129. static inline void end_mt_rt_mon_info(struct task_struct *p) {};
  130. static inline void check_mt_rt_mon_info(struct task_struct *p) {};
  131. static inline void mt_rt_mon_switch(int on) {};
  132. static inline void mt_rt_mon_print_task(void) {};
  133. static inline void mt_rt_mon_print_task_from_buffer(void) {};
  134. static inline int mt_rt_mon_enable(void)
  135. {
  136. return 0;
  137. }
  138. #endif
  139. #endif /* _MT_SCHED_MON_H */