lkml.org 
[lkml]   [2009]   [May]   [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/events: fix memory leak when unloading module
    Commit-ID:  2df75e415709ad12862028916c772c1f377f6a7c
    Gitweb: http://git.kernel.org/tip/2df75e415709ad12862028916c772c1f377f6a7c
    Author: Li Zefan <lizf@cn.fujitsu.com>
    AuthorDate: Wed, 6 May 2009 10:33:04 +0800
    Committer: Ingo Molnar <mingo@elte.hu>
    CommitDate: Wed, 6 May 2009 10:38:19 +0200

    tracing/events: fix memory leak when unloading module

    When unloading a module, memory allocated by init_preds() and
    trace_define_field() is not freed.

    [ Impact: fix memory leak ]

    Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
    Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
    Acked-by: Steven Rostedt <rostedt@goodmis.org>
    Cc: Tom Zanussi <tzanussi@gmail.com>
    LKML-Reference: <4A00F6E0.3040503@cn.fujitsu.com>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>


    ---
    include/linux/ftrace_event.h | 1 +
    kernel/trace/trace_events.c | 18 ++++++++++++++++++
    kernel/trace/trace_events_filter.c | 22 +++++++++++++++-------
    3 files changed, 34 insertions(+), 7 deletions(-)

    diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h
    index 5fff40c..662c1be 100644
    --- a/include/linux/ftrace_event.h
    +++ b/include/linux/ftrace_event.h
    @@ -116,6 +116,7 @@ struct ftrace_event_call {
    #define MAX_FILTER_STR_VAL 128

    extern int init_preds(struct ftrace_event_call *call);
    +extern void destroy_preds(struct ftrace_event_call *call);
    extern int filter_match_preds(struct ftrace_event_call *call, void *rec);
    extern int filter_current_check_discard(struct ftrace_event_call *call,
    void *rec,
    diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
    index f789ca5..f251a15 100644
    --- a/kernel/trace/trace_events.c
    +++ b/kernel/trace/trace_events.c
    @@ -60,6 +60,22 @@ err:
    }
    EXPORT_SYMBOL_GPL(trace_define_field);

    +#ifdef CONFIG_MODULES
    +
    +static void trace_destroy_fields(struct ftrace_event_call *call)
    +{
    + struct ftrace_event_field *field, *next;
    +
    + list_for_each_entry_safe(field, next, &call->fields, link) {
    + list_del(&field->link);
    + kfree(field->type);
    + kfree(field->name);
    + kfree(field);
    + }
    +}
    +
    +#endif /* CONFIG_MODULES */
    +
    static void ftrace_clear_events(void)
    {
    struct ftrace_event_call *call;
    @@ -925,6 +941,8 @@ static void trace_module_remove_events(struct module *mod)
    unregister_ftrace_event(call->event);
    debugfs_remove_recursive(call->dir);
    list_del(&call->list);
    + trace_destroy_fields(call);
    + destroy_preds(call);
    }
    }

    diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
    index f494866..ce07b81 100644
    --- a/kernel/trace/trace_events_filter.c
    +++ b/kernel/trace/trace_events_filter.c
    @@ -346,6 +346,20 @@ static void filter_disable_preds(struct ftrace_event_call *call)
    filter->preds[i]->fn = filter_pred_none;
    }

    +void destroy_preds(struct ftrace_event_call *call)
    +{
    + struct event_filter *filter = call->filter;
    + int i;
    +
    + for (i = 0; i < MAX_FILTER_PRED; i++) {
    + if (filter->preds[i])
    + filter_free_pred(filter->preds[i]);
    + }
    + kfree(filter->preds);
    + kfree(filter);
    + call->filter = NULL;
    +}
    +
    int init_preds(struct ftrace_event_call *call)
    {
    struct event_filter *filter;
    @@ -374,13 +388,7 @@ int init_preds(struct ftrace_event_call *call)
    return 0;

    oom:
    - for (i = 0; i < MAX_FILTER_PRED; i++) {
    - if (filter->preds[i])
    - filter_free_pred(filter->preds[i]);
    - }
    - kfree(filter->preds);
    - kfree(call->filter);
    - call->filter = NULL;
    + destroy_preds(call);

    return -ENOMEM;
    }

    \
     
     \ /
      Last update: 2009-05-06 14:25    [W:0.026 / U:0.164 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site