tracing: A couple more updates
Steven Rostedt
maintainerIngo,
Please pull the latest tip/perf/core tree, which can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
tip/perf/core
Head SHA1: 8781915ad2716adcd8cd5cc52cee791fc8b00fdf
Ezequiel Garcia (1):
trace: Move trace event enable from fs_initcall to core_initcall
Mandeep Singh Baines (1):
tracing: Add an option for disabling markers
----
kernel/trace/trace.c | 6 ++- kernel/trace/trace.h | 1 + kernel/trace/trace_events.c | 108 +++++++++++++++++++++++++++-------------- kernel/trace/trace_syscalls.c | 2 +- 4 files changed, 79 insertions(+), 38 deletions(-)
Steven Rostedt
maintainerPATCH 1/2 tracing: Add an option for disabling markers
From: Mandeep Singh Baines <[email protected]>
In our application, we have trace markers spread through user-space. We have markers in GL, X, etc. These are super handy for Chrome's about:tracing feature (Chrome + system + kernel trace view), but can be very distracting when you're trying to debug a kernel issue.
I normally, use "grep -v tracing_mark_write" but it would be nice if I could just temporarily disable markers all together.
--- kernel/trace/trace.c | 6 +++++- kernel/trace/trace.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-)
kernel/trace/trace.c +5 -1
@@ -328,7 +328,7 @@ static DECLARE_WAIT_QUEUE_HEAD(trace_wait);unsigned long trace_flags =TRACE_ITER_PRINT_PARENT |TRACE_ITER_PRINTK |TRACE_ITER_ANNOTATE |TRACE_ITER_CONTEXT_INFO |TRACE_ITER_SLEEP_TIME |TRACE_ITER_GRAPH_TIME |TRACE_ITER_RECORD_CMD |TRACE_ITER_OVERWRITE | -TRACE_ITER_IRQ_INFO ; +TRACE_ITER_IRQ_INFO |TRACE_ITER_MARKERS ;static int trace_stop_count;static DEFINE_RAW_SPINLOCK (tracing_start_lock);
@@ -470,6 +470,7 @@ static const char *trace_options[] = {"overwrite" ,"disable_on_free" ,"irq-info" , +"markers" , NULL };
@@ -3886,6 +3887,9 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,if (tracing_disabled)return -EINVAL ; +if (!(trace_flags &TRACE_ITER_MARKERS )) +return -EINVAL ; +if (cnt >TRACE_BUF_SIZE ) cnt =TRACE_BUF_SIZE ;
kernel/trace/trace.h +1 -0
@@ -680,6 +680,7 @@ enum trace_iterator_flags {TRACE_ITER_OVERWRITE =0x200000 ,TRACE_ITER_STOP_ON_FREE =0x400000 ,TRACE_ITER_IRQ_INFO =0x800000 , + TRACE_ITER_MARKERS = 0x1000000, };/*
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 2/2 trace: Move trace event enable from fs_initcall to core_initcall
In reply to Steven RostedtFrom: Ezequiel Garcia <[email protected]>
This patch splits trace event initialization in two stages:
* ftrace enable
* sysfs event entry creation
This allows to capture trace events from an earlier point by using 'trace_event' kernel parameter and is important to trace boot-up allocations.
Note that, in order to enable events at core_initcall, it's necessary to move init_ftrace_syscalls() from core_initcall to early_initcall.
--- kernel/trace/trace_events.c | 108 +++++++++++++++++++++++++++-------------- kernel/trace/trace_syscalls.c | 2 +- 2 files changed, 73 insertions(+), 37 deletions(-)
kernel/trace/trace_events.c +72 -36
@@ -1199,6 +1199,31 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,return 0 ; } +static void event_remove (struct ftrace_event_call *call) +{ +ftrace_event_enable_disable (call,0 ); +if (call->event.funcs) +__unregister_ftrace_event (&call->event); +list_del (&call->list); +} + +static int event_init (struct ftrace_event_call *call) +{ +int ret =0 ; + +if (WARN_ON (!call->name)) +return -EINVAL ; + +if (call->class->raw_init) { + ret = call->class->raw_init (call); +if (ret <0 && ret != -ENOSYS ) +pr_warn ("Could not initialize trace events/%s\n" , + call->name); + } + +return ret; +} + static int __trace_add_event_call(struct ftrace_event_call *call, struct module *mod, const struct file_operations *id,
@@ -1209,19 +1234,9 @@ __trace_add_event_call(struct ftrace_event_call *call, struct module *mod,struct dentry *d_events;int ret; -/* The linker may leave blanks */ -if (!call->name) -return -EINVAL ; - -if (call->class->raw_init) { - ret = call->class->raw_init (call); -if (ret <0 ) { -if (ret != -ENOSYS ) -pr_warning ("Could not initialize trace events/%s\n" , - call->name); -return ret; - } - } + ret =event_init (call); +if (ret <0 ) +return ret; d_events =event_trace_events_dir ();if (!d_events)
@@ -1272,13 +1287,10 @@ static void remove_subsystem_dir(const char *name)*/ static void __trace_remove_event_call (struct ftrace_event_call *call) { -ftrace_event_enable_disable (call,0 ); -if (call->event.funcs) -__unregister_ftrace_event (&call->event); -debugfs_remove_recursive (call->dir); -list_del (&call->list); +event_remove (call);trace_destroy_fields (call);destroy_preds (call); +debugfs_remove_recursive (call->dir);remove_subsystem_dir (call->class->system); }
@@ -1450,15 +1462,43 @@ static __init int setup_trace_event(char *str) }__setup ("trace_event=" , setup_trace_event); +static __init int event_trace_enable (void ) +{ +struct ftrace_event_call **iter, *call; +char *buf = bootup_event_buf; +char *token; +int ret; + +for_each_event (iter, __start_ftrace_events, __stop_ftrace_events) { + + call = *iter; + ret =event_init (call); +if (!ret) +list_add (&call->list, &ftrace_events); + } + +while (true) { + token =strsep (&buf,"," ); + +if (!token) +break ; +if (!*token) +continue ; + + ret =ftrace_set_clr_event (token,1 ); +if (ret) +pr_warn ("Failed to enable trace event: %s\n" , token); + } +return 0 ; +} +static __init int event_trace_init (void ) { -struct ftrace_event_call **call; +struct ftrace_event_call *call;struct dentry *d_tracer;struct dentry *entry;struct dentry *d_events;int ret; -char *buf = bootup_event_buf; -char *token; d_tracer =tracing_init_dentry ();if (!d_tracer)
@@ -1497,24 +1537,19 @@ static __init int event_trace_init(void)if (trace_define_common_fields ())pr_warning ("tracing: Failed to allocate common fields" ); -for_each_event (call, __start_ftrace_events, __stop_ftrace_events) { -__trace_add_event_call (*call,NULL , &ftrace_event_id_fops, +/* +* Early initialization already enabled ftrace event. +* Now it's only necessary to create the event directory. +*/ +list_for_each_entry (call, &ftrace_events, list) { + + ret =event_create_dir (call, d_events, + &ftrace_event_id_fops, &ftrace_enable_fops, &ftrace_event_filter_fops, &ftrace_event_format_fops); - } - -while (true) { - token =strsep (&buf,"," ); - -if (!token) -break ; -if (!*token) -continue ; - - ret =ftrace_set_clr_event (token,1 ); -if (ret) -pr_warning ("Failed to enable trace event: %s\n" , token); +if (ret <0 ) +event_remove (call); } ret =register_module_notifier (&trace_module_nb);
@@ -1523,6 +1558,7 @@ static __init int event_trace_init(void)return 0 ; } +core_initcall (event_trace_enable);fs_initcall (event_trace_init);#ifdef CONFIG_FTRACE_STARTUP_TEST
kernel/trace/trace_syscalls.c +1 -1
@@ -487,7 +487,7 @@ int __init init_ftrace_syscalls(void)return 0 ; } -core_initcall (init_ftrace_syscalls); +early_initcall (init_ftrace_syscalls);#ifdef CONFIG_PERF_EVENTS
Signature · 1 line
1.7.10.4
Quoted 17 lines · Steven Rostedt
Ingo,
Please pull the latest tip/perf/core tree, which can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
tip/perf/coreHead SHA1:
8781915ad2716adcd8cd5cc52cee791fc8b00fdfEzequiel Garcia (1):
trace: Move trace event enable fromfs_initcalltocore_initcallMandeep Singh Baines (1):
tracing: Add an option for disabling markers
Quoted 6 lines
----
kernel/trace/trace.c | 6 ++- kernel/trace/trace.h | 1 + kernel/trace/trace_events.c | 108 +++++++++++++++++++++++++++-------------- kernel/trace/trace_syscalls.c | 2 +- 4 files changed, 79 insertions(+), 38 deletions(-)
Pulled, thanks Steve!
Ingo