Skip to content

Commit 64199ae

Browse files
captain5050acmel
authored andcommitted
perf parse-events: Fix propagation of term's no_value when cloning
The no_value field in 'struct parse_events_term' indicates that the val variable isn't used, the case for an event name. Cloning wasn't propagating this, making cloned event name terms appearing to have a constant assinged to them. Working around the bug would check for a value of 1 assigned to value, but then this meant a user value of 1 couldn't be differentiated causing the value to be lost in debug printing and perf list. The change fixes the cloning and updates the "val.num ==/!= 1" tests to use no_value instead. To better check the no_value is set appropriately parameter comments are added for constant values. This found that no_value wasn't set correctly in parse_events_multi_pmu_add, which matters now that no_value is used to indicate an event name. Fixes: 7a6e916 ("perf parse-events: Make common term list to strbuf helper") Fixes: 99e7138 ("perf tools: Fail on using multiple bits long terms without value") Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: Kan Liang <kan.liang@linux.intel.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rob Herring <robh@kernel.org> Link: https://lore.kernel.org/r/20230831071421.2201358-4-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent 58d3a4c commit 64199ae

File tree

3 files changed

+19
-21
lines changed

3 files changed

+19
-21
lines changed

tools/perf/util/parse-events.c

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1510,8 +1510,8 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
15101510

15111511
if (parse_events_term__num(&term,
15121512
PARSE_EVENTS__TERM_TYPE_USER,
1513-
config, 1, false, NULL,
1514-
NULL) < 0) {
1513+
config, /*num=*/1, /*novalue=*/true,
1514+
loc, /*loc_val=*/NULL) < 0) {
15151515
zfree(&config);
15161516
goto out_err;
15171517
}
@@ -2482,7 +2482,7 @@ int parse_events_term__num(struct parse_events_term **term,
24822482
.err_val = loc_val ? loc_val->first_column : 0,
24832483
};
24842484

2485-
return new_term(term, &temp, NULL, num);
2485+
return new_term(term, &temp, /*str=*/NULL, num);
24862486
}
24872487

24882488
int parse_events_term__str(struct parse_events_term **term,
@@ -2501,7 +2501,7 @@ int parse_events_term__str(struct parse_events_term **term,
25012501
.err_val = loc_val ? loc_val->first_column : 0,
25022502
};
25032503

2504-
return new_term(term, &temp, str, 0);
2504+
return new_term(term, &temp, str, /*num=*/0);
25052505
}
25062506

25072507
int parse_events_term__term(struct parse_events_term **term,
@@ -2518,26 +2518,21 @@ int parse_events_term__clone(struct parse_events_term **new,
25182518
struct parse_events_term *term)
25192519
{
25202520
char *str;
2521-
struct parse_events_term temp = {
2522-
.type_val = term->type_val,
2523-
.type_term = term->type_term,
2524-
.config = NULL,
2525-
.err_term = term->err_term,
2526-
.err_val = term->err_val,
2527-
};
2521+
struct parse_events_term temp = *term;
25282522

2523+
temp.used = false;
25292524
if (term->config) {
25302525
temp.config = strdup(term->config);
25312526
if (!temp.config)
25322527
return -ENOMEM;
25332528
}
25342529
if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
2535-
return new_term(new, &temp, NULL, term->val.num);
2530+
return new_term(new, &temp, /*str=*/NULL, term->val.num);
25362531

25372532
str = strdup(term->val.str);
25382533
if (!str)
25392534
return -ENOMEM;
2540-
return new_term(new, &temp, str, 0);
2535+
return new_term(new, &temp, str, /*num=*/0);
25412536
}
25422537

25432538
void parse_events_term__delete(struct parse_events_term *term)
@@ -2611,20 +2606,22 @@ int parse_events_term__to_strbuf(struct list_head *term_list, struct strbuf *sb)
26112606
first = false;
26122607

26132608
if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
2614-
if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER && term->val.num == 1)
2609+
if (term->no_value) {
2610+
assert(term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
26152611
ret = strbuf_addf(sb, "%s", term->config);
2616-
else
2612+
} else
26172613
ret = strbuf_addf(sb, "%s=%#"PRIx64, term->config, term->val.num);
26182614
else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
26192615
if (term->config) {
26202616
ret = strbuf_addf(sb, "%s=", term->config);
26212617
if (ret < 0)
26222618
return ret;
2623-
} else if (term->type_term < __PARSE_EVENTS__TERM_TYPE_NR) {
2619+
} else if ((unsigned int)term->type_term < __PARSE_EVENTS__TERM_TYPE_NR) {
26242620
ret = strbuf_addf(sb, "%s=", config_term_name(term->type_term));
26252621
if (ret < 0)
26262622
return ret;
26272623
}
2624+
assert(!term->no_value);
26282625
ret = strbuf_addf(sb, "%s", term->val.str);
26292626
}
26302627
if (ret < 0)

tools/perf/util/parse-events.y

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,7 @@ name_or_raw '=' PE_VALUE
712712
{
713713
struct parse_events_term *term;
714714
int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
715-
$1, $3, false, &@1, &@3);
715+
$1, $3, /*novalue=*/false, &@1, &@3);
716716

717717
if (err) {
718718
free($1);
@@ -739,7 +739,7 @@ PE_LEGACY_CACHE
739739
{
740740
struct parse_events_term *term;
741741
int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE,
742-
$1, 1, true, &@1, NULL);
742+
$1, /*num=*/1, /*novalue=*/true, &@1, /*loc_val=*/NULL);
743743

744744
if (err) {
745745
free($1);
@@ -752,7 +752,7 @@ PE_NAME
752752
{
753753
struct parse_events_term *term;
754754
int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
755-
$1, 1, true, &@1, NULL);
755+
$1, /*num=*/1, /*novalue=*/true, &@1, /*loc_val=*/NULL);
756756

757757
if (err) {
758758
free($1);
@@ -765,7 +765,8 @@ PE_TERM_HW
765765
{
766766
struct parse_events_term *term;
767767
int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_HARDWARE,
768-
$1.str, $1.num & 255, false, &@1, NULL);
768+
$1.str, $1.num & 255, /*novalue=*/false,
769+
&@1, /*loc_val=*/NULL);
769770

770771
if (err) {
771772
free($1.str);

tools/perf/util/pmu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1396,7 +1396,7 @@ static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu,
13961396
return NULL;
13971397

13981398
if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) {
1399-
if (term->val.num != 1)
1399+
if (!term->no_value)
14001400
return NULL;
14011401
if (pmu_find_format(&pmu->format, term->config))
14021402
return NULL;

0 commit comments

Comments
 (0)