trace_functions.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * ring buffer based function tracer
  3. *
  4. * Copyright (C) 2007-2008 Steven Rostedt <srostedt@redhat.com>
  5. * Copyright (C) 2008 Ingo Molnar <mingo@redhat.com>
  6. *
  7. * Based on code from the latency_tracer, that is:
  8. *
  9. * Copyright (C) 2004-2006 Ingo Molnar
  10. * Copyright (C) 2004 William Lee Irwin III
  11. */
  12. #include <linux/debugfs.h>
  13. #include <linux/uaccess.h>
  14. #include <linux/ftrace.h>
  15. #include <linux/fs.h>
  16. #include "trace.h"
  17. static void function_reset(struct trace_array *tr)
  18. {
  19. int cpu;
  20. tr->time_start = ftrace_now(tr->cpu);
  21. for_each_online_cpu(cpu)
  22. tracing_reset(tr, cpu);
  23. }
  24. static void start_function_trace(struct trace_array *tr)
  25. {
  26. tr->cpu = get_cpu();
  27. function_reset(tr);
  28. put_cpu();
  29. tracing_start_cmdline_record();
  30. tracing_start_function_trace();
  31. }
  32. static void stop_function_trace(struct trace_array *tr)
  33. {
  34. tracing_stop_function_trace();
  35. tracing_stop_cmdline_record();
  36. }
  37. static void function_trace_init(struct trace_array *tr)
  38. {
  39. if (tr->ctrl)
  40. start_function_trace(tr);
  41. }
  42. static void function_trace_reset(struct trace_array *tr)
  43. {
  44. if (tr->ctrl)
  45. stop_function_trace(tr);
  46. }
  47. static void function_trace_ctrl_update(struct trace_array *tr)
  48. {
  49. if (tr->ctrl)
  50. start_function_trace(tr);
  51. else
  52. stop_function_trace(tr);
  53. }
  54. static struct tracer function_trace __read_mostly =
  55. {
  56. .name = "ftrace",
  57. .init = function_trace_init,
  58. .reset = function_trace_reset,
  59. .ctrl_update = function_trace_ctrl_update,
  60. #ifdef CONFIG_FTRACE_SELFTEST
  61. .selftest = trace_selftest_startup_function,
  62. #endif
  63. };
  64. static __init int init_function_trace(void)
  65. {
  66. return register_tracer(&function_trace);
  67. }
  68. device_initcall(init_function_trace);