lkml.org 
[lkml]   [2017]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/10] perf, tools: Factor out PMU matching in parser
    Date
    From: Andi Kleen <ak@linux.intel.com>

    Factor out the PMU name matching in the event parser into a separate function,
    to use the same code for other grammar rules later.

    Signed-off-by: Andi Kleen <ak@linux.intel.com>
    ---
    tools/perf/util/parse-events.c | 46 ++++++++++++++++++++++++++++++++++++++++++
    tools/perf/util/parse-events.h | 5 +++++
    tools/perf/util/parse-events.y | 30 +--------------------------
    3 files changed, 52 insertions(+), 29 deletions(-)

    diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
    index 281e44af31e2..5563c47c92df 100644
    --- a/tools/perf/util/parse-events.c
    +++ b/tools/perf/util/parse-events.c
    @@ -1259,6 +1259,52 @@ int parse_events_add_pmu(struct parse_events_evlist *data,
    return evsel ? 0 : -ENOMEM;
    }

    +int parse_events_multi_pmu_add(struct parse_events_evlist *data,
    + char *str, struct list_head **listp)
    +{
    + struct list_head *head;
    + struct parse_events_term *term;
    + struct list_head *list;
    + struct perf_pmu *pmu = NULL;
    + int ok = 0;
    +
    + *listp = NULL;
    + /* Add it for all PMUs that support the alias */
    + list = malloc(sizeof(struct list_head));
    + if (!list)
    + return -1;
    + INIT_LIST_HEAD(list);
    + while ((pmu = perf_pmu__scan(pmu)) != NULL) {
    + struct perf_pmu_alias *alias;
    +
    + list_for_each_entry(alias, &pmu->aliases, list) {
    + if (!strcasecmp(alias->name, str)) {
    + head = malloc(sizeof(struct list_head));
    + if (!head)
    + return -1;
    + INIT_LIST_HEAD(head);
    + if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
    + str, 1, &str, NULL) < 0)
    + return -1;
    + list_add_tail(&term->list, head);
    +
    + if (!parse_events_add_pmu(data, list,
    + pmu->name, head)) {
    + pr_debug("%s -> %s/%s/\n", str,
    + pmu->name, alias->str);
    + ok++;
    + }
    +
    + parse_events_terms__delete(head);
    + }
    + }
    + }
    + if (!ok)
    + return -1;
    + *listp = list;
    + return 0;
    +}
    +
    int parse_events__modifier_group(struct list_head *list,
    char *event_mod)
    {
    diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
    index da246a3ddb69..fb755ec248ab 100644
    --- a/tools/perf/util/parse-events.h
    +++ b/tools/perf/util/parse-events.h
    @@ -164,6 +164,11 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx,
    int parse_events_add_pmu(struct parse_events_evlist *data,
    struct list_head *list, char *name,
    struct list_head *head_config);
    +
    +int parse_events_multi_pmu_add(struct parse_events_evlist *data,
    + char *str,
    + struct list_head **listp);
    +
    enum perf_pmu_event_symbol_type
    perf_pmu__parse_check(const char *name);
    void parse_events__set_leader(char *name, struct list_head *list);
    diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
    index a14b47ab3879..6b2bc918fc94 100644
    --- a/tools/perf/util/parse-events.y
    +++ b/tools/perf/util/parse-events.y
    @@ -236,37 +236,9 @@ PE_NAME opt_event_config
    |
    PE_KERNEL_PMU_EVENT sep_dc
    {
    - struct parse_events_evlist *data = _data;
    - struct list_head *head;
    - struct parse_events_term *term;
    struct list_head *list;
    - struct perf_pmu *pmu = NULL;
    - int ok = 0;

    - /* Add it for all PMUs that support the alias */
    - ALLOC_LIST(list);
    - while ((pmu = perf_pmu__scan(pmu)) != NULL) {
    - struct perf_pmu_alias *alias;
    -
    - list_for_each_entry(alias, &pmu->aliases, list) {
    - if (!strcasecmp(alias->name, $1)) {
    - ALLOC_LIST(head);
    - ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
    - $1, 1, &@1, NULL));
    - list_add_tail(&term->list, head);
    -
    - if (!parse_events_add_pmu(data, list,
    - pmu->name, head)) {
    - pr_debug("%s -> %s/%s/\n", $1,
    - pmu->name, alias->str);
    - ok++;
    - }
    -
    - parse_events_terms__delete(head);
    - }
    - }
    - }
    - if (!ok)
    + if (parse_events_multi_pmu_add(_data, $1, &list) < 0)
    YYABORT;
    $$ = list;
    }
    --
    2.9.3
    \
     
     \ /
      Last update: 2017-03-01 07:56    [W:4.167 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site