Skip to content

Commit 3220fb8

Browse files
Leo Yanacmel
authored andcommitted
perf parse: Copy string to perf_evsel_config_term
perf with CoreSight fails to record trace data with command: perf record -e cs_etm/@tmc_etr0/u --per-thread ls failed to set sink "" on event cs_etm/@tmc_etr0/u with 21 (Is a directory)/perf/ This failure is root caused with the commit 1dc9255 ("perf parse: Add a deep delete for parse event terms"). The log shows, cs_etm fails to parse the sink attribution; cs_etm event relies on the event configuration to pass sink name, but the event specific configuration data cannot be passed properly with flow: get_config_terms() ADD_CONFIG_TERM(DRV_CFG, term->val.str); __t->val.str = term->val.str; `> __t->val.str is assigned to term->val.str; parse_events_terms__purge() parse_events_term__delete() zfree(&term->val.str); `> term->val.str is freed and assigned to NULL pointer; cs_etm_set_sink_attr() sink = __t->val.str; `> sink string has been freed. To fix this issue, in the function get_config_terms(), this patch changes to use strdup() for allocation a new duplicate string rather than directly assignment string pointer. This patch addes a new field 'free_str' in the data structure perf_evsel_config_term; 'free_str' is set to true when the union is used as a string pointer; thus it can tell perf_evsel__free_config_terms() to free the string. Fixes: 1dc9255 ("perf parse: Add a deep delete for parse event terms") Suggested-by: Jiri Olsa <[email protected]> Signed-off-by: Leo Yan <[email protected]> Acked-by: Jiri Olsa <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Mathieu Poirier <[email protected]> Cc: Mike Leach <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Suzuki Poulouse <[email protected]> Cc: [email protected] Link: http://lore.kernel.org/lkml/[email protected] [ Use zfree() in perf_evsel__free_config_terms ] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]> :# modified: tools/perf/util/evsel_config.h
1 parent e884602 commit 3220fb8

File tree

3 files changed

+9
-1
lines changed

3 files changed

+9
-1
lines changed

tools/perf/util/evsel.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,6 +1265,8 @@ static void perf_evsel__free_config_terms(struct evsel *evsel)
12651265

12661266
list_for_each_entry_safe(term, h, &evsel->config_terms, list) {
12671267
list_del_init(&term->list);
1268+
if (term->free_str)
1269+
zfree(&term->val.str);
12681270
free(term);
12691271
}
12701272
}

tools/perf/util/evsel_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ enum evsel_term_type {
3232
struct perf_evsel_config_term {
3333
struct list_head list;
3434
enum evsel_term_type type;
35+
bool free_str;
3536
union {
3637
u64 period;
3738
u64 freq;

tools/perf/util/parse-events.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1240,7 +1240,12 @@ do { \
12401240
#define ADD_CONFIG_TERM_STR(__type, __val) \
12411241
do { \
12421242
ADD_CONFIG_TERM(__type); \
1243-
__t->val.str = __val; \
1243+
__t->val.str = strdup(__val); \
1244+
if (!__t->val.str) { \
1245+
zfree(&__t); \
1246+
return -ENOMEM; \
1247+
} \
1248+
__t->free_str = true; \
12441249
} while (0)
12451250

12461251
struct parse_events_term *term;

0 commit comments

Comments
 (0)