forked from luck/tmp_suning_uos_patched
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 commit1dc925568f
("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:1dc925568f
("perf parse: Add a deep delete for parse event terms") Suggested-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Leo Yan <leo.yan@linaro.org> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Mathieu Poirier <mathieu.poirier@linaro.org> Cc: Mike Leach <mike.leach@linaro.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Suzuki Poulouse <suzuki.poulose@arm.com> Cc: linux-arm-kernel@lists.infradead.org Link: http://lore.kernel.org/lkml/20200117055251.24058-2-leo.yan@linaro.org [ Use zfree() in perf_evsel__free_config_terms ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> :# modified: tools/perf/util/evsel_config.h
This commit is contained in:
parent
e884602b57
commit
3220fb8d5e
|
@ -1265,6 +1265,8 @@ static void perf_evsel__free_config_terms(struct evsel *evsel)
|
|||
|
||||
list_for_each_entry_safe(term, h, &evsel->config_terms, list) {
|
||||
list_del_init(&term->list);
|
||||
if (term->free_str)
|
||||
zfree(&term->val.str);
|
||||
free(term);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ enum evsel_term_type {
|
|||
struct perf_evsel_config_term {
|
||||
struct list_head list;
|
||||
enum evsel_term_type type;
|
||||
bool free_str;
|
||||
union {
|
||||
u64 period;
|
||||
u64 freq;
|
||||
|
|
|
@ -1240,7 +1240,12 @@ do { \
|
|||
#define ADD_CONFIG_TERM_STR(__type, __val) \
|
||||
do { \
|
||||
ADD_CONFIG_TERM(__type); \
|
||||
__t->val.str = __val; \
|
||||
__t->val.str = strdup(__val); \
|
||||
if (!__t->val.str) { \
|
||||
zfree(&__t); \
|
||||
return -ENOMEM; \
|
||||
} \
|
||||
__t->free_str = true; \
|
||||
} while (0)
|
||||
|
||||
struct parse_events_term *term;
|
||||
|
|
Loading…
Reference in New Issue
Block a user