Commit 3b0e371c authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf tools: Add static terms support for parse_events_error

Allowing static terms like 'name,period,config,config1..' processing to
report back error.

  $ perf record -e 'cpu/event=1,name=1/' ls
  event syntax error: '..=1,name=1/'
                                 \___ expected string value

  $ perf record -e 'cpu/event=1,period=krava/' ls
  event syntax error: '..,period=krava/'
                                 \___ expected numeric value

  $ perf record -e 'cpu/config=krava1/' ls
  event syntax error: '../config=krava1/'
                                 \___ expected numeric value
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1429729824-13932-8-git-send-email-jolsa@kernel.org
[ Renamed 'error' variables to 'err', not to clash with util.h error() ]
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent e64b020b
...@@ -545,13 +545,31 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx, ...@@ -545,13 +545,31 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx,
return add_event(list, idx, &attr, NULL); return add_event(list, idx, &attr, NULL);
} }
static int check_type_val(struct parse_events_term *term,
struct parse_events_error *err,
int type)
{
if (type == term->type_val)
return 0;
if (err) {
err->idx = term->err_val;
if (type == PARSE_EVENTS__TERM_TYPE_NUM)
err->str = strdup("expected numeric value");
else
err->str = strdup("expected string value");
}
return -EINVAL;
}
static int config_term(struct perf_event_attr *attr, static int config_term(struct perf_event_attr *attr,
struct parse_events_term *term) struct parse_events_term *term,
struct parse_events_error *err)
{ {
#define CHECK_TYPE_VAL(type) \ #define CHECK_TYPE_VAL(type) \
do { \ do { \
if (PARSE_EVENTS__TERM_TYPE_ ## type != term->type_val) \ if (check_type_val(term, err, PARSE_EVENTS__TERM_TYPE_ ## type)) \
return -EINVAL; \ return -EINVAL; \
} while (0) } while (0)
switch (term->type_term) { switch (term->type_term) {
...@@ -595,12 +613,13 @@ do { \ ...@@ -595,12 +613,13 @@ do { \
} }
static int config_attr(struct perf_event_attr *attr, static int config_attr(struct perf_event_attr *attr,
struct list_head *head) struct list_head *head,
struct parse_events_error *err)
{ {
struct parse_events_term *term; struct parse_events_term *term;
list_for_each_entry(term, head, list) list_for_each_entry(term, head, list)
if (config_term(attr, term)) if (config_term(attr, term, err))
return -EINVAL; return -EINVAL;
return 0; return 0;
...@@ -617,7 +636,7 @@ int parse_events_add_numeric(struct list_head *list, int *idx, ...@@ -617,7 +636,7 @@ int parse_events_add_numeric(struct list_head *list, int *idx,
attr.config = config; attr.config = config;
if (head_config && if (head_config &&
config_attr(&attr, head_config)) config_attr(&attr, head_config, NULL))
return -EINVAL; return -EINVAL;
return add_event(list, idx, &attr, NULL); return add_event(list, idx, &attr, NULL);
...@@ -672,7 +691,7 @@ int parse_events_add_pmu(struct parse_events_evlist *data, ...@@ -672,7 +691,7 @@ int parse_events_add_pmu(struct parse_events_evlist *data,
* Configure hardcoded terms first, no need to check * Configure hardcoded terms first, no need to check
* return value when called with fail == 0 ;) * return value when called with fail == 0 ;)
*/ */
if (config_attr(&attr, head_config)) if (config_attr(&attr, head_config, data->error))
return -EINVAL; return -EINVAL;
if (perf_pmu__config(pmu, &attr, head_config, data->error)) if (perf_pmu__config(pmu, &attr, head_config, data->error))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment