lkml.org 
[lkml]   [2009]   [Sep]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:tracing/core] tracing/filters: Defer pred allocation, fix memory leak
    Commit-ID:  c58b43218c1a04a0bcf338ea47406c759ac28e11
    Gitweb: http://git.kernel.org/tip/c58b43218c1a04a0bcf338ea47406c759ac28e11
    Author: Li Zefan <lizf@cn.fujitsu.com>
    AuthorDate: Tue, 1 Sep 2009 13:31:38 +0800
    Committer: Frederic Weisbecker <fweisbec@gmail.com>
    CommitDate: Fri, 4 Sep 2009 23:22:33 +0200

    tracing/filters: Defer pred allocation, fix memory leak

    The predicates of an event and their filter structure are allocated
    when we create an event filter for the first time.

    These objects must be created once but each time we come with a new
    filter, we overwrite such pre-existing allocation, if any.

    Thus, this patch checks if the filter has already been allocated
    before going ahead.

    Spotted-by: Frederic Weisbecker <fweisbec@gmail.com>
    Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Tom Zanussi <tzanussi@gmail.com>
    Cc: Masami Hiramatsu <mhiramat@redhat.com>
    LKML-Reference: <4A9CB1BA.3060402@cn.fujitsu.com>
    Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>


    ---
    kernel/trace/trace_events_filter.c | 11 ++++++-----
    1 files changed, 6 insertions(+), 5 deletions(-)

    diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
    index c6b2edf..93660fb 100644
    --- a/kernel/trace/trace_events_filter.c
    +++ b/kernel/trace/trace_events_filter.c
    @@ -409,6 +409,9 @@ static int init_preds(struct ftrace_event_call *call)
    struct filter_pred *pred;
    int i;

    + if (call->filter)
    + return 0;
    +
    filter = call->filter = kzalloc(sizeof(*filter), GFP_KERNEL);
    if (!call->filter)
    return -ENOMEM;
    @@ -447,11 +450,9 @@ static int init_subsystem_preds(struct event_subsystem *system)
    if (strcmp(call->system, system->name) != 0)
    continue;

    - if (!call->filter) {
    - err = init_preds(call);
    - if (err)
    - return err;
    - }
    + err = init_preds(call);
    + if (err)
    + return err;
    }

    return 0;

    \
     
     \ /
      Last update: 2009-09-06 06:39    [W:0.025 / U:26.168 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site