aboutsummaryrefslogtreecommitdiff
path: root/kernel/trace
diff options
context:
space:
mode:
authorGravatar Steven Rostedt (Red Hat) <rostedt@goodmis.org> 2014-04-29 16:07:28 -0400
committerGravatar Steven Rostedt <rostedt@goodmis.org> 2014-04-29 16:07:28 -0400
commitf4874261049e3abdd481359d82cafa5068369ebd (patch)
treeee81269a6086634c7ae04c18eba24fb717528590 /kernel/trace
parenttracing: Fix documentation of ftrace_set_global_{filter,notrace}() (diff)
downloadlinux-f4874261049e3abdd481359d82cafa5068369ebd.tar.gz
linux-f4874261049e3abdd481359d82cafa5068369ebd.tar.bz2
linux-f4874261049e3abdd481359d82cafa5068369ebd.zip
tracing: Break out of tracing_wait_pipe() before wait_pipe() is called
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>
Diffstat (limited to 'kernel/trace')
-rw-r--r--kernel/trace/trace.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index cb41e98cc64b..e058c6091e45 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;