Skip to contentSkip to conversation

tracing: Minor fixes for 4.14 (and stable)

GIT PULL New Steven Rostedt 1 participant 4 messages Sep 20, 2017

Subsystems (3)
lore
Share & tools
lore

Steven Rostedt

author maintainer
#0 lore raw

Linus,

This includes 3 minor fixes.

- Have writing to trace file clear the irqsoff (and friends) tracer

- trace_pipe behavior for instance buffers was different than top buffer

- Show a message of why mmiotrace doesn't start from commandline

Please pull the latest trace-v4.14-rc1 tree, which can be found at:

git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
trace-v4.14-rc1

Tag SHA1: cd68d5e5af1d4b58d32f937d7a59d15e88de3e4e Head SHA1: 75df6e688ccd517e339a7c422ef7ad73045b18a2

Bo Yan (1):
tracing: Erase irqsoff trace with empty write

Tahsin Erdogan (1):
tracing: Fix trace_pipe behavior for instance traces

Ziqian SUN (Zamir) (1):
tracing: Ignore mmiotrace from kernel commandline

----

 kernel/trace/trace.c           | 19 ++++++++++++++++---
 kernel/trace/trace.h           |  2 ++
 kernel/trace/trace_mmiotrace.c |  1 +
 3 files changed, 19 insertions(+), 3 deletions(-)
author maintainer
#1 lore raw

PATCH 1/3 tracing: Erase irqsoff trace with empty write

From: Bo Yan <[email protected]>

One convenient way to erase trace is "echo > trace". However, this is currently broken if the current tracer is irqsoff tracer. This is because irqsoff tracer use max_buffer as the default trace buffer.

Set the max_buffer as the one to be cleared when it's the trace buffer currently in use.

Fixes 4acd4d00f ("tracing: give easy way to clear trace buffer")
---
 kernel/trace/trace.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
kernel/trace/trace.c +8 -2
index 5360b7aec57a..a7fb136da891 100644
@@ -4020,11 +4020,17 @@ static int tracing_open(struct inode *inode, struct file *file)
 	/* If this file was open for write, then erase contents */
 	if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
 		int cpu = tracing_get_cpu(inode);
+		struct trace_buffer *trace_buf = &tr->trace_buffer;
+
+#ifdef CONFIG_TRACER_MAX_TRACE
+		if (tr->current_trace->print_max)
+			trace_buf = &tr->max_buffer;
+#endif
 
 		if (cpu == RING_BUFFER_ALL_CPUS)
-			tracing_reset_online_cpus(&tr->trace_buffer);
+			tracing_reset_online_cpus(trace_buf);
 		else
-			tracing_reset(&tr->trace_buffer, cpu);
+			tracing_reset(trace_buf, cpu);
 	}
 
 	if (file->f_mode & FMODE_READ) {
Signature · 1 line
2.13.2
author maintainer
#2 lore raw

PATCH 2/3 tracing: Ignore mmiotrace from kernel commandline

In reply to Steven Rostedt

From: "Ziqian SUN (Zamir)" <[email protected]>

The mmiotrace tracer cannot be enabled with ftrace=mmiotrace in kernel commandline. With this patch, noboot is added to the tracer struct, and when system boot with a tracer that has noboot=true, it will print out a warning message and continue booting.

---
 kernel/trace/trace.c           | 7 +++++++
 kernel/trace/trace.h           | 2 ++
 kernel/trace/trace_mmiotrace.c | 1 +
 3 files changed, 10 insertions(+)
kernel/trace/trace.c +7 -0
index a7fb136da891..d3ca35f38803 100644
@@ -5364,6 +5364,13 @@ static int tracing_set_tracer(struct trace_array *tr, const char *buf)
 	if (t == tr->current_trace)
 		goto out;
 
+	/* Some tracers won't work on kernel command line */
+	if (system_state < SYSTEM_RUNNING && t->noboot) {
+		pr_warn("Tracer '%s' is not allowed on command line, ignored\n",
+			t->name);
+		goto out;
+	}
+
 	/* Some tracers are only allowed for the top level buffer */
 	if (!trace_ok_for_array(t, tr)) {
 		ret = -EINVAL;
kernel/trace/trace.h +2 -0
index fb5d54d0d1b3..652c682707cd 100644
@@ -444,6 +444,8 @@ struct tracer {
 #ifdef CONFIG_TRACER_MAX_TRACE
 	bool			use_max_tr;
 #endif
+	/* True if tracer cannot be enabled in kernel param */
+	bool			noboot;
 };
 
 
kernel/trace/trace_mmiotrace.c +1 -0
index cd7480d0a201..dca78fc48439 100644
@@ -282,6 +282,7 @@ static struct tracer mmio_tracer __read_mostly =
 	.close		= mmio_close,
 	.read		= mmio_read,
 	.print_line	= mmio_print_line,
+	.noboot		= true,
 };
 
 __init static int init_mmio_trace(void)
Signature · 1 line
2.13.2
author maintainer
#3 lore raw

PATCH 3/3 tracing: Fix trace_pipe behavior for instance traces

In reply to Steven Rostedt

From: Tahsin Erdogan <[email protected]>

When reading data from trace_pipe, tracing_wait_pipe() performs a check to see if tracing has been turned off after some data was read. Currently, this check always looks at global trace state, but it should be checking the trace instance where trace_pipe is located at.

Because of this bug, cat instances/i1/trace_pipe in the following script will immediately exit instead of waiting for data:

cd /sys/kernel/debug/tracing
echo 0 > tracing_on
mkdir -p instances/i1
echo 1 > instances/i1/tracing_on
echo 1 > instances/i1/events/sched/sched_process_exec/enable cat instances/i1/trace_pipe

Fixes 10246fa35d4f ("tracing: give easy way to clear trace buffer")
---
 kernel/trace/trace.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace.c +1 -1
index d3ca35f38803..752e5daf0896 100644
@@ -5680,7 +5680,7 @@ static int tracing_wait_pipe(struct file *filp)
 		 *
 		 * iter->pos will be 0 if we haven't read anything.
 		 */
-		if (!tracing_is_on() && iter->pos)
+		if (!tracer_tracing_is_on(iter->tr) && iter->pos)
 			break;
 
 		mutex_unlock(&iter->mutex);
Signature · 1 line
2.13.2