trace_sched_switch.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * trace context switch
  4. *
  5. * Copyright (C) 2007 Steven Rostedt <srostedt@redhat.com>
  6. *
  7. */
  8. #include <linux/module.h>
  9. #include <linux/kallsyms.h>
  10. #include <linux/uaccess.h>
  11. #include <linux/ftrace.h>
  12. #include <trace/events/sched.h>
  13. #include "trace.h"
  14. #define RECORD_CMDLINE 1
  15. #define RECORD_TGID 2
  16. static int sched_cmdline_ref;
  17. static int sched_tgid_ref;
  18. static DEFINE_MUTEX(sched_register_mutex);
  19. static void
  20. probe_sched_switch(void *ignore, bool preempt,
  21. struct task_struct *prev, struct task_struct *next)
  22. {
  23. int flags;
  24. flags = (RECORD_TGID * !!sched_tgid_ref) +
  25. (RECORD_CMDLINE * !!sched_cmdline_ref);
  26. if (!flags)
  27. return;
  28. tracing_record_taskinfo_sched_switch(prev, next, flags);
  29. }
  30. static void
  31. probe_sched_wakeup(void *ignore, struct task_struct *wakee)
  32. {
  33. int flags;
  34. flags = (RECORD_TGID * !!sched_tgid_ref) +
  35. (RECORD_CMDLINE * !!sched_cmdline_ref);
  36. if (!flags)
  37. return;
  38. tracing_record_taskinfo(current, flags);
  39. }
  40. static int tracing_sched_register(void)
  41. {
  42. int ret;
  43. ret = register_trace_sched_wakeup(probe_sched_wakeup, NULL);
  44. if (ret) {
  45. pr_info("wakeup trace: Couldn't activate tracepoint"
  46. " probe to kernel_sched_wakeup\n");
  47. return ret;
  48. }
  49. ret = register_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
  50. if (ret) {
  51. pr_info("wakeup trace: Couldn't activate tracepoint"
  52. " probe to kernel_sched_wakeup_new\n");
  53. goto fail_deprobe;
  54. }
  55. ret = register_trace_sched_switch(probe_sched_switch, NULL);
  56. if (ret) {
  57. pr_info("sched trace: Couldn't activate tracepoint"
  58. " probe to kernel_sched_switch\n");
  59. goto fail_deprobe_wake_new;
  60. }
  61. return ret;
  62. fail_deprobe_wake_new:
  63. unregister_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
  64. fail_deprobe:
  65. unregister_trace_sched_wakeup(probe_sched_wakeup, NULL);
  66. return ret;
  67. }
  68. static void tracing_sched_unregister(void)
  69. {
  70. unregister_trace_sched_switch(probe_sched_switch, NULL);
  71. unregister_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
  72. unregister_trace_sched_wakeup(probe_sched_wakeup, NULL);
  73. }
  74. static void tracing_start_sched_switch(int ops)
  75. {
  76. bool sched_register;
  77. mutex_lock(&sched_register_mutex);
  78. sched_register = (!sched_cmdline_ref && !sched_tgid_ref);
  79. switch (ops) {
  80. case RECORD_CMDLINE:
  81. sched_cmdline_ref++;
  82. break;
  83. case RECORD_TGID:
  84. sched_tgid_ref++;
  85. break;
  86. }
  87. if (sched_register && (sched_cmdline_ref || sched_tgid_ref))
  88. tracing_sched_register();
  89. mutex_unlock(&sched_register_mutex);
  90. }
  91. static void tracing_stop_sched_switch(int ops)
  92. {
  93. mutex_lock(&sched_register_mutex);
  94. switch (ops) {
  95. case RECORD_CMDLINE:
  96. sched_cmdline_ref--;
  97. break;
  98. case RECORD_TGID:
  99. sched_tgid_ref--;
  100. break;
  101. }
  102. if (!sched_cmdline_ref && !sched_tgid_ref)
  103. tracing_sched_unregister();
  104. mutex_unlock(&sched_register_mutex);
  105. }
  106. void tracing_start_cmdline_record(void)
  107. {
  108. tracing_start_sched_switch(RECORD_CMDLINE);
  109. }
  110. void tracing_stop_cmdline_record(void)
  111. {
  112. tracing_stop_sched_switch(RECORD_CMDLINE);
  113. }
  114. void tracing_start_tgid_record(void)
  115. {
  116. tracing_start_sched_switch(RECORD_TGID);
  117. }
  118. void tracing_stop_tgid_record(void)
  119. {
  120. tracing_stop_sched_switch(RECORD_TGID);
  121. }