lkml.org 
[lkml]   [2018]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.16 19/47] tracing: Make the snapshot trigger work with instances
    Date
    4.16-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Steven Rostedt (VMware) <rostedt@goodmis.org>

    commit 2824f5033248600673e3e126a4d135363cbfd9ac upstream.

    The snapshot trigger currently only affects the main ring buffer, even when
    it is used by the instances. This can be confusing as the snapshot trigger
    is listed in the instance.

    > # cd /sys/kernel/tracing
    > # mkdir instances/foo
    > # echo snapshot > instances/foo/events/syscalls/sys_enter_fchownat/trigger
    > # echo top buffer > trace_marker
    > # echo foo buffer > instances/foo/trace_marker
    > # touch /tmp/bar
    > # chown rostedt /tmp/bar
    > # cat instances/foo/snapshot
    # tracer: nop
    #
    #
    # * Snapshot is freed *
    #
    # Snapshot commands:
    # echo 0 > snapshot : Clears and frees snapshot buffer
    # echo 1 > snapshot : Allocates snapshot buffer, if not already allocated.
    # Takes a snapshot of the main buffer.
    # echo 2 > snapshot : Clears snapshot buffer (but does not allocate or free)
    # (Doesn't have to be '2' works with any number that
    # is not a '0' or '1')

    > # cat snapshot
    # tracer: nop
    #
    # _-----=> irqs-off
    # / _----=> need-resched
    # | / _---=> hardirq/softirq
    # || / _--=> preempt-depth
    # ||| / delay
    # TASK-PID CPU# |||| TIMESTAMP FUNCTION
    # | | | |||| | |
    bash-1189 [000] .... 111.488323: tracing_mark_write: top buffer

    Not only did the snapshot occur in the top level buffer, but the instance
    snapshot buffer should have been allocated, and it is still free.

    Cc: stable@vger.kernel.org
    Fixes: 85f2b08268c01 ("tracing: Add basic event trigger framework")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    kernel/trace/trace.c | 12 ++++++------
    kernel/trace/trace.h | 11 +++++++++++
    kernel/trace/trace_events_trigger.c | 10 ++++++++--
    3 files changed, 25 insertions(+), 8 deletions(-)

    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -892,7 +892,7 @@ int __trace_bputs(unsigned long ip, cons
    EXPORT_SYMBOL_GPL(__trace_bputs);

    #ifdef CONFIG_TRACER_SNAPSHOT
    -static void tracing_snapshot_instance(struct trace_array *tr)
    +void tracing_snapshot_instance(struct trace_array *tr)
    {
    struct tracer *tracer = tr->current_trace;
    unsigned long flags;
    @@ -948,7 +948,7 @@ static int resize_buffer_duplicate_size(
    struct trace_buffer *size_buf, int cpu_id);
    static void set_buffer_entries(struct trace_buffer *buf, unsigned long val);

    -static int alloc_snapshot(struct trace_array *tr)
    +int tracing_alloc_snapshot_instance(struct trace_array *tr)
    {
    int ret;

    @@ -994,7 +994,7 @@ int tracing_alloc_snapshot(void)
    struct trace_array *tr = &global_trace;
    int ret;

    - ret = alloc_snapshot(tr);
    + ret = tracing_alloc_snapshot_instance(tr);
    WARN_ON(ret < 0);

    return ret;
    @@ -5395,7 +5395,7 @@ static int tracing_set_tracer(struct tra

    #ifdef CONFIG_TRACER_MAX_TRACE
    if (t->use_max_tr && !had_max_tr) {
    - ret = alloc_snapshot(tr);
    + ret = tracing_alloc_snapshot_instance(tr);
    if (ret < 0)
    goto out;
    }
    @@ -6373,7 +6373,7 @@ tracing_snapshot_write(struct file *filp
    }
    #endif
    if (!tr->allocated_snapshot) {
    - ret = alloc_snapshot(tr);
    + ret = tracing_alloc_snapshot_instance(tr);
    if (ret < 0)
    break;
    }
    @@ -7094,7 +7094,7 @@ ftrace_trace_snapshot_callback(struct tr
    return ret;

    out_reg:
    - ret = alloc_snapshot(tr);
    + ret = tracing_alloc_snapshot_instance(tr);
    if (ret < 0)
    goto out;

    --- a/kernel/trace/trace.h
    +++ b/kernel/trace/trace.h
    @@ -1812,6 +1812,17 @@ static inline void __init trace_event_in
    static inline void trace_event_eval_update(struct trace_eval_map **map, int len) { }
    #endif

    +#ifdef CONFIG_TRACER_SNAPSHOT
    +void tracing_snapshot_instance(struct trace_array *tr);
    +int tracing_alloc_snapshot_instance(struct trace_array *tr);
    +#else
    +static inline void tracing_snapshot_instance(struct trace_array *tr) { }
    +static inline int tracing_alloc_snapshot_instance(struct trace_array *tr)
    +{
    + return 0;
    +}
    +#endif
    +
    extern struct trace_iterator *tracepoint_print_iter;

    #endif /* _LINUX_KERNEL_TRACE_H */
    --- a/kernel/trace/trace_events_trigger.c
    +++ b/kernel/trace/trace_events_trigger.c
    @@ -642,6 +642,7 @@ event_trigger_callback(struct event_comm
    trigger_data->count = -1;
    trigger_data->ops = trigger_ops;
    trigger_data->cmd_ops = cmd_ops;
    + trigger_data->private_data = file;
    INIT_LIST_HEAD(&trigger_data->list);
    INIT_LIST_HEAD(&trigger_data->named_list);

    @@ -1042,7 +1043,12 @@ static struct event_command trigger_trac
    static void
    snapshot_trigger(struct event_trigger_data *data, void *rec)
    {
    - tracing_snapshot();
    + struct trace_event_file *file = data->private_data;
    +
    + if (file)
    + tracing_snapshot_instance(file->tr);
    + else
    + tracing_snapshot();
    }

    static void
    @@ -1064,7 +1070,7 @@ register_snapshot_trigger(char *glob, st
    {
    int ret = register_trigger(glob, ops, data, file);

    - if (ret > 0 && tracing_alloc_snapshot() != 0) {
    + if (ret > 0 && tracing_alloc_snapshot_instance(file->tr) != 0) {
    unregister_trigger(glob, ops, data, file);
    ret = 0;
    }

    \
     
     \ /
      Last update: 2018-06-04 09:18    [W:4.069 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site