lkml.org 
[lkml]   [2011]   [Jan]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -perf/perf/core v2 3/3] perf probe: Add filters support for available functions
    Date
    Add filters support for available function list.
    Default filter is "!_*" for filtering out local-purpose
    symbols.

    e.g.)
    # perf probe --filter="add*" -F
    add_disk
    add_disk_randomness
    add_input_randomness
    add_interrupt_randomness
    add_memory
    add_page_to_unevictable_list
    add_page_wait_queue
    ...

    Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
    Cc: Chase Douglas <chase.douglas@canonical.com>
    Cc: linux-kernel@vger.kernel.org
    ---

    tools/perf/Documentation/perf-probe.txt | 9 +++++----
    tools/perf/builtin-probe.c | 19 +++++++++++++------
    tools/perf/util/probe-event.c | 23 +++++++++++++----------
    tools/perf/util/probe-event.h | 2 +-
    4 files changed, 32 insertions(+), 21 deletions(-)

    diff --git a/tools/perf/Documentation/perf-probe.txt b/tools/perf/Documentation/perf-probe.txt
    index c3189de..4df425a 100644
    --- a/tools/perf/Documentation/perf-probe.txt
    +++ b/tools/perf/Documentation/perf-probe.txt
    @@ -78,9 +78,10 @@ OPTIONS
    Show available functions in given module or kernel.

    --filter=FILTER::
    - (Only for --vars) Set filter for variables. FILTER is a combination of
    - glob pattern, see FILTER PATTERN for detail.
    - Default FILTER is "!__k???tab_* & !__crc_*".
    + (Only for --vars and --funcs) Set filter for variables. FILTER is a
    + combination of glob pattern, see FILTER PATTERN for detail.
    + Default FILTER is "!__k???tab_* & !__crc_*" for --vars, and "!_*"
    + for --funcs.
    If several filters are specified, only the last filter is valid.

    -f::
    @@ -147,7 +148,7 @@ This provides some sort of flexibility and robustness to probe point definitions

    FILTER PATTERN
    --------------
    - The filter pattern is glob matching pattern(s) to filter variables.
    + The filter pattern is glob matching pattern(s) to filter variables or functions.
    In addition, you can use "!" for specifying filter-out rule. You also can give several rules combined with "&" or "|", and fold those rules as one rule by using "(" ")".

    e.g.
    diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
    index abb423e..fcde003 100644
    --- a/tools/perf/builtin-probe.c
    +++ b/tools/perf/builtin-probe.c
    @@ -45,6 +45,7 @@
    #include "util/probe-event.h"

    #define DEFAULT_VAR_FILTER "!__k???tab_* & !__crc_*"
    +#define DEFAULT_FUNC_FILTER "!_*"
    #define MAX_PATH_LEN 256

    /* Session management structure */
    @@ -159,6 +160,7 @@ static int opt_show_vars(const struct option *opt __used,

    return ret;
    }
    +#endif

    static int opt_set_filter(const struct option *opt __used,
    const char *str, int unset __used)
    @@ -180,7 +182,6 @@ static int opt_set_filter(const struct option *opt __used,

    return 0;
    }
    -#endif

    static const char * const probe_usage[] = {
    "perf probe [<options>] 'PROBEDEF' ['PROBEDEF' ...]",
    @@ -236,10 +237,6 @@ static const struct option options[] = {
    "Show accessible variables on PROBEDEF", opt_show_vars),
    OPT_BOOLEAN('\0', "externs", &params.show_ext_vars,
    "Show external variables too (with --vars only)"),
    - OPT_CALLBACK('\0', "filter", NULL,
    - "[!]FILTER", "Set a variable filter (with --vars only)\n"
    - "\t\t\t(default: \"" DEFAULT_VAR_FILTER "\")",
    - opt_set_filter),
    OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
    "file", "vmlinux pathname"),
    OPT_STRING('s', "source", &symbol_conf.source_prefix,
    @@ -252,6 +249,11 @@ static const struct option options[] = {
    "Set how many probe points can be found for a probe."),
    OPT_BOOLEAN('F', "funcs", &params.show_funcs,
    "Show potential probe-able functions."),
    + OPT_CALLBACK('\0', "filter", NULL,
    + "[!]FILTER", "Set a filter (with --vars/funcs only)\n"
    + "\t\t\t(default: \"" DEFAULT_VAR_FILTER "\" for --vars,\n"
    + "\t\t\t \"" DEFAULT_FUNC_FILTER "\" for --funcs)",
    + opt_set_filter),
    OPT_END()
    };

    @@ -322,7 +324,12 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
    pr_err(" Error: Don't use --funcs with --vars.\n");
    usage_with_options(probe_usage, options);
    }
    - ret = show_available_funcs(params.target_module);
    + if (!params.filter)
    + params.filter = strfilter__new(DEFAULT_FUNC_FILTER,
    + NULL);
    + ret = show_available_funcs(params.target_module,
    + params.filter);
    + strfilter__delete(params.filter);
    if (ret < 0)
    pr_err(" Error: Failed to show functions."
    " (%d)\n", ret);
    diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
    index 2346506..27b8b3c 100644
    --- a/tools/perf/util/probe-event.c
    +++ b/tools/perf/util/probe-event.c
    @@ -1951,21 +1951,23 @@ int del_perf_probe_events(struct strlist *dellist)

    return ret;
    }
    +/* TODO: don't use a global variable for filter ... */
    +static struct strfilter *available_func_filter;

    /*
    - * If a symbol corresponds to a function with global binding return 0.
    - * For all others return 1.
    + * If a symbol corresponds to a function with global binding and
    + * matches filter return 0. For all others return 1.
    */
    -static int filter_non_global_functions(struct map *map __unused,
    - struct symbol *sym)
    +static int filter_available_functions(struct map *map __unused,
    + struct symbol *sym)
    {
    - if (sym->binding != STB_GLOBAL)
    - return 1;
    -
    - return 0;
    + if (sym->binding == STB_GLOBAL &&
    + strfilter__compare(available_func_filter, sym->name))
    + return 0;
    + return 1;
    }

    -int show_available_funcs(const char *module)
    +int show_available_funcs(const char *module, struct strfilter *_filter)
    {
    struct map *map;
    int ret;
    @@ -1981,7 +1983,8 @@ int show_available_funcs(const char *module)
    pr_err("Failed to find %s map.\n", (module) ? : "kernel");
    return -EINVAL;
    }
    - if (map__load(map, filter_non_global_functions)) {
    + available_func_filter = _filter;
    + if (map__load(map, filter_available_functions)) {
    pr_err("Failed to load map.\n");
    return -EINVAL;
    }
    diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
    index 4e80b2b..3434fc9 100644
    --- a/tools/perf/util/probe-event.h
    +++ b/tools/perf/util/probe-event.h
    @@ -128,7 +128,7 @@ extern int show_line_range(struct line_range *lr, const char *module);
    extern int show_available_vars(struct perf_probe_event *pevs, int npevs,
    int max_probe_points, const char *module,
    struct strfilter *filter, bool externs);
    -extern int show_available_funcs(const char *module);
    +extern int show_available_funcs(const char *module, struct strfilter *filter);


    /* Maximum index number of event-name postfix */


    \
     
     \ /
      Last update: 2011-01-20 15:25    [W:0.033 / U:61.584 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site