Skip to content

Commit

Permalink
tracing: Break out of tracing_wait_pipe() before wait_pipe() is called
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Steven Rostedt (Red Hat) committed Apr 29, 2014
1 parent 8d1b065 commit f487426
Showing 1 changed file with 9 additions and 9 deletions.
18 changes: 9 additions & 9 deletions kernel/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down

0 comments on commit f487426

Please sign in to comment.