Skip to content

Commit 7a6e916

Browse files
captain5050acmel
authored andcommitted
perf parse-events: Make common term list to strbuf helper
A term list is turned into a string for debug output and for the str value in the alias. Add a helper to do this based on existing code, but then fix for situations like events being identified. Use strbuf to manage the dynamic memory allocation and remove the 256 byte limit. Use in various places the string of the term list is required. Before: $ sudo perf stat -vv -e inst_retired.any true Using CPUID GenuineIntel-6-8D-1 intel_pt default config: tsc,mtc,mtc_period=3,psb_period=3,pt,branch Attempting to add event pmu 'cpu' with 'inst_retired.any,' that may result in non-fatal errors After aliases, add event pmu 'cpu' with 'event,period,' that may result in non-fatal errors inst_retired.any -> cpu/inst_retired.any/ ... After: $ sudo perf stat -vv -e inst_retired.any true Using CPUID GenuineIntel-6-8D-1 intel_pt default config: tsc,mtc,mtc_period=3,psb_period=3,pt,branch Attempt to add: cpu/inst_retired.any/ ..after resolving event: cpu/event=0xc0,period=0x1e8483/ inst_retired.any -> cpu/event=0xc0,period=0x1e8483/ ... Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lore.kernel.org/lkml/20230830070753.1821629-2-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent 6beb6cf commit 7a6e916

File tree

3 files changed

+81
-41
lines changed

3 files changed

+81
-41
lines changed

tools/perf/util/parse-events.c

Lines changed: 75 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include <subcmd/parse-options.h>
1414
#include "parse-events.h"
1515
#include "string2.h"
16-
#include "strlist.h"
16+
#include "strbuf.h"
1717
#include "debug.h"
1818
#include <api/fs/tracing_path.h>
1919
#include <perf/cpumap.h>
@@ -1303,19 +1303,6 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
13031303

13041304
pmu = parse_state->fake_pmu ?: perf_pmus__find(name);
13051305

1306-
if (verbose > 1 && !(pmu && pmu->selectable)) {
1307-
fprintf(stderr, "Attempting to add event pmu '%s' with '",
1308-
name);
1309-
if (head_config) {
1310-
struct parse_events_term *term;
1311-
1312-
list_for_each_entry(term, head_config, list) {
1313-
fprintf(stderr, "%s,", term->config);
1314-
}
1315-
}
1316-
fprintf(stderr, "' that may result in non-fatal errors\n");
1317-
}
1318-
13191306
if (!pmu) {
13201307
char *err_str;
13211308

@@ -1325,6 +1312,21 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
13251312
parse_events_error__handle(err, loc->first_column, err_str, NULL);
13261313
return -EINVAL;
13271314
}
1315+
1316+
if (verbose > 1) {
1317+
struct strbuf sb;
1318+
1319+
strbuf_init(&sb, /*hint=*/ 0);
1320+
if (pmu->selectable && !head_config) {
1321+
strbuf_addf(&sb, "%s//", name);
1322+
} else {
1323+
strbuf_addf(&sb, "%s/", name);
1324+
parse_events_term__to_strbuf(head_config, &sb);
1325+
strbuf_addch(&sb, '/');
1326+
}
1327+
fprintf(stderr, "Attempt to add: %s\n", sb.buf);
1328+
strbuf_release(&sb);
1329+
}
13281330
if (head_config)
13291331
fix_raw(head_config, pmu);
13301332

@@ -1349,16 +1351,12 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
13491351
return -EINVAL;
13501352

13511353
if (verbose > 1) {
1352-
fprintf(stderr, "After aliases, add event pmu '%s' with '",
1353-
name);
1354-
if (head_config) {
1355-
struct parse_events_term *term;
1354+
struct strbuf sb;
13561355

1357-
list_for_each_entry(term, head_config, list) {
1358-
fprintf(stderr, "%s,", term->config);
1359-
}
1360-
}
1361-
fprintf(stderr, "' that may result in non-fatal errors\n");
1356+
strbuf_init(&sb, /*hint=*/ 0);
1357+
parse_events_term__to_strbuf(head_config, &sb);
1358+
fprintf(stderr, "..after resolving event: %s/%s/\n", name, sb.buf);
1359+
strbuf_release(&sb);
13621360
}
13631361

