libperf: Add perf_cpu_map__get()/perf_cpu_map__put()
[linux-2.6-block.git] / tools / perf / util / parse-events.c
index 371ff3aee769af09e342d052b26fb95bcebb938a..8c9928feb38a1666b9c8bec5a4f93a5f848261c7 100644 (file)
@@ -314,15 +314,15 @@ static char *get_config_name(struct list_head *head_terms)
        return NULL;
 }
 
-static struct perf_evsel *
+static struct evsel *
 __add_event(struct list_head *list, int *idx,
            struct perf_event_attr *attr,
            char *name, struct perf_pmu *pmu,
            struct list_head *config_terms, bool auto_merge_stats,
            const char *cpu_list)
 {
-       struct perf_evsel *evsel;
-       struct cpu_map *cpus = pmu ? pmu->cpus :
+       struct evsel *evsel;
+       struct perf_cpu_map *cpus = pmu ? pmu->cpus :
                               cpu_list ? cpu_map__new(cpu_list) : NULL;
 
        event_attr_init(attr);
@@ -332,8 +332,8 @@ __add_event(struct list_head *list, int *idx,
                return NULL;
 
        (*idx)++;
-       evsel->cpus        = cpu_map__get(cpus);
-       evsel->own_cpus    = cpu_map__get(cpus);
+       evsel->cpus        = perf_cpu_map__get(cpus);
+       evsel->own_cpus    = perf_cpu_map__get(cpus);
        evsel->system_wide = pmu ? pmu->is_uncore : false;
        evsel->auto_merge_stats = auto_merge_stats;
 
@@ -357,7 +357,7 @@ static int add_event(struct list_head *list, int *idx,
 static int add_event_tool(struct list_head *list, int *idx,
                          enum perf_tool_event tool_event)
 {
-       struct perf_evsel *evsel;
+       struct evsel *evsel;
        struct perf_event_attr attr = {
                .type = PERF_TYPE_SOFTWARE,
                .config = PERF_COUNT_SW_DUMMY,
@@ -510,7 +510,7 @@ static int add_tracepoint(struct list_head *list, int *idx,
                          struct parse_events_error *err,
                          struct list_head *head_config)
 {
-       struct perf_evsel *evsel;
+       struct evsel *evsel;
 
        evsel = perf_evsel__newtp_idx(sys_name, evt_name, (*idx)++);
        if (IS_ERR(evsel)) {
@@ -630,15 +630,24 @@ struct __add_bpf_event_param {
        struct list_head *head_config;
 };
 
-static int add_bpf_event(const char *group, const char *event, int fd,
+static int add_bpf_event(const char *group, const char *event, int fd, struct bpf_object *obj,
                         void *_param)
 {
        LIST_HEAD(new_evsels);
        struct __add_bpf_event_param *param = _param;
        struct parse_events_state *parse_state = param->parse_state;
        struct list_head *list = param->list;
-       struct perf_evsel *pos;
+       struct evsel *pos;
        int err;
+       /*
+        * Check if we should add the event, i.e. if it is a TP but starts with a '!',
+        * then don't add the tracepoint, this will be used for something else, like
+        * adding to a BPF_MAP_TYPE_PROG_ARRAY.
+        *
+        * See tools/perf/examples/bpf/augmented_raw_syscalls.c
+        */
+       if (group[0] == '!')
+               return 0;
 
        pr_debug("add bpf event %s:%s and attach bpf program %d\n",
                 group, event, fd);
@@ -647,13 +656,13 @@ static int add_bpf_event(const char *group, const char *event, int fd,
                                          event, parse_state->error,
                                          param->head_config);
        if (err) {
-               struct perf_evsel *evsel, *tmp;
+               struct evsel *evsel, *tmp;
 
                pr_debug("Failed to add BPF event %s:%s\n",
                         group, event);
                list_for_each_entry_safe(evsel, tmp, &new_evsels, node) {
                        list_del_init(&evsel->node);
-                       perf_evsel__delete(evsel);
+                       evsel__delete(evsel);
                }
                return err;
        }
@@ -663,6 +672,7 @@ static int add_bpf_event(const char *group, const char *event, int fd,
                pr_debug("adding %s:%s to %p\n",
                         group, event, pos);
                pos->bpf_fd = fd;
+               pos->bpf_obj = obj;
        }
        list_splice(&new_evsels, list);
        return 0;
@@ -1296,7 +1306,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
        struct perf_event_attr attr;
        struct perf_pmu_info info;
        struct perf_pmu *pmu;
-       struct perf_evsel *evsel;
+       struct evsel *evsel;
        struct parse_events_error *err = parse_state->error;
        bool use_uncore_alias;
        LIST_HEAD(config_terms);
@@ -1443,13 +1453,13 @@ static int
 parse_events__set_leader_for_uncore_aliase(char *name, struct list_head *list,
                                           struct parse_events_state *parse_state)
 {
-       struct perf_evsel *evsel, *leader;
+       struct evsel *evsel, *leader;
        uintptr_t *leaders;
        bool is_leader = true;
        int i, nr_pmu = 0, total_members, ret = 0;
 
-       leader = list_first_entry(list, struct perf_evsel, node);
-       evsel = list_last_entry(list, struct perf_evsel, node);
+       leader = list_first_entry(list, struct evsel, node);
+       evsel = list_last_entry(list, struct evsel, node);
        total_members = evsel->idx - leader->idx + 1;
 
        leaders = calloc(total_members, sizeof(uintptr_t));
@@ -1511,12 +1521,12 @@ parse_events__set_leader_for_uncore_aliase(char *name, struct list_head *list,
        __evlist__for_each_entry(list, evsel) {
                if (i >= nr_pmu)
                        i = 0;
-               evsel->leader = (struct perf_evsel *) leaders[i++];
+               evsel->leader = (struct evsel *) leaders[i++];
        }
 
        /* The number of members and group name are same for each group */
        for (i = 0; i < nr_pmu; i++) {
-               evsel = (struct perf_evsel *) leaders[i];
+               evsel = (struct evsel *) leaders[i];
                evsel->nr_members = total_members / nr_pmu;
                evsel->group_name = name ? strdup(name) : NULL;
        }
@@ -1534,7 +1544,7 @@ out:
 void parse_events__set_leader(char *name, struct list_head *list,
                              struct parse_events_state *parse_state)
 {
-       struct perf_evsel *leader;
+       struct evsel *leader;
 
        if (list_empty(list)) {
                WARN_ONCE(true, "WARNING: failed to set leader: empty list");
@@ -1545,7 +1555,7 @@ void parse_events__set_leader(char *name, struct list_head *list,
                return;
 
        __perf_evlist__set_leader(list);
-       leader = list_entry(list->next, struct perf_evsel, node);
+       leader = list_entry(list->next, struct evsel, node);
        leader->group_name = name ? strdup(name) : NULL;
 }
 
@@ -1578,7 +1588,7 @@ struct event_modifier {
 };
 
 static int get_event_modifier(struct event_modifier *mod, char *str,
-                              struct perf_evsel *evsel)
+                              struct evsel *evsel)
 {
        int eu = evsel ? evsel->attr.exclude_user : 0;
        int ek = evsel ? evsel->attr.exclude_kernel : 0;
@@ -1691,7 +1701,7 @@ static int check_modifier(char *str)
 
 int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 {
-       struct perf_evsel *evsel;
+       struct evsel *evsel;
        struct event_modifier mod;
 
        if (str == NULL)
@@ -1728,7 +1738,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 
 int parse_events_name(struct list_head *list, char *name)
 {
-       struct perf_evsel *evsel;
+       struct evsel *evsel;
 
        __evlist__for_each_entry(list, evsel) {
                if (!evsel->name)
@@ -1894,7 +1904,7 @@ int parse_events_terms(struct list_head *terms, const char *str)
        return ret;
 }
 
-int parse_events(struct perf_evlist *evlist, const char *str,
+int parse_events(struct evlist *evlist, const char *str,
                 struct parse_events_error *err)
 {
        struct parse_events_state parse_state = {
@@ -1908,7 +1918,7 @@ int parse_events(struct perf_evlist *evlist, const char *str,
        ret = parse_events__scanner(str, &parse_state, PE_START_EVENTS);
        perf_pmu__parse_cleanup();
        if (!ret) {
-               struct perf_evsel *last;
+               struct evsel *last;
 
                if (list_empty(&parse_state.list)) {
                        WARN_ONCE(true, "WARNING: event parser found nothing\n");
@@ -1925,7 +1935,7 @@ int parse_events(struct perf_evlist *evlist, const char *str,
 
        /*
         * There are 2 users - builtin-record and builtin-test objects.
-        * Both call perf_evlist__delete in case of error, so we dont
+        * Both call evlist__delete in case of error, so we dont
         * need to bother.
         */
        return ret;
@@ -2003,7 +2013,7 @@ void parse_events_print_error(struct parse_events_error *err,
 int parse_events_option(const struct option *opt, const char *str,
                        int unset __maybe_unused)
 {
-       struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
+       struct evlist *evlist = *(struct evlist **)opt->value;
        struct parse_events_error err = { .idx = 0, };
        int ret = parse_events(evlist, str, &err);
 
@@ -2016,12 +2026,12 @@ int parse_events_option(const struct option *opt, const char *str,
 }
 
 static int
-foreach_evsel_in_last_glob(struct perf_evlist *evlist,
-                          int (*func)(struct perf_evsel *evsel,
+foreach_evsel_in_last_glob(struct evlist *evlist,
+                          int (*func)(struct evsel *evsel,
                                       const void *arg),
                           const void *arg)
 {
-       struct perf_evsel *last = NULL;
+       struct evsel *last = NULL;
        int err;
 
        /*
@@ -2042,13 +2052,13 @@ foreach_evsel_in_last_glob(struct perf_evlist *evlist,
 
                if (last->node.prev == &evlist->entries)
                        return 0;
-               last = list_entry(last->node.prev, struct perf_evsel, node);
+               last = list_entry(last->node.prev, struct evsel, node);
        } while (!last->cmdline_group_boundary);
 
        return 0;
 }
 
-static int set_filter(struct perf_evsel *evsel, const void *arg)
+static int set_filter(struct evsel *evsel, const void *arg)
 {
        const char *str = arg;
        bool found = false;
@@ -2099,13 +2109,13 @@ static int set_filter(struct perf_evsel *evsel, const void *arg)
 int parse_filter(const struct option *opt, const char *str,
                 int unset __maybe_unused)
 {
-       struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
+       struct evlist *evlist = *(struct evlist **)opt->value;
 
        return foreach_evsel_in_last_glob(evlist, set_filter,
                                          (const void *)str);
 }
 
-static int add_exclude_perf_filter(struct perf_evsel *evsel,
+static int add_exclude_perf_filter(struct evsel *evsel,
                                   const void *arg __maybe_unused)
 {
        char new_filter[64];
@@ -2131,7 +2141,7 @@ int exclude_perf(const struct option *opt,
                 const char *arg __maybe_unused,
                 int unset __maybe_unused)
 {
-       struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
+       struct evlist *evlist = *(struct evlist **)opt->value;
 
        return foreach_evsel_in_last_glob(evlist, add_exclude_perf_filter,
                                          NULL);
@@ -2297,20 +2307,20 @@ static bool is_event_supported(u8 type, unsigned config)
 {
        bool ret = true;
        int open_return;
-       struct perf_evsel *evsel;
+       struct evsel *evsel;
        struct perf_event_attr attr = {
                .type = type,
                .config = config,
                .disabled = 1,
        };
-       struct thread_map *tmap = thread_map__new_by_tid(0);
+       struct perf_thread_map *tmap = thread_map__new_by_tid(0);
 
        if (tmap == NULL)
                return false;
 
-       evsel = perf_evsel__new(&attr);
+       evsel = evsel__new(&attr);
        if (evsel) {
-               open_return = perf_evsel__open(evsel, NULL, tmap);
+               open_return = evsel__open(evsel, NULL, tmap);
                ret = open_return >= 0;
 
                if (open_return == -EACCES) {
@@ -2322,9 +2332,9 @@ static bool is_event_supported(u8 type, unsigned config)
                         *
                         */
                        evsel->attr.exclude_kernel = 1;
-                       ret = perf_evsel__open(evsel, NULL, tmap) >= 0;
+                       ret = evsel__open(evsel, NULL, tmap) >= 0;
                }
-               perf_evsel__delete(evsel);
+               evsel__delete(evsel);
        }
 
        thread_map__put(tmap);