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: Adrian Hunter <adrian.hunter@intel.com> Acked-by: Jiri 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: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
eb34363ae1
commit
a7d212fc6c
@ -333,11 +333,11 @@ error_free:
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user