Skip to content

Commit 0b8891a

Browse files
He Kuangacmel
authored andcommitted
perf tools: Adds the config_term callback for different type events
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 <hekuang@huawei.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Kan Liang <kan.liang@intel.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Wang Nan <wangnan0@huawei.com> Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/1443412336-120050-1-git-send-email-hekuang@huawei.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent ba11ba6 commit 0b8891a

File tree

1 file changed

+26
-12
lines changed

1 file changed

+26
-12
lines changed

tools/perf/util/parse-events.c

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -599,9 +599,13 @@ static int check_type_val(struct parse_events_term *term,
599599
return -EINVAL;
600600
}
601601

602-
static int config_term(struct perf_event_attr *attr,
603-
struct parse_events_term *term,
604-
struct parse_events_error *err)
602+
typedef int config_term_func_t(struct perf_event_attr *attr,
603+
struct parse_events_term *term,
604+
struct parse_events_error *err);
605+
606+
static int config_term_common(struct perf_event_attr *attr,
607+
struct parse_events_term *term,
608+
struct parse_events_error *err)
605609
{
606610
#define CHECK_TYPE_VAL(type) \
607611
do { \
@@ -610,12 +614,6 @@ do { \
610614
} while (0)
611615

612616
switch (term->type_term) {
613-
case PARSE_EVENTS__TERM_TYPE_USER:
614-
/*
615-
* Always succeed for sysfs terms, as we dont know
616-
* at this point what type they need to have.
617-
*/
618-
return 0;
619617
case PARSE_EVENTS__TERM_TYPE_CONFIG:
620618
CHECK_TYPE_VAL(NUM);
621619
attr->config = term->val.num;
@@ -665,9 +663,24 @@ do { \
665663
#undef CHECK_TYPE_VAL
666664
}
667665

666+
static int config_term_pmu(struct perf_event_attr *attr,
667+
struct parse_events_term *term,
668+
struct parse_events_error *err)
669+
{
670+
if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER)
671+
/*
672+
* Always succeed for sysfs terms, as we dont know
673+
* at this point what type they need to have.
674+
*/
675+
return 0;
676+
else
677+
return config_term_common(attr, term, err);
678+
}
679+
668680
static int config_attr(struct perf_event_attr *attr,
669681
struct list_head *head,
670-
struct parse_events_error *err)
682+
struct parse_events_error *err,
683+
config_term_func_t config_term)
671684
{
672685
struct parse_events_term *term;
673686

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

737750
if (head_config) {
738-
if (config_attr(&attr, head_config, data->error))
751+
if (config_attr(&attr, head_config, data->error,
752+
config_term_common))
739753
return -EINVAL;
740754

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

801815
if (get_config_terms(head_config, &config_terms))

0 commit comments

Comments
 (0)