tracing: Updates for 3.16
Subsystems (3)
Steven Rostedt
maintainercover tracing: Updates for 3.16
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
for-next
Head SHA1: b1169cc69ba96b124df820904a6d3eb775491d7f
Jiaxing Wang (2):
tracing/stack_trace: Skip 4 instead of 3 when using ftrace_ops_list_func
tracing: Fix documentation of ftrace_set_global_{filter,notrace}()
Steven Rostedt (Red Hat) (2):
tracing: Break out of tracing_wait_pipe() before wait_pipe() is called
tracing: Remove mock up poll wait function
----
kernel/trace/ftrace.c | 11 +++++---- kernel/trace/trace.c | 45 ++++++++++-------------------------- kernel/trace/trace.h | 5 +--- kernel/trace/trace_functions.c | 1 - kernel/trace/trace_functions_graph.c | 1 - kernel/trace/trace_nop.c | 1 - kernel/trace/trace_sched_wakeup.c | 2 -- kernel/trace/trace_stack.c | 8 +++++-- 8 files changed, 26 insertions(+), 48 deletions(-)
Steven Rostedt
maintainerPATCH 1/4 tracing/stack_trace: Skip 4 instead of 3 when using ftrace_ops_list_func
From: Jiaxing Wang <[email protected]>
When using ftrace_ops_list_func, we should skip 4 instead of 3, to avoid ftrace_call+0x5/0xb appearing in the stack trace:
Depth Size Location (110 entries)
----- ---- --------
0) 2956 0 update_curr+0xe/0x1e0
1) 2956 68 ftrace_call+0x5/0xb
2) 2888 92 enqueue_entity+0x53/0xe80
3) 2796 80 enqueue_task_fair+0x47/0x7e0
4) 2716 28 enqueue_task+0x45/0x70
5) 2688 12 activate_task+0x22/0x30Add a function using_ftrace_ops_list_func() to test for this while keeping ftrace_ops_list_func to remain static.
--- kernel/trace/ftrace.c | 5 +++++ kernel/trace/trace.h | 1 + kernel/trace/trace_stack.c | 8 ++++++-- 3 files changed, 12 insertions(+), 2 deletions(-)
kernel/trace/ftrace.c +5 -0
@@ -313,6 +313,11 @@ static void update_ftrace_function(void) ftrace_trace_function = func; } +int using_ftrace_ops_list_func (void ) +{ +return ftrace_trace_function == ftrace_ops_list_func; +} +static void add_ftrace_ops (struct ftrace_ops **list,struct ftrace_ops *ops) { ops->next = *list;
kernel/trace/trace.h +1 -0
@@ -830,6 +830,7 @@ void ftrace_destroy_function_files(struct trace_array *tr);void ftrace_init_global_array_ops (struct trace_array *tr);void ftrace_init_array_ops (struct trace_array *tr,ftrace_func_t func);void ftrace_reset_array_ops (struct trace_array *tr); +int using_ftrace_ops_list_func (void );#else static inline int ftrace_trace_task (struct task_struct *task) {
kernel/trace/trace_stack.c +6 -2
@@ -85,8 +85,12 @@ check_stack(unsigned long ip, unsigned long *stack) max_stack_size = this_size; - max_stack_trace.nr_entries =0 ; - max_stack_trace.skip =3 ; + max_stack_trace.nr_entries =0 ; + +if (using_ftrace_ops_list_func ()) + max_stack_trace.skip =4 ; +else + max_stack_trace.skip =3 ;save_stack_trace (&max_stack_trace);
Signature · 1 line
1.8.5.3
Steven Rostedt
maintainerPATCH 2/4 tracing: Fix documentation of ftrace_set_global_{filter,notrace}()
In reply to Steven RostedtFrom: Jiaxing Wang <[email protected]>
The functions ftrace_set_global_filter() and ftrace_set_global_notrace() still have their old names in the kernel doc (ftrace_set_filter and ftrace_set_notrace respectively). Replace these with the real names.
--- kernel/trace/ftrace.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
kernel/trace/ftrace.c +2 -4
@@ -3542,8 +3542,7 @@ int ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf, }EXPORT_SYMBOL_GPL (ftrace_set_notrace);/** -* ftrace_set_filter - set a function to filter on in ftrace -* @ops - the ops to set the filter with +* ftrace_set_global_filter - set a function to filter on with global tracers * @buf - the string that holds the function filter text. * @len - the length of the string. * @reset - non zero to reset all filters before applying this filter.
@@ -3558,8 +3557,7 @@ void ftrace_set_global_filter(unsigned char *buf, int len, int reset)EXPORT_SYMBOL_GPL (ftrace_set_global_filter);/** -* ftrace_set_notrace - set a function to not trace in ftrace -* @ops - the ops to set the notrace filter with +* ftrace_set_global_notrace - set a function to not trace with global tracers * @buf - the string that holds the function notrace text. * @len - the length of the string. * @reset - non zero to reset all filters before applying this filter.
Signature · 1 line
1.8.5.3
Steven Rostedt
maintainerPATCH 3/4 tracing: Break out of tracing_wait_pipe() before wait_pipe() is called
In reply to Steven RostedtFrom: "Steven Rostedt (Red Hat)" <[email protected]>
When reading from trace_pipe, if tracing is off but nothing was read it should block. If something is read and tracing is off, then EOF is returned. If tracing is on and there's nothing to read, it will block.
But because the check of whether tracing is off and something was read is done after the block on the pipe, it is hit or miss if the EOF is returned or not leading to inconsistent behavior.
--- kernel/trace/trace.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
kernel/trace/trace.c +9 -9
@@ -4237,15 +4237,6 @@ static int tracing_wait_pipe(struct file *filp)return -EAGAIN ; } -mutex_unlock (&iter->mutex); - - iter->trace->wait_pipe (iter); - -mutex_lock (&iter->mutex); - -if (signal_pending (current)) -return -EINTR ; -/* * We block until we read something and tracing is disabled. * We still block if tracing is disabled, but we have never
@@ -4257,6 +4248,15 @@ static int tracing_wait_pipe(struct file *filp)*/ if (!tracing_is_on () && iter->pos)break ; + +mutex_unlock (&iter->mutex); + + iter->trace->wait_pipe (iter); + +mutex_lock (&iter->mutex); + +if (signal_pending (current)) +return -EINTR ; }return 1 ;
Signature · 1 line
1.8.5.3
Steven Rostedt
maintainerPATCH 4/4 tracing: Remove mock up poll wait function
In reply to Steven RostedtFrom: "Steven Rostedt (Red Hat)" <[email protected]>
Now that the ring buffer has a built in way to wake up readers when there's data, using irq_work such that it is safe to do it in any context. But it was still using the old "poor man's" wait polling that checks every 1/10 of a second to see if it should wake up a waiter. This makes the latency for a wake up excruciatingly long. No need to do that anymore.
Completely remove the different wait_poll types from the tracers and have them all use the default one now.
--- kernel/trace/trace.c | 29 ++++------------------------- kernel/trace/trace.h | 4 ---- kernel/trace/trace_functions.c | 1 - kernel/trace/trace_functions_graph.c | 1 - kernel/trace/trace_nop.c | 1 - kernel/trace/trace_sched_wakeup.c | 2 -- 6 files changed, 4 insertions(+), 34 deletions(-)
kernel/trace/trace.c +4 -25
@@ -1085,7 +1085,7 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu) }#endif /* CONFIG_TRACER_MAX_TRACE */ -static void default_wait_pipe (struct trace_iterator *iter) +static void wait_on_pipe (struct trace_iterator *iter) {/* Iterators are static, they should be filled or empty */ if (trace_buffer_iter (iter, iter->cpu_file))
@@ -1202,8 +1202,6 @@ int register_tracer(struct tracer *type)else if (!type->flags->opts) type->flags->opts = dummy_tracer_opt; -if (!type->wait_pipe) - type->wait_pipe = default_wait_pipe; ret =run_tracer_selftest (type);if (ret <0 )
@@ -4207,25 +4205,6 @@ tracing_poll_pipe(struct file *filp, poll_table *poll_table)return trace_poll (iter, filp, poll_table); } -/* -* This is a make-shift waitqueue. -* A tracer might use this callback on some rare cases: -* -* 1) the current tracer might hold the runqueue lock when it wakes up -* a reader, hence a deadlock (sched, function, and function graph tracers) -* 2) the function tracers, trace all functions, we don't want -* the overhead of calling wake_up and friends -* (and tracing them too) -* -* Anyway, this is really very primitive wakeup. -*/ -void poll_wait_pipe (struct trace_iterator *iter) -{ -set_current_state (TASK_INTERRUPTIBLE ); -/* sleep for 100 msecs, and try again. */ -schedule_timeout (HZ /10 ); -} -/* Must be called with trace_types_lock mutex held. */ static int tracing_wait_pipe (struct file *filp) {
@@ -4251,7 +4230,7 @@ static int tracing_wait_pipe(struct file *filp)mutex_unlock (&iter->mutex); - iter->trace->wait_pipe (iter); +wait_on_pipe (iter);mutex_lock (&iter->mutex);
@@ -5179,7 +5158,7 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, goto out_unlock; }mutex_unlock (&trace_types_lock); - iter->trace->wait_pipe (iter); +wait_on_pipe (iter);mutex_lock (&trace_types_lock);if (signal_pending (current)) { size = -EINTR ;
@@ -5390,7 +5369,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, goto out; }mutex_unlock (&trace_types_lock); - iter->trace->wait_pipe (iter); +wait_on_pipe (iter);mutex_lock (&trace_types_lock);if (signal_pending (current)) { ret = -EINTR ;
kernel/trace/trace.h +0 -4
@@ -338,7 +338,6 @@ struct tracer_flags {* @stop: called when tracing is paused (echo 0 > tracing_enabled) * @open: called when the trace file is opened * @pipe_open: called when the trace_pipe file is opened -* @wait_pipe: override how the user waits for traces on trace_pipe * @close: called when the trace file is released * @pipe_close: called when the trace_pipe file is released * @read: override the default read callback on trace_pipe
@@ -357,7 +356,6 @@ struct tracer {void (*stop)(struct trace_array *tr);void (*open)(struct trace_iterator *iter);void (*pipe_open)(struct trace_iterator *iter); -void (*wait_pipe)(struct trace_iterator *iter);void (*close)(struct trace_iterator *iter);void (*pipe_close)(struct trace_iterator *iter); ssize_t (*read)(struct trace_iterator *iter,
@@ -566,8 +564,6 @@ void trace_init_global_iter(struct trace_iterator *iter);void tracing_iter_reset (struct trace_iterator *iter,int cpu); -void poll_wait_pipe (struct trace_iterator *iter); - void tracing_sched_switch_trace(struct trace_array *tr, struct task_struct *prev, struct task_struct *next,
kernel/trace/trace_functions.c +0 -1
@@ -252,7 +252,6 @@ static struct tracer function_trace __tracer_data = .init = function_trace_init, .reset = function_trace_reset, .start = function_trace_start, - .wait_pipe = poll_wait_pipe, .flags = &func_flags, .set_flag = func_set_flag, .allow_instances = true,
kernel/trace/trace_functions_graph.c +0 -1
@@ -1505,7 +1505,6 @@ static struct tracer graph_trace __tracer_data = { .pipe_open = graph_trace_open, .close = graph_trace_close, .pipe_close = graph_trace_close, - .wait_pipe = poll_wait_pipe, .init = graph_trace_init, .reset = graph_trace_reset, .print_line = print_graph_function,
kernel/trace/trace_nop.c +0 -1
@@ -91,7 +91,6 @@ struct tracer nop_trace __read_mostly = .name = "nop", .init = nop_trace_init, .reset = nop_trace_reset, - .wait_pipe = poll_wait_pipe,#ifdef CONFIG_FTRACE_SELFTEST .selftest = trace_selftest_startup_nop,#endif
kernel/trace/trace_sched_wakeup.c +0 -2
@@ -705,7 +705,6 @@ static struct tracer wakeup_rt_tracer __read_mostly = .reset = wakeup_tracer_reset, .start = wakeup_tracer_start, .stop = wakeup_tracer_stop, - .wait_pipe = poll_wait_pipe, .print_max = true, .print_header = wakeup_print_header, .print_line = wakeup_print_line,
@@ -728,7 +727,6 @@ static struct tracer wakeup_dl_tracer __read_mostly = .reset = wakeup_tracer_reset, .start = wakeup_tracer_start, .stop = wakeup_tracer_stop, - .wait_pipe = poll_wait_pipe, .print_max = true, .print_header = wakeup_print_header, .print_line = wakeup_print_line,
Signature · 1 line
1.8.5.3