lkml.org 
[lkml]   [2023]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v4 26/44] perf parse-events: Support wildcards on raw events
    From
    Legacy raw events like r1a open as PERF_TYPE_RAW on non-hybrid systems
    and on each hybrid PMU on hybrid systems. Rather than iterate hybrid
    PMUs add a perf_pmu__supports_wildcard_numeric function that says when
    a numeric event should be opened upon it. If the parsed event
    specifies the type of the PMU then don't wildcard match PMUs, use the
    specified PMU type.

    Signed-off-by: Ian Rogers <irogers@google.com>
    ---
    tools/perf/util/parse-events.c | 50 ++++++++++++++++++++++++----------
    tools/perf/util/parse-events.h | 3 +-
    tools/perf/util/parse-events.y | 13 ++++++---
    tools/perf/util/pmu.c | 5 ++++
    tools/perf/util/pmu.h | 1 +
    5 files changed, 52 insertions(+), 20 deletions(-)

    diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
    index ec72f11fb37f..c8b4ec076825 100644
    --- a/tools/perf/util/parse-events.c
    +++ b/tools/perf/util/parse-events.c
    @@ -25,7 +25,6 @@
    #include "util/parse-branch-options.h"
    #include "util/evsel_config.h"
    #include "util/event.h"
    -#include "util/parse-events-hybrid.h"
    #include "util/pmu-hybrid.h"
    #include "util/bpf-filter.h"
    #include "util/util.h"
    @@ -1448,15 +1447,14 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
    #endif
    }

    -int parse_events_add_numeric(struct parse_events_state *parse_state,
    - struct list_head *list,
    - u32 type, u64 config,
    - struct list_head *head_config)
    +static int __parse_events_add_numeric(struct parse_events_state *parse_state,
    + struct list_head *list,
    + struct perf_pmu *pmu, u32 type, u64 config,
    + struct list_head *head_config)
    {
    struct perf_event_attr attr;
    LIST_HEAD(config_terms);
    const char *name, *metric_id;
    - bool hybrid;
    int ret;

    memset(&attr, 0, sizeof(attr));
    @@ -1474,19 +1472,41 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,

    name = get_config_name(head_config);
    metric_id = get_config_metric_id(head_config);
    - ret = parse_events__add_numeric_hybrid(parse_state, list, &attr,
    - name, metric_id,
    - &config_terms, &hybrid);
    - if (hybrid)
    - goto out_free_terms;
    -
    - ret = add_event(list, &parse_state->idx, &attr, name, metric_id,
    - &config_terms);
    -out_free_terms:
    + ret = __add_event(list, &parse_state->idx, &attr, /*init_attr*/true, name,
    + metric_id, pmu, &config_terms, /*auto_merge_stats=*/false,
    + /*cpu_list=*/NULL) ? 0 : -ENOMEM;
    free_config_terms(&config_terms);
    return ret;
    }

    +int parse_events_add_numeric(struct parse_events_state *parse_state,
    + struct list_head *list,
    + u32 type, u64 config,
    + struct list_head *head_config,
    + bool wildcard)
    +{
    + struct perf_pmu *pmu = NULL;
    + bool found_supported = false;
    +
    + if (!wildcard)
    + return __parse_events_add_numeric(parse_state, list, /*pmu=*/NULL,
    + type, config, head_config);
    +
    + while ((pmu = perf_pmu__scan(pmu)) != NULL) {
    + int ret;
    +
    + if (!perf_pmu__supports_wildcard_numeric(pmu))
    + continue;
    +
    + found_supported = true;
    + ret = __parse_events_add_numeric(parse_state, list, pmu, pmu->type,
    + config, head_config);
    + if (ret)
    + return ret;
    + }
    + return found_supported ? 0 : -EINVAL;
    +}
    +
    int parse_events_add_tool(struct parse_events_state *parse_state,
    struct list_head *list,
    int tool_event)
    diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
    index 4e49be290209..831cd1ff4702 100644
    --- a/tools/perf/util/parse-events.h
    +++ b/tools/perf/util/parse-events.h
    @@ -166,7 +166,8 @@ int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
    int parse_events_add_numeric(struct parse_events_state *parse_state,
    struct list_head *list,
    u32 type, u64 config,
    - struct list_head *head_config);
    + struct list_head *head_config,
    + bool wildcard);
    int parse_events_add_tool(struct parse_events_state *parse_state,
    struct list_head *list,
    int tool_event);
    diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
    index cc7528558845..5055a29a448f 100644
    --- a/tools/perf/util/parse-events.y
    +++ b/tools/perf/util/parse-events.y
    @@ -435,7 +435,8 @@ value_sym '/' event_config '/'

    list = alloc_list();
    ABORT_ON(!list);
    - err = parse_events_add_numeric(_parse_state, list, type, config, $3);
    + err = parse_events_add_numeric(_parse_state, list, type, config, $3,
    + /*wildcard=*/false);
    parse_events_terms__delete($3);
    if (err) {
    free_list_evsel(list);
    @@ -452,7 +453,9 @@ value_sym sep_slash_slash_dc

    list = alloc_list();
    ABORT_ON(!list);
    - ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL));
    + ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config,
    + /*head_config=*/NULL,
    + /*wildcard=*/false));
    $$ = list;
    }
    |
    @@ -596,7 +599,8 @@ PE_VALUE ':' PE_VALUE opt_event_config

    list = alloc_list();
    ABORT_ON(!list);
    - err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4);
    + err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4,
    + /*wildcard=*/false);
    parse_events_terms__delete($4);
    if (err) {
    free(list);
    @@ -618,7 +622,8 @@ PE_RAW opt_event_config
    num = strtoull($1 + 1, NULL, 16);
    ABORT_ON(errno);
    free($1);
    - err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, num, $2);
    + err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, num, $2,
    + /*wildcard=*/true);
    parse_events_terms__delete($2);
    if (err) {
    free(list);
    diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
    index 63071d876190..cd4247a379d4 100644
    --- a/tools/perf/util/pmu.c
    +++ b/tools/perf/util/pmu.c
    @@ -1655,6 +1655,11 @@ bool perf_pmu__supports_legacy_cache(const struct perf_pmu *pmu)
    return is_pmu_core(pmu->name) || perf_pmu__is_hybrid(pmu->name);
    }

    +bool perf_pmu__supports_wildcard_numeric(const struct perf_pmu *pmu)
    +{
    + return is_pmu_core(pmu->name) || perf_pmu__is_hybrid(pmu->name);
    +}
    +
    static bool pmu_alias_is_duplicate(struct sevent *alias_a,
    struct sevent *alias_b)
    {
    diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
    index 05702bc4bcf8..5a19536a5449 100644
    --- a/tools/perf/util/pmu.h
    +++ b/tools/perf/util/pmu.h
    @@ -221,6 +221,7 @@ struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu);

    bool is_pmu_core(const char *name);
    bool perf_pmu__supports_legacy_cache(const struct perf_pmu *pmu);
    +bool perf_pmu__supports_wildcard_numeric(const struct perf_pmu *pmu);
    void print_pmu_events(const struct print_callbacks *print_cb, void *print_state);
    bool pmu_have_event(const char *pname, const char *name);

    --
    2.40.1.495.gc816e09b53d-goog
    \
     
     \ /
      Last update: 2023-05-03 00:44    [W:3.107 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site