Skip to content

Commit

Permalink
perf tools: Adds the config_term callback for different type events
Browse files Browse the repository at this point in the history
Currently, function config_term() is used for checking config terms of
all types of events, while unknown terms is not reported as an error
because pmu events have valid terms in sysfs.

But this is wrong when unknown terms are specificed to hw/sw events.
This patch Adds the config_term callback so we can use separate check
routines for each type of events.

Signed-off-by: He Kuang <[email protected]>
Acked-by: Jiri Olsa <[email protected]>
Cc: Adrian Hunter <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Wang Nan <[email protected]>
Cc: [email protected]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
  • Loading branch information
He Kuang authored and acmel committed Sep 28, 2015
1 parent ba11ba6 commit 0b8891a
Showing 1 changed file with 26 additions and 12 deletions.
38 changes: 26 additions & 12 deletions tools/perf/util/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,9 +599,13 @@ static int check_type_val(struct parse_events_term *term,
return -EINVAL;
}

static int config_term(struct perf_event_attr *attr,
struct parse_events_term *term,
struct parse_events_error *err)
typedef int config_term_func_t(struct perf_event_attr *attr,
struct parse_events_term *term,
struct parse_events_error *err);

static int config_term_common(struct perf_event_attr *attr,
struct parse_events_term *term,
struct parse_events_error *err)
{
#define CHECK_TYPE_VAL(type) \
do { \
Expand All @@ -610,12 +614,6 @@ do { \
} while (0)

switch (term->type_term) {
case PARSE_EVENTS__TERM_TYPE_USER:
/*
* Always succeed for sysfs terms, as we dont know
* at this point what type they need to have.
*/
return 0;
case PARSE_EVENTS__TERM_TYPE_CONFIG:
CHECK_TYPE_VAL(NUM);
attr->config = term->val.num;
Expand Down Expand Up @@ -665,9 +663,24 @@ do { \
#undef CHECK_TYPE_VAL
}

static int config_term_pmu(struct perf_event_attr *attr,
struct parse_events_term *term,
struct parse_events_error *err)
{
if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER)
/*
* Always succeed for sysfs terms, as we dont know
* at this point what type they need to have.
*/
return 0;
else
return config_term_common(attr, term, err);
}

static int config_attr(struct perf_event_attr *attr,
struct list_head *head,
struct parse_events_error *err)
struct parse_events_error *err,
config_term_func_t config_term)
{
struct parse_events_term *term;

Expand Down Expand Up @@ -735,7 +748,8 @@ int parse_events_add_numeric(struct parse_events_evlist *data,
attr.config = config;

if (head_config) {
if (config_attr(&attr, head_config, data->error))
if (config_attr(&attr, head_config, data->error,
config_term_common))
return -EINVAL;

if (get_config_terms(head_config, &config_terms))
Expand Down Expand Up @@ -795,7 +809,7 @@ int parse_events_add_pmu(struct parse_events_evlist *data,
* Configure hardcoded terms first, no need to check
* return value when called with fail == 0 ;)
*/
if (config_attr(&attr, head_config, data->error))
if (config_attr(&attr, head_config, data->error, config_term_pmu))
return -EINVAL;

if (get_config_terms(head_config, &config_terms))
Expand Down

0 comments on commit 0b8891a

Please sign in to comment.