aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2017-02-17 09:00:56 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-02-17 15:28:22 -0500
commit99e7138eb7897aa0ccc6661173ae2d7e79721e05 (patch)
tree6d603e00226f5a25356c0315827701ea6bc96ff8 /tools
parent67b49b38f7bd6f34319b540ce824d5697241b3a8 (diff)
perf tools: Fail on using multiple bits long terms without value
Currently we allow not to specify value for numeric terms and we set them to value 1. This was originaly meant just for single bit terms to allow user to type: $ perf record -e 'cpu/cpu-cycles,any' instead of: $ perf record -e 'cpu/cpu-cycles,any=1' However it works also for multi bits terms like: $ perf record -e 'cpu/event/' ls ... $ perf evlist -v ..., config: 0x1, ... After discussion with Peter we decided making such term usage to fail, like: $ perf record -e 'cpu/event/' ls event syntax error: 'cpu/event/' \___ no value assigned for term ... Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1487340058-10496-4-git-send-email-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/util/parse-events.c2
-rw-r--r--tools/perf/util/parse-events.h2
-rw-r--r--tools/perf/util/parse-events.y14
-rw-r--r--tools/perf/util/pmu.c13
4 files changed, 22 insertions, 9 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 984d99a8fdc5..67a8aebc67ab 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -2349,6 +2349,7 @@ static int new_term(struct parse_events_term **_term,
2349 2349
2350int parse_events_term__num(struct parse_events_term **term, 2350int parse_events_term__num(struct parse_events_term **term,
2351 int type_term, char *config, u64 num, 2351 int type_term, char *config, u64 num,
2352 bool no_value,
2352 void *loc_term_, void *loc_val_) 2353 void *loc_term_, void *loc_val_)
2353{ 2354{
2354 YYLTYPE *loc_term = loc_term_; 2355 YYLTYPE *loc_term = loc_term_;
@@ -2358,6 +2359,7 @@ int parse_events_term__num(struct parse_events_term **term,
2358 .type_val = PARSE_EVENTS__TERM_TYPE_NUM, 2359 .type_val = PARSE_EVENTS__TERM_TYPE_NUM,
2359 .type_term = type_term, 2360 .type_term = type_term,
2360 .config = config, 2361 .config = config,
2362 .no_value = no_value,
2361 .err_term = loc_term ? loc_term->first_column : 0, 2363 .err_term = loc_term ? loc_term->first_column : 0,
2362 .err_val = loc_val ? loc_val->first_column : 0, 2364 .err_val = loc_val ? loc_val->first_column : 0,
2363 }; 2365 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index da246a3ddb69..1af6a267c21b 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -94,6 +94,7 @@ struct parse_events_term {
94 int type_term; 94 int type_term;
95 struct list_head list; 95 struct list_head list;
96 bool used; 96 bool used;
97 bool no_value;
97 98
98 /* error string indexes for within parsed string */ 99 /* error string indexes for within parsed string */
99 int err_term; 100 int err_term;
@@ -122,6 +123,7 @@ void parse_events__shrink_config_terms(void);
122int parse_events__is_hardcoded_term(struct parse_events_term *term); 123int parse_events__is_hardcoded_term(struct parse_events_term *term);
123int parse_events_term__num(struct parse_events_term **term, 124int parse_events_term__num(struct parse_events_term **term,
124 int type_term, char *config, u64 num, 125 int type_term, char *config, u64 num,
126 bool novalue,
125 void *loc_term, void *loc_val); 127 void *loc_term, void *loc_val);
126int parse_events_term__str(struct parse_events_term **term, 128int parse_events_term__str(struct parse_events_term **term,
127 int type_term, char *config, char *str, 129 int type_term, char *config, char *str,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index a14b47ab3879..30f018ea1370 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -252,7 +252,7 @@ PE_KERNEL_PMU_EVENT sep_dc
252 if (!strcasecmp(alias->name, $1)) { 252 if (!strcasecmp(alias->name, $1)) {
253 ALLOC_LIST(head); 253 ALLOC_LIST(head);
254 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, 254 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
255 $1, 1, &@1, NULL)); 255 $1, 1, false, &@1, NULL));
256 list_add_tail(&term->list, head); 256 list_add_tail(&term->list, head);
257 257
258 if (!parse_events_add_pmu(data, list, 258 if (!parse_events_add_pmu(data, list,
@@ -282,7 +282,7 @@ PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
282 282
283 ALLOC_LIST(head); 283 ALLOC_LIST(head);
284 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, 284 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
285 &pmu_name, 1, &@1, NULL)); 285 &pmu_name, 1, false, &@1, NULL));
286 list_add_tail(&term->list, head); 286 list_add_tail(&term->list, head);
287 287
288 ALLOC_LIST(list); 288 ALLOC_LIST(list);
@@ -548,7 +548,7 @@ PE_NAME '=' PE_VALUE
548 struct parse_events_term *term; 548 struct parse_events_term *term;
549 549
550 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, 550 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
551 $1, $3, &@1, &@3)); 551 $1, $3, false, &@1, &@3));
552 $$ = term; 552 $$ = term;
553} 553}
554| 554|
@@ -566,7 +566,7 @@ PE_NAME
566 struct parse_events_term *term; 566 struct parse_events_term *term;
567 567
568 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, 568 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
569 $1, 1, &@1, NULL)); 569 $1, 1, true, &@1, NULL));
570 $$ = term; 570 $$ = term;
571} 571}
572| 572|
@@ -591,7 +591,7 @@ PE_TERM '=' PE_VALUE
591{ 591{
592 struct parse_events_term *term; 592 struct parse_events_term *term;
593 593
594 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, &@1, &@3)); 594 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3));
595 $$ = term; 595 $$ = term;
596} 596}
597| 597|
@@ -599,7 +599,7 @@ PE_TERM
599{ 599{
600 struct parse_events_term *term; 600 struct parse_events_term *term;
601 601
602 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, &@1, NULL)); 602 ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL));
603 $$ = term; 603 $$ = term;
604} 604}
605| 605|
@@ -620,7 +620,7 @@ PE_NAME array '=' PE_VALUE
620 struct parse_events_term *term; 620 struct parse_events_term *term;
621 621
622 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, 622 ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
623 $1, $4, &@1, &@4)); 623 $1, $4, false, &@1, &@4));
624 term->array = $2; 624 term->array = $2;
625 $$ = term; 625 $$ = term;
626} 626}
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 49bfee0e3d9e..63cb46cb9b0f 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -834,9 +834,18 @@ static int pmu_config_term(struct list_head *formats,
834 * Either directly use a numeric term, or try to translate string terms 834 * Either directly use a numeric term, or try to translate string terms
835 * using event parameters. 835 * using event parameters.
836 */ 836 */
837 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) 837 if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) {
838 if (term->no_value &&
839 bitmap_weight(format->bits, PERF_PMU_FORMAT_BITS) > 1) {
840 if (err) {
841 err->idx = term->err_val;
842 err->str = strdup("no value assigned for term");
843 }
844 return -EINVAL;
845 }
846
838 val = term->val.num; 847 val = term->val.num;
839 else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) { 848 } else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
840 if (strcmp(term->val.str, "?")) { 849 if (strcmp(term->val.str, "?")) {
841 if (verbose) { 850 if (verbose) {
842 pr_info("Invalid sysfs entry %s=%s\n", 851 pr_info("Invalid sysfs entry %s=%s\n",