trace_bprintk.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * trace binary printk
  3. *
  4. * Copyright (C) 2008 Lai Jiangshan <laijs@cn.fujitsu.com>
  5. *
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/ftrace.h>
  9. #include <linux/string.h>
  10. #include <linux/ctype.h>
  11. #include <linux/list.h>
  12. #include <linux/mutex.h>
  13. #include <linux/slab.h>
  14. #include <linux/module.h>
  15. #include <linux/seq_file.h>
  16. #include <linux/fs.h>
  17. #include <linux/marker.h>
  18. #include <linux/uaccess.h>
  19. #include "trace.h"
  20. /* binary printk basic */
  21. static DEFINE_MUTEX(btrace_mutex);
  22. static int btrace_metadata_count;
  23. static inline void lock_btrace(void)
  24. {
  25. mutex_lock(&btrace_mutex);
  26. }
  27. static inline void unlock_btrace(void)
  28. {
  29. mutex_unlock(&btrace_mutex);
  30. }
  31. static void get_btrace_metadata(void)
  32. {
  33. lock_btrace();
  34. btrace_metadata_count++;
  35. unlock_btrace();
  36. }
  37. static void put_btrace_metadata(void)
  38. {
  39. lock_btrace();
  40. btrace_metadata_count--;
  41. unlock_btrace();
  42. }
  43. /* events tracer */
  44. int trace_bprintk_enable;
  45. static void start_bprintk_trace(struct trace_array *tr)
  46. {
  47. get_btrace_metadata();
  48. tracing_reset_online_cpus(tr);
  49. trace_bprintk_enable = 1;
  50. }
  51. static void stop_bprintk_trace(struct trace_array *tr)
  52. {
  53. trace_bprintk_enable = 0;
  54. tracing_reset_online_cpus(tr);
  55. put_btrace_metadata();
  56. }
  57. static int init_bprintk_trace(struct trace_array *tr)
  58. {
  59. start_bprintk_trace(tr);
  60. return 0;
  61. }
  62. static struct tracer bprintk_trace __read_mostly =
  63. {
  64. .name = "events",
  65. .init = init_bprintk_trace,
  66. .reset = stop_bprintk_trace,
  67. .start = start_bprintk_trace,
  68. .stop = stop_bprintk_trace,
  69. };
  70. static __init int init_bprintk(void)
  71. {
  72. return register_tracer(&bprintk_trace);
  73. }
  74. device_initcall(init_bprintk);