]> git.karo-electronics.de Git - karo-tx-linux.git/blob - kernel/trace/trace_bprintk.c
1f8e532c3fb971d5c13da9473735009bf32ff344
[karo-tx-linux.git] / kernel / trace / trace_bprintk.c
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
20 #include "trace.h"
21
22 /* binary printk basic */
23 static DEFINE_MUTEX(btrace_mutex);
24 static int btrace_metadata_count;
25
26 static inline void lock_btrace(void)
27 {
28         mutex_lock(&btrace_mutex);
29 }
30
31 static inline void unlock_btrace(void)
32 {
33         mutex_unlock(&btrace_mutex);
34 }
35
36 static void get_btrace_metadata(void)
37 {
38         lock_btrace();
39         btrace_metadata_count++;
40         unlock_btrace();
41 }
42
43 static void put_btrace_metadata(void)
44 {
45         lock_btrace();
46         btrace_metadata_count--;
47         unlock_btrace();
48 }
49
50 /* events tracer */
51 int trace_bprintk_enable;
52
53 static void start_bprintk_trace(struct trace_array *tr)
54 {
55         get_btrace_metadata();
56         tracing_reset_online_cpus(tr);
57         trace_bprintk_enable = 1;
58 }
59
60 static void stop_bprintk_trace(struct trace_array *tr)
61 {
62         trace_bprintk_enable = 0;
63         tracing_reset_online_cpus(tr);
64         put_btrace_metadata();
65 }
66
67 static int init_bprintk_trace(struct trace_array *tr)
68 {
69         start_bprintk_trace(tr);
70         return 0;
71 }
72
73 static struct tracer bprintk_trace __read_mostly =
74 {
75         .name        = "events",
76         .init        = init_bprintk_trace,
77         .reset       = stop_bprintk_trace,
78         .start       = start_bprintk_trace,
79         .stop        = stop_bprintk_trace,
80 };
81
82 static __init int init_bprintk(void)
83 {
84         return register_tracer(&bprintk_trace);
85 }
86
87 device_initcall(init_bprintk);