Commit a7d212fc authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf tools: Factor out copy_config_terms() and free_config_terms()

Factor out copy_config_terms() and free_config_terms() so that they can
be reused.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Link: https //lore.kernel.org/r/20210909125508.28693-2-adrian.hunter@intel.com
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent eb34363a
...@@ -333,11 +333,11 @@ struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config) ...@@ -333,11 +333,11 @@ struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config)
goto out; goto out;
} }
static int evsel__copy_config_terms(struct evsel *dst, struct evsel *src) int copy_config_terms(struct list_head *dst, struct list_head *src)
{ {
struct evsel_config_term *pos, *tmp; struct evsel_config_term *pos, *tmp;
list_for_each_entry(pos, &src->config_terms, list) { list_for_each_entry(pos, src, list) {
tmp = malloc(sizeof(*tmp)); tmp = malloc(sizeof(*tmp));
if (tmp == NULL) if (tmp == NULL)
return -ENOMEM; return -ENOMEM;
...@@ -350,11 +350,16 @@ static int evsel__copy_config_terms(struct evsel *dst, struct evsel *src) ...@@ -350,11 +350,16 @@ static int evsel__copy_config_terms(struct evsel *dst, struct evsel *src)
return -ENOMEM; return -ENOMEM;
} }
} }
list_add_tail(&tmp->list, &dst->config_terms); list_add_tail(&tmp->list, dst);
} }
return 0; return 0;
} }
static int evsel__copy_config_terms(struct evsel *dst, struct evsel *src)
{
return copy_config_terms(&dst->config_terms, &src->config_terms);
}
/** /**
* evsel__clone - create a new evsel copied from @orig * evsel__clone - create a new evsel copied from @orig
* @orig: original evsel * @orig: original evsel
...@@ -1385,11 +1390,11 @@ int evsel__disable(struct evsel *evsel) ...@@ -1385,11 +1390,11 @@ int evsel__disable(struct evsel *evsel)
return err; return err;
} }
static void evsel__free_config_terms(struct evsel *evsel) void free_config_terms(struct list_head *config_terms)
{ {
struct evsel_config_term *term, *h; struct evsel_config_term *term, *h;
list_for_each_entry_safe(term, h, &evsel->config_terms, list) { list_for_each_entry_safe(term, h, config_terms, list) {
list_del_init(&term->list); list_del_init(&term->list);
if (term->free_str) if (term->free_str)
zfree(&term->val.str); zfree(&term->val.str);
...@@ -1397,6 +1402,11 @@ static void evsel__free_config_terms(struct evsel *evsel) ...@@ -1397,6 +1402,11 @@ static void evsel__free_config_terms(struct evsel *evsel)
} }
} }
static void evsel__free_config_terms(struct evsel *evsel)
{
free_config_terms(&evsel->config_terms);
}
void evsel__exit(struct evsel *evsel) void evsel__exit(struct evsel *evsel)
{ {
assert(list_empty(&evsel->core.node)); assert(list_empty(&evsel->core.node));
......
...@@ -213,6 +213,9 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr) ...@@ -213,6 +213,9 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr)
struct evsel *evsel__clone(struct evsel *orig); struct evsel *evsel__clone(struct evsel *orig);
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx); struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
int copy_config_terms(struct list_head *dst, struct list_head *src);
void free_config_terms(struct list_head *config_terms);
/* /*
* Returns pointer with encoded error via <linux/err.h> interface. * Returns pointer with encoded error via <linux/err.h> interface.
*/ */
......
...@@ -1608,14 +1608,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state, ...@@ -1608,14 +1608,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
} }
if (!parse_state->fake_pmu && perf_pmu__config(pmu, &attr, head_config, parse_state->error)) { if (!parse_state->fake_pmu && perf_pmu__config(pmu, &attr, head_config, parse_state->error)) {
struct evsel_config_term *pos, *tmp; free_config_terms(&config_terms);
list_for_each_entry_safe(pos, tmp, &config_terms, list) {
list_del_init(&pos->list);
if (pos->free_str)
zfree(&pos->val.str);
free(pos);
}
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment