lkml.org 
[lkml]   [2020]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 061/152] tracing: Move pipe reference to trace array instead of current_tracer
    Date
    From: Steven Rostedt (VMware) <rostedt@goodmis.org>

    commit 7ef282e05132d56b6f6b71e3873f317664bea78b upstream.

    If a process has the trace_pipe open on a trace_array, the current tracer
    for that trace array should not be changed. This was original enforced by a
    global lock, but when instances were introduced, it was moved to the
    current_trace. But this structure is shared by all instances, and a
    trace_pipe is for a single instance. There's no reason that a process that
    has trace_pipe open on one instance should prevent another instance from
    changing its current tracer. Move the reference counter to the trace_array
    instead.

    This is marked as "Fixes" but is more of a clean up than a true fix.
    Backport if you want, but its not critical.

    Fixes: cf6ab6d9143b1 ("tracing: Add ref count to tracer for when they are being read by pipe")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    [Resolved conflict in __remove_instance()]
    Signed-off-by: dann frazier <dann.frazier@canonical.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    kernel/trace/trace.c | 12 ++++++------
    kernel/trace/trace.h | 2 +-
    2 files changed, 7 insertions(+), 7 deletions(-)

    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -5686,7 +5686,7 @@ static int tracing_set_tracer(struct tra
    }

    /* If trace pipe files are being read, we can't change the tracer */
    - if (tr->current_trace->ref) {
    + if (tr->trace_ref) {
    ret = -EBUSY;
    goto out;
    }
    @@ -5902,7 +5902,7 @@ static int tracing_open_pipe(struct inod

    nonseekable_open(inode, filp);

    - tr->current_trace->ref++;
    + tr->trace_ref++;
    out:
    mutex_unlock(&trace_types_lock);
    return ret;
    @@ -5921,7 +5921,7 @@ static int tracing_release_pipe(struct i

    mutex_lock(&trace_types_lock);

    - tr->current_trace->ref--;
    + tr->trace_ref--;

    if (iter->trace->pipe_close)
    iter->trace->pipe_close(iter);
    @@ -7230,7 +7230,7 @@ static int tracing_buffers_open(struct i

    filp->private_data = info;

    - tr->current_trace->ref++;
    + tr->trace_ref++;

    mutex_unlock(&trace_types_lock);

    @@ -7331,7 +7331,7 @@ static int tracing_buffers_release(struc

    mutex_lock(&trace_types_lock);

    - iter->tr->current_trace->ref--;
    + iter->tr->trace_ref--;

    __trace_array_put(iter->tr);

    @@ -8470,7 +8470,7 @@ static int __remove_instance(struct trac
    {
    int i;

    - if (tr->ref || (tr->current_trace && tr->current_trace->ref))
    + if (tr->ref || (tr->current_trace && tr->trace_ref))
    return -EBUSY;

    list_del(&tr->list);
    --- a/kernel/trace/trace.h
    +++ b/kernel/trace/trace.h
    @@ -309,6 +309,7 @@ struct trace_array {
    struct trace_event_file *trace_marker_file;
    cpumask_var_t tracing_cpumask; /* only trace on set CPUs */
    int ref;
    + int trace_ref;
    #ifdef CONFIG_FUNCTION_TRACER
    struct ftrace_ops *ops;
    struct trace_pid_list __rcu *function_pids;
    @@ -498,7 +499,6 @@ struct tracer {
    struct tracer *next;
    struct tracer_flags *flags;
    int enabled;
    - int ref;
    bool print_max;
    bool allow_instances;
    #ifdef CONFIG_TRACER_MAX_TRACE

    \
     
     \ /
      Last update: 2020-08-20 14:40    [W:3.355 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site