lkml.org 
[lkml]   [2013]   [Jul]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/8] perf: Fix branch stack refcount leak on callchain init failure
    Date
    On callchain buffers allocation failure, free_event() is
    called and all the accounting performed in perf_event_alloc()
    for that event is cancelled.

    But if the event has branch stack sampling, it is unaccounted
    as well from the branch stack sampling events refcounts.

    This is a bug because this accounting is performed after the
    callchain buffer allocation. As a result, the branch stack sampling
    events refcount can become negative.

    To fix this, move the branch stack event accounting before the
    callchain buffer allocation.

    Reported-by: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Stephane Eranian <eranian@google.com>
    ---
    kernel/events/core.c | 12 ++++++------
    1 files changed, 6 insertions(+), 6 deletions(-)

    diff --git a/kernel/events/core.c b/kernel/events/core.c
    index 5e2bce9..7ffb81e 100644
    --- a/kernel/events/core.c
    +++ b/kernel/events/core.c
    @@ -6566,6 +6566,12 @@ done:
    atomic_inc(&nr_comm_events);
    if (event->attr.task)
    atomic_inc(&nr_task_events);
    + if (has_branch_stack(event)) {
    + static_key_slow_inc(&perf_sched_events.key);
    + if (!(event->attach_state & PERF_ATTACH_TASK))
    + atomic_inc(&per_cpu(perf_branch_stack_events,
    + event->cpu));
    + }
    if (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN) {
    err = get_callchain_buffers();
    if (err) {
    @@ -6573,12 +6579,6 @@ done:
    return ERR_PTR(err);
    }
    }
    - if (has_branch_stack(event)) {
    - static_key_slow_inc(&perf_sched_events.key);
    - if (!(event->attach_state & PERF_ATTACH_TASK))
    - atomic_inc(&per_cpu(perf_branch_stack_events,
    - event->cpu));
    - }
    }

    return event;
    --
    1.7.5.4


    \
     
     \ /
      Last update: 2013-07-23 03:01    [W:7.607 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site