]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - tools/perf/util/parse-events.c
Merge branches 'pm-core', 'pm-qos', 'pm-domains' and 'pm-opp'
[linux.git] / tools / perf / util / parse-events.c
index 3c876b8ba4de68afaf312e4bc6df07a4b58f0211..281e44af31e2fb0b2e32928290f3c4cdfd03cccf 100644 (file)
@@ -211,6 +211,8 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config)
                                closedir(evt_dir);
                                closedir(sys_dir);
                                path = zalloc(sizeof(*path));
+                               if (!path)
+                                       return NULL;
                                path->system = malloc(MAX_EVENT_LENGTH);
                                if (!path->system) {
                                        free(path);
@@ -252,8 +254,7 @@ struct tracepoint_path *tracepoint_name_to_path(const char *name)
        if (path->system == NULL || path->name == NULL) {
                zfree(&path->system);
                zfree(&path->name);
-               free(path);
-               path = NULL;
+               zfree(&path);
        }
 
        return path;
@@ -310,10 +311,11 @@ __add_event(struct list_head *list, int *idx,
 
        event_attr_init(attr);
 
-       evsel = perf_evsel__new_idx(attr, (*idx)++);
+       evsel = perf_evsel__new_idx(attr, *idx);
        if (!evsel)
                return NULL;
 
+       (*idx)++;
        evsel->cpus     = cpu_map__get(cpus);
        evsel->own_cpus = cpu_map__get(cpus);
 
@@ -1477,10 +1479,9 @@ static void perf_pmu__parse_cleanup(void)
 
                for (i = 0; i < perf_pmu_events_list_num; i++) {
                        p = perf_pmu_events_list + i;
-                       free(p->symbol);
+                       zfree(&p->symbol);
                }
-               free(perf_pmu_events_list);
-               perf_pmu_events_list = NULL;
+               zfree(&perf_pmu_events_list);
                perf_pmu_events_list_num = 0;
        }
 }
@@ -1504,35 +1505,41 @@ static void perf_pmu__parse_init(void)
        struct perf_pmu_alias *alias;
        int len = 0;
 
-       pmu = perf_pmu__find("cpu");
-       if ((pmu == NULL) || list_empty(&pmu->aliases)) {
+       pmu = NULL;
+       while ((pmu = perf_pmu__scan(pmu)) != NULL) {
+               list_for_each_entry(alias, &pmu->aliases, list) {
+                       if (strchr(alias->name, '-'))
+                               len++;
+                       len++;
+               }
+       }
+
+       if (len == 0) {
                perf_pmu_events_list_num = -1;
                return;
        }
-       list_for_each_entry(alias, &pmu->aliases, list) {
-               if (strchr(alias->name, '-'))
-                       len++;
-               len++;
-       }
        perf_pmu_events_list = malloc(sizeof(struct perf_pmu_event_symbol) * len);
        if (!perf_pmu_events_list)
                return;
        perf_pmu_events_list_num = len;
 
        len = 0;
-       list_for_each_entry(alias, &pmu->aliases, list) {
-               struct perf_pmu_event_symbol *p = perf_pmu_events_list + len;
-               char *tmp = strchr(alias->name, '-');
-
-               if (tmp != NULL) {
-                       SET_SYMBOL(strndup(alias->name, tmp - alias->name),
-                                       PMU_EVENT_SYMBOL_PREFIX);
-                       p++;
-                       SET_SYMBOL(strdup(++tmp), PMU_EVENT_SYMBOL_SUFFIX);
-                       len += 2;
-               } else {
-                       SET_SYMBOL(strdup(alias->name), PMU_EVENT_SYMBOL);
-                       len++;
+       pmu = NULL;
+       while ((pmu = perf_pmu__scan(pmu)) != NULL) {
+               list_for_each_entry(alias, &pmu->aliases, list) {
+                       struct perf_pmu_event_symbol *p = perf_pmu_events_list + len;
+                       char *tmp = strchr(alias->name, '-');
+
+                       if (tmp != NULL) {
+                               SET_SYMBOL(strndup(alias->name, tmp - alias->name),
+                                               PMU_EVENT_SYMBOL_PREFIX);
+                               p++;
+                               SET_SYMBOL(strdup(++tmp), PMU_EVENT_SYMBOL_SUFFIX);
+                               len += 2;
+                       } else {
+                               SET_SYMBOL(strdup(alias->name), PMU_EVENT_SYMBOL);
+                               len++;
+                       }
                }
        }
        qsort(perf_pmu_events_list, len,
@@ -1563,7 +1570,7 @@ perf_pmu__parse_check(const char *name)
        r = bsearch(&p, perf_pmu_events_list,
                        (size_t) perf_pmu_events_list_num,
                        sizeof(struct perf_pmu_event_symbol), comp_pmu);
-       free(p.symbol);
+       zfree(&p.symbol);
        return r ? r->type : PMU_EVENT_SYMBOL_ERR;
 }
 
@@ -1710,8 +1717,8 @@ static void parse_events_print_error(struct parse_events_error *err,
                fprintf(stderr, "%*s\\___ %s\n", idx + 1, "", err->str);
                if (err->help)
                        fprintf(stderr, "\n%s\n", err->help);
-               free(err->str);
-               free(err->help);
+               zfree(&err->str);
+               zfree(&err->help);
        }
 
        fprintf(stderr, "Run 'perf list' for a list of valid events\n");
@@ -2013,17 +2020,14 @@ static bool is_event_supported(u8 type, unsigned config)
                .config = config,
                .disabled = 1,
        };
-       struct {
-               struct thread_map map;
-               int threads[1];
-       } tmap = {
-               .map.nr  = 1,
-               .threads = { 0 },
-       };
+       struct thread_map *tmap = thread_map__new_by_tid(0);
+
+       if (tmap == NULL)
+               return false;
 
        evsel = perf_evsel__new(&attr);
        if (evsel) {
-               open_return = perf_evsel__open(evsel, NULL, &tmap.map);
+               open_return = perf_evsel__open(evsel, NULL, tmap);
                ret = open_return >= 0;
 
                if (open_return == -EACCES) {
@@ -2035,7 +2039,7 @@ static bool is_event_supported(u8 type, unsigned config)
                         *
                         */
                        evsel->attr.exclude_kernel = 1;
-                       ret = perf_evsel__open(evsel, NULL, &tmap.map) >= 0;
+                       ret = perf_evsel__open(evsel, NULL, tmap) >= 0;
                }
                perf_evsel__delete(evsel);
        }
@@ -2406,7 +2410,7 @@ void parse_events_terms__purge(struct list_head *terms)
 
        list_for_each_entry_safe(term, h, terms, list) {
                if (term->array.nr_ranges)
-                       free(term->array.ranges);
+                       zfree(&term->array.ranges);
                list_del_init(&term->list);
                free(term);
        }
@@ -2422,7 +2426,7 @@ void parse_events_terms__delete(struct list_head *terms)
 
 void parse_events__clear_array(struct parse_events_array *a)
 {
-       free(a->ranges);
+       zfree(&a->ranges);
 }
 
 void parse_events_evlist_error(struct parse_events_evlist *data,