13641362
/*
@@ -1460,7 +1458,12 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
14601458
parse_events_copy_term_list(head, &orig_head);
14611459
if (!parse_events_add_pmu(parse_state, list, pmu->name,
14621460
orig_head, auto_merge_stats, loc)) {
1463-
pr_debug("%s -> %s/%s/\n", str, pmu->name, str);
1461+
struct strbuf sb;
1462+
1463+
strbuf_init(&sb, /*hint=*/ 0);
1464+
parse_events_term__to_strbuf(orig_head, &sb);
1465+
pr_debug("%s -> %s/%s/\n", str, pmu->name, sb.buf);
1466+
strbuf_release(&sb);
14641467
ok++;
14651468
}
14661469
parse_events_terms__delete(orig_head);
@@ -1469,7 +1472,12 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
14691472
if (parse_state->fake_pmu) {
14701473
if (!parse_events_add_pmu(parse_state, list, str, head,
14711474
/*auto_merge_stats=*/true, loc)) {
1472-
pr_debug("%s -> %s/%s/\n", str, "fake_pmu", str);
1475+
struct strbuf sb;
1476+
1477+
strbuf_init(&sb, /*hint=*/ 0);
1478+
parse_events_term__to_strbuf(head, &sb);
1479+
pr_debug("%s -> %s/%s/\n", str, "fake_pmu", sb.buf);
1480+
strbuf_release(&sb);
14731481
ok++;
14741482
}
14751483
}
@@ -2085,7 +2093,7 @@ void parse_events_error__handle(struct parse_events_error *err, int idx,
20852093
break;
20862094
default:
20872095
pr_debug("Multiple errors dropping message: %s (%s)\n",
2088-
err->str, err->help);
2096+
err->str, err->help ?: "<no help>");
20892097
free(err->str);
20902098
err->str = str;
20912099
free(err->help);
@@ -2502,6 +2510,47 @@ void parse_events_terms__delete(struct list_head *terms)
25022510
free(terms);
25032511
}
25042512

2513+
int parse_events_term__to_strbuf(struct list_head *term_list, struct strbuf *sb)
2514+
{
2515+
struct parse_events_term *term;
2516+
bool first = true;
2517+
2518+
if (!term_list)
2519+
return 0;
2520+
2521+
list_for_each_entry(term, term_list, list) {
2522+
int ret;
2523+
2524+
if (!first) {
2525+
ret = strbuf_addch(sb, ',');
2526+
if (ret < 0)
2527+
return ret;
2528+
}
2529+
first = false;
2530+
2531+
if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
2532+
if (term->type_term == PARSE_EVENTS__TERM_TYPE_USER && term->val.num == 1)
2533+
ret = strbuf_addf(sb, "%s", term->config);
2534+
else
2535+
ret = strbuf_addf(sb, "%s=%#"PRIx64, term->config, term->val.num);
2536+
else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
2537+
if (term->config) {
2538+
ret = strbuf_addf(sb, "%s=", term->config);
2539+
if (ret < 0)
2540+
return ret;
2541+
} else if (term->type_term < __PARSE_EVENTS__TERM_TYPE_NR) {
2542+
ret = strbuf_addf(sb, "%s=", config_term_names[term->type_term]);
2543+
if (ret < 0)
2544+
return ret;
2545+
}
2546+
ret = strbuf_addf(sb, "%s", term->val.str);
2547+
}
2548+
if (ret < 0)
2549+
return ret;
2550+
}
2551+
return 0;
2552+
}
2553+
25052554
void parse_events_evlist_error(struct parse_events_state *parse_state,
25062555
int idx, const char *str)
25072556
{

tools/perf/util/parse-events.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct parse_events_error;
1818

1919
struct option;
2020
struct perf_pmu;
21+
struct strbuf;
2122

2223
const char *event_type(int type);
2324

@@ -152,6 +153,7 @@ int parse_events_term__clone(struct parse_events_term **new,
152153
void parse_events_term__delete(struct parse_events_term *term);
153154
void parse_events_terms__delete(struct list_head *terms);
154155
void parse_events_terms__purge(struct list_head *terms);
156+
int parse_events_term__to_strbuf(struct list_head *term_list, struct strbuf *sb);
155157
int parse_events__modifier_event(struct list_head *list, char *str, bool add);
156158
int parse_events__modifier_group(struct list_head *list, char *event_mod);
157159
int parse_events_name(struct list_head *list, const char *name);

tools/perf/util/pmu.c

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -507,12 +507,11 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name,
507507
const char *desc, const char *val, FILE *val_fd,
508508
const struct pmu_event *pe)
509509
{
510-
struct parse_events_term *term;
511510
struct perf_pmu_alias *alias;
512511
int ret;
513-
char newval[256];
514512
const char *long_desc = NULL, *topic = NULL, *unit = NULL, *pmu_name = NULL;
515513
bool deprecated = false, perpkg = false;
514+
struct strbuf sb;
516515

517516
if (perf_pmu__find_alias(pmu, name, /*load=*/ false)) {
518517
/* Alias was already created/loaded. */
@@ -582,20 +581,10 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name,
582581
*
583582
* Rebuild string to make alias->str member comparable.
584583
*/
585-
ret = 0;
586-
list_for_each_entry(term, &alias->terms, list) {
587-
if (ret)
588-
ret += scnprintf(newval + ret, sizeof(newval) - ret,
589-
",");
590-
if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
591-
ret += scnprintf(newval + ret, sizeof(newval) - ret,
592-
"%s=%#x", term->config, term->val.num);
593-
else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR)
594-
ret += scnprintf(newval + ret, sizeof(newval) - ret,
595-
"%s=%s", term->config, term->val.str);
596-
}
597584
zfree(&alias->str);
598-
alias->str = strdup(newval);
585+
strbuf_init(&sb, /*hint=*/ 0);
586+
parse_events_term__to_strbuf(&alias->terms, &sb);
587+
alias->str = strbuf_detach(&sb, /*sz=*/ NULL);
599588
if (!pe)
600589
pmu->sysfs_aliases++;
601590
else

0 commit comments

Comments
 (0)