/* * trace binary printk * * Copyright (C) 2008 Lai Jiangshan * */ #include #include #include #include #include #include #include #include #include #include #include #include #include "trace.h" /* binary printk basic */ static DEFINE_MUTEX(btrace_mutex); static int btrace_metadata_count; static inline void lock_btrace(void) { mutex_lock(&btrace_mutex); } static inline void unlock_btrace(void) { mutex_unlock(&btrace_mutex); } static void get_btrace_metadata(void) { lock_btrace(); btrace_metadata_count++; unlock_btrace(); } static void put_btrace_metadata(void) { lock_btrace(); btrace_metadata_count--; unlock_btrace(); } /* events tracer */ int trace_bprintk_enable; static void start_bprintk_trace(struct trace_array *tr) { get_btrace_metadata(); tracing_reset_online_cpus(tr); trace_bprintk_enable = 1; } static void stop_bprintk_trace(struct trace_array *tr) { trace_bprintk_enable = 0; tracing_reset_online_cpus(tr); put_btrace_metadata(); } static int init_bprintk_trace(struct trace_array *tr) { start_bprintk_trace(tr); return 0; } static struct tracer bprintk_trace __read_mostly = { .name = "events", .init = init_bprintk_trace, .reset = stop_bprintk_trace, .start = start_bprintk_trace, .stop = stop_bprintk_trace, }; static __init int init_bprintk(void) { return register_tracer(&bprintk_trace); } device_initcall(init_bprintk);