lkml.org 
[lkml]   [2022]   [Jul]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v3 15/17] perf metrics: Copy entire pmu_event in find metric
    From
    The pmu_event passed to the pmu_events_table_for_each_event is invalid
    after the loop. Copy the entire struct in metricgroup__find_metric.
    Reduce the scope of this function to static.

    Signed-off-by: Ian Rogers <irogers@google.com>
    ---
    tools/perf/util/metricgroup.c | 33 ++++++++++++++++++---------------
    tools/perf/util/metricgroup.h | 2 --
    2 files changed, 18 insertions(+), 17 deletions(-)

    diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
    index 8ef44f4b5e9a..95f4b46dba09 100644
    --- a/tools/perf/util/metricgroup.c
    +++ b/tools/perf/util/metricgroup.c
    @@ -879,6 +879,10 @@ struct metricgroup_add_iter_data {
    const struct pmu_events_table *table;
    };

    +static bool metricgroup__find_metric(const char *metric,
    + const struct pmu_events_table *table,
    + struct pmu_event *pe);
    +
    static int add_metric(struct list_head *metric_list,
    const struct pmu_event *pe,
    const char *modifier,
    @@ -914,7 +918,7 @@ static int resolve_metric(struct list_head *metric_list,
    size_t bkt;
    struct to_resolve {
    /* The metric to resolve. */
    - const struct pmu_event *pe;
    + struct pmu_event pe;
    /*
    * The key in the IDs map, this may differ from in case,
    * etc. from pe->metric_name.
    @@ -928,16 +932,15 @@ static int resolve_metric(struct list_head *metric_list,
    * the pending array.
    */
    hashmap__for_each_entry(root_metric->pctx->ids, cur, bkt) {
    - const struct pmu_event *pe;
    + struct pmu_event pe;

    - pe = metricgroup__find_metric(cur->key, table);
    - if (pe) {
    + if (metricgroup__find_metric(cur->key, table, &pe)) {
    pending = realloc(pending,
    (pending_cnt + 1) * sizeof(struct to_resolve));
    if (!pending)
    return -ENOMEM;

    - pending[pending_cnt].pe = pe;
    + memcpy(&pending[pending_cnt].pe, &pe, sizeof(pe));
    pending[pending_cnt].key = cur->key;
    pending_cnt++;
    }
    @@ -952,7 +955,7 @@ static int resolve_metric(struct list_head *metric_list,
    * context.
    */
    for (i = 0; i < pending_cnt; i++) {
    - ret = add_metric(metric_list, pending[i].pe, modifier, metric_no_group,
    + ret = add_metric(metric_list, &pending[i].pe, modifier, metric_no_group,
    root_metric, visited, table);
    if (ret)
    break;
    @@ -1073,7 +1076,7 @@ static int __add_metric(struct list_head *metric_list,

    struct metricgroup__find_metric_data {
    const char *metric;
    - const struct pmu_event *pe;
    + struct pmu_event *pe;
    };

    static int metricgroup__find_metric_callback(const struct pmu_event *pe,
    @@ -1085,21 +1088,21 @@ static int metricgroup__find_metric_callback(const struct pmu_event *pe,
    if (!match_metric(pe->metric_name, data->metric))
    return 0;

    - data->pe = pe;
    - return -1;
    + memcpy(data->pe, pe, sizeof(*pe));
    + return 1;
    }

    -const struct pmu_event *metricgroup__find_metric(const char *metric,
    - const struct pmu_events_table *table)
    +static bool metricgroup__find_metric(const char *metric,
    + const struct pmu_events_table *table,
    + struct pmu_event *pe)
    {
    struct metricgroup__find_metric_data data = {
    .metric = metric,
    - .pe = NULL,
    + .pe = pe,
    };

    - pmu_events_table_for_each_event(table, metricgroup__find_metric_callback, &data);
    -
    - return data.pe;
    + return pmu_events_table_for_each_event(table, metricgroup__find_metric_callback, &data)
    + ? true : false;
    }

    static int add_metric(struct list_head *metric_list,
    diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h
    index f54d170043e9..016b3b1a289a 100644
    --- a/tools/perf/util/metricgroup.h
    +++ b/tools/perf/util/metricgroup.h
    @@ -69,8 +69,6 @@ int metricgroup__parse_groups(const struct option *opt,
    bool metric_no_group,
    bool metric_no_merge,
    struct rblist *metric_events);
    -const struct pmu_event *metricgroup__find_metric(const char *metric,
    - const struct pmu_events_table *table);
    int metricgroup__parse_groups_test(struct evlist *evlist,
    const struct pmu_events_table *table,
    const char *str,
    --
    2.37.1.455.g008518b4e5-goog
    \
     
     \ /
      Last update: 2022-07-29 09:46    [W:5.379 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site