trace_functions.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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->data[cpu]);
  23. }
  24. static void start_function_trace(struct trace_array *tr)
  25. {
  26. function_reset(tr);
  27. tracing_start_function_trace();
  28. }
  29. static void stop_function_trace(struct trace_array *tr)
  30. {
  31. tracing_stop_function_trace();
  32. }
  33. static void function_trace_init(struct trace_array *tr)
  34. {
  35. if (tr->ctrl)
  36. start_function_trace(tr);
  37. }
  38. static void function_trace_reset(struct trace_array *tr)
  39. {
  40. if (tr->ctrl)
  41. stop_function_trace(tr);
  42. }
  43. static void function_trace_ctrl_update(struct trace_array *tr)
  44. {
  45. if (tr->ctrl)
  46. start_function_trace(tr);
  47. else
  48. stop_function_trace(tr);
  49. }
  50. static struct tracer function_trace __read_mostly =
  51. {
  52. .name = "ftrace",
  53. .init = function_trace_init,
  54. .reset = function_trace_reset,
  55. .ctrl_update = function_trace_ctrl_update,
  56. #ifdef CONFIG_FTRACE_SELFTEST
  57. .selftest = trace_selftest_startup_function,
  58. #endif
  59. };
  60. static __init int init_function_trace(void)
  61. {
  62. return register_tracer(&function_trace);
  63. }
  64. device_initcall(init_function_trace);