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;
 
-       list_for_each_entry(pos, &src->config_terms, list) {
+       list_for_each_entry(pos, src, list) {
                tmp = malloc(sizeof(*tmp));
                if (tmp == NULL)
                        return -ENOMEM;
                                return -ENOMEM;
                        }
                }
-               list_add_tail(&tmp->list, &dst->config_terms);
+               list_add_tail(&tmp->list, dst);
        }
        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
  * @orig: original evsel
        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;
 
-       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);
                if (term->free_str)
                        zfree(&term->val.str);
        }
 }
 
+static void evsel__free_config_terms(struct evsel *evsel)
+{
+       free_config_terms(&evsel->config_terms);
+}
+
 void evsel__exit(struct evsel *evsel)
 {
        assert(list_empty(&evsel->core.node));
 
 struct evsel *evsel__clone(struct evsel *orig);
 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.
  */
 
        }
 
        if (!parse_state->fake_pmu && perf_pmu__config(pmu, &attr, head_config, parse_state->error)) {
-               struct evsel_config_term *pos, *tmp;
-
-               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);
-               }
+               free_config_terms(&config_terms);
                return -EINVAL;
        }