lkml.org 
[lkml]   [2020]   [May]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC v3 07/12] perf pmu: Add pmu_add_sys_aliases()
    Date
    Add pmu_add_sys_aliases() to add system PMU events aliases.

    For adding system PMU events, we iterate through all the events per
    SoC event table in pmu_sys_event_tables[].

    Matches must satisfy both:
    - PMU identifer matches event "compat" value
    - like uncore event matching, the event "Unit" member must match; this
    match under return value of pmu_uncore_alias_match() (maybe rename that
    function?)

    Signed-off-by: John Garry <john.garry@huawei.com>
    ---
    tools/perf/util/pmu.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++
    tools/perf/util/pmu.h | 2 ++
    2 files changed, 80 insertions(+)

    diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
    index 6f77c6af9e04..3986d2360fc1 100644
    --- a/tools/perf/util/pmu.c
    +++ b/tools/perf/util/pmu.c
    @@ -809,6 +809,83 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu)
    pmu_add_cpu_aliases_map(head, pmu, map);
    }

    +void pmu_for_each_sys_event(pmu_sys_event_iter_fn fn, void *data)
    +{
    + int i = 0;
    +
    + while (1) {
    + struct pmu_sys_events *event_table;
    + int j = 0;
    +
    + event_table = &pmu_sys_event_tables[i++];
    +
    + if (!event_table->table)
    + break;
    +
    + while (1) {
    + struct pmu_event *pe = &event_table->table[j++];
    + int ret;
    +
    + if (!pe->name && !pe->metric_group && !pe->metric_name)
    + break;
    +
    + ret = fn(pe, data);
    + if (ret)
    + break;
    + }
    + }
    +}
    +
    +struct pmu_sys_event_iter_data {
    + struct list_head *head;
    + struct perf_pmu *pmu;
    +};
    +
    +static int pmu_add_sys_aliases_iter_fn(struct pmu_event *pe, void *data)
    +{
    + struct pmu_sys_event_iter_data *idata = data;
    + struct perf_pmu *pmu = idata->pmu;
    +
    + if (!pe->name) {
    + if (pe->metric_group || pe->metric_name)
    + return 0;
    + return -EINVAL;
    + }
    +
    + if (!pe->compat || !pe->pmu)
    + return 0;
    +
    + if (!strcmp(pmu->id, pe->compat) &&
    + pmu_uncore_alias_match(pe->pmu, pmu->name)) {
    + __perf_pmu__new_alias(idata->head, NULL,
    + (char *)pe->name,
    + (char *)pe->desc,
    + (char *)pe->event,
    + (char *)pe->long_desc,
    + (char *)pe->topic,
    + (char *)pe->unit,
    + (char *)pe->perpkg,
    + (char *)pe->metric_expr,
    + (char *)pe->metric_name,
    + (char *)pe->deprecated);
    + }
    +
    + return 0;
    +}
    +
    +static void pmu_add_sys_aliases(struct list_head *head, struct perf_pmu *pmu)
    +{
    + struct pmu_sys_event_iter_data idata = {
    + .head = head,
    + .pmu = pmu,
    + };
    +
    + if (!pmu->id)
    + return;
    +
    + pmu_for_each_sys_event(pmu_add_sys_aliases_iter_fn, &idata);
    +}
    +
    struct perf_event_attr * __weak
    perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
    {
    @@ -864,6 +941,7 @@ static struct perf_pmu *pmu_lookup(const char *name)
    pmu->id = pmu_id(name);
    pmu->max_precise = pmu_max_precise(name);
    pmu_add_cpu_aliases(&aliases, pmu);
    + pmu_add_sys_aliases(&aliases, pmu);

    INIT_LIST_HEAD(&pmu->format);
    INIT_LIST_HEAD(&pmu->aliases);
    diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
    index 62ebca9481fe..f75f54afb354 100644
    --- a/tools/perf/util/pmu.h
    +++ b/tools/perf/util/pmu.h
    @@ -106,6 +106,8 @@ void pmu_add_cpu_aliases_map(struct list_head *head, struct perf_pmu *pmu,
    struct pmu_events_map *perf_pmu__find_map(struct perf_pmu *pmu);
    bool pmu_uncore_alias_match(const char *pmu_name, const char *name);

    +typedef int (*pmu_sys_event_iter_fn)(struct pmu_event *pe, void *data);
    +void pmu_for_each_sys_event(pmu_sys_event_iter_fn fn, void *data);
    int perf_pmu__convert_scale(const char *scale, char **end, double *sval);

    #endif /* __PMU_H */
    --
    2.16.4
    \
     
     \ /
      Last update: 2020-05-07 14:02    [W:3.190 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site