* [for-next][PATCH 0/4] tracing: Updates for 3.16
@ 2014-04-30 12:41 Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 1/4] tracing/stack_trace: Skip 4 instead of 3 when using ftrace_ops_list_func Steven Rostedt
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Steven Rostedt @ 2014-04-30 12:41 UTC (permalink / raw)
To: linux-kernel; +Cc: Ingo Molnar, Frederic Weisbecker, Andrew Morton
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(-)
^ permalink raw reply [flat|nested] 5+ messages in thread
* [for-next][PATCH 1/4] tracing/stack_trace: Skip 4 instead of 3 when using ftrace_ops_list_func
2014-04-30 12:41 [for-next][PATCH 0/4] tracing: Updates for 3.16 Steven Rostedt
@ 2014-04-30 12:41 ` Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 2/4] tracing: Fix documentation of ftrace_set_global_{filter,notrace}() Steven Rostedt
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Steven Rostedt @ 2014-04-30 12:41 UTC (permalink / raw)
To: linux-kernel
Cc: Ingo Molnar, Frederic Weisbecker, Andrew Morton, Jiaxing Wang
[-- Attachment #1: 0001-tracing-stack_trace-Skip-4-instead-of-3-when-using-f.patch --]
[-- Type: text/plain, Size: 2524 bytes --]
From: Jiaxing Wang <wangjiaxing@insigma.com.cn>
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/0x30
Add a function using_ftrace_ops_list_func() to test for this while keeping
ftrace_ops_list_func to remain static.
Link: http://lkml.kernel.org/p/1398006644-5935-2-git-send-email-wangjiaxing@insigma.com.cn
Signed-off-by: Jiaxing Wang <wangjiaxing@insigma.com.cn>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/trace/ftrace.c | 5 +++++
kernel/trace/trace.h | 1 +
kernel/trace/trace_stack.c | 8 ++++++--
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 846888e..3cfeb66 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -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;
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 5d2f07d..8624b50 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -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)
{
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
index 21b320e..5aa9a5b 100644
--- a/kernel/trace/trace_stack.c
+++ b/kernel/trace/trace_stack.c
@@ -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);
--
1.8.5.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [for-next][PATCH 2/4] tracing: Fix documentation of ftrace_set_global_{filter,notrace}()
2014-04-30 12:41 [for-next][PATCH 0/4] tracing: Updates for 3.16 Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 1/4] tracing/stack_trace: Skip 4 instead of 3 when using ftrace_ops_list_func Steven Rostedt
@ 2014-04-30 12:41 ` Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 3/4] tracing: Break out of tracing_wait_pipe() before wait_pipe() is called Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 4/4] tracing: Remove mock up poll wait function Steven Rostedt
3 siblings, 0 replies; 5+ messages in thread
From: Steven Rostedt @ 2014-04-30 12:41 UTC (permalink / raw)
To: linux-kernel
Cc: Ingo Molnar, Frederic Weisbecker, Andrew Morton, Jiaxing Wang
[-- Attachment #1: 0002-tracing-Fix-documentation-of-ftrace_set_global_-filt.patch --]
[-- Type: text/plain, Size: 1704 bytes --]
From: Jiaxing Wang <wangjiaxing@insigma.com.cn>
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.
Link: http://lkml.kernel.org/p/1398006644-5935-3-git-send-email-wangjiaxing@insigma.com.cn
Signed-off-by: Jiaxing Wang <wangjiaxing@insigma.com.cn>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/trace/ftrace.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 3cfeb66..34b098bf 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -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.
--
1.8.5.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [for-next][PATCH 3/4] tracing: Break out of tracing_wait_pipe() before wait_pipe() is called
2014-04-30 12:41 [for-next][PATCH 0/4] tracing: Updates for 3.16 Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 1/4] tracing/stack_trace: Skip 4 instead of 3 when using ftrace_ops_list_func Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 2/4] tracing: Fix documentation of ftrace_set_global_{filter,notrace}() Steven Rostedt
@ 2014-04-30 12:41 ` Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 4/4] tracing: Remove mock up poll wait function Steven Rostedt
3 siblings, 0 replies; 5+ messages in thread
From: Steven Rostedt @ 2014-04-30 12:41 UTC (permalink / raw)
To: linux-kernel; +Cc: Ingo Molnar, Frederic Weisbecker, Andrew Morton
[-- Attachment #1: 0003-tracing-Break-out-of-tracing_wait_pipe-before-wait_p.patch --]
[-- Type: text/plain, Size: 1445 bytes --]
From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org>
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.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/trace/trace.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index cb41e98..e058c60 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -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;
--
1.8.5.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [for-next][PATCH 4/4] tracing: Remove mock up poll wait function
2014-04-30 12:41 [for-next][PATCH 0/4] tracing: Updates for 3.16 Steven Rostedt
` (2 preceding siblings ...)
2014-04-30 12:41 ` [for-next][PATCH 3/4] tracing: Break out of tracing_wait_pipe() before wait_pipe() is called Steven Rostedt
@ 2014-04-30 12:41 ` Steven Rostedt
3 siblings, 0 replies; 5+ messages in thread
From: Steven Rostedt @ 2014-04-30 12:41 UTC (permalink / raw)
To: linux-kernel
Cc: Ingo Molnar, Frederic Weisbecker, Andrew Morton, Johannes Berg
[-- Attachment #1: 0004-tracing-Remove-mock-up-poll-wait-function.patch --]
[-- Type: text/plain, Size: 6872 bytes --]
From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org>
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.
Reported-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
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(-)
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index e058c60..4c392c8 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -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;
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 8624b50..3b3e09e 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -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,
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c
index 2d9482b..57f0ec9 100644
--- a/kernel/trace/trace_functions.c
+++ b/kernel/trace/trace_functions.c
@@ -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,
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
index deff112..b86dd4d 100644
--- a/kernel/trace/trace_functions_graph.c
+++ b/kernel/trace/trace_functions_graph.c
@@ -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,
diff --git a/kernel/trace/trace_nop.c b/kernel/trace/trace_nop.c
index 69a5cc9..fcf0a9e 100644
--- a/kernel/trace/trace_nop.c
+++ b/kernel/trace/trace_nop.c
@@ -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
diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c
index 1573c03..19bd892 100644
--- a/kernel/trace/trace_sched_wakeup.c
+++ b/kernel/trace/trace_sched_wakeup.c
@@ -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,
--
1.8.5.3
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-04-30 12:43 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-04-30 12:41 [for-next][PATCH 0/4] tracing: Updates for 3.16 Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 1/4] tracing/stack_trace: Skip 4 instead of 3 when using ftrace_ops_list_func Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 2/4] tracing: Fix documentation of ftrace_set_global_{filter,notrace}() Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 3/4] tracing: Break out of tracing_wait_pipe() before wait_pipe() is called Steven Rostedt
2014-04-30 12:41 ` [for-next][PATCH 4/4] tracing: Remove mock up poll wait function Steven Rostedt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®