]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
libperf: Add perf_evlist__set_maps() function
authorJiri Olsa <jolsa@kernel.org>
Sun, 21 Jul 2019 11:24:43 +0000 (13:24 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 29 Jul 2019 21:34:45 +0000 (18:34 -0300)
Move the evlist__set_maps() function from tools/perf to libperf.

Committer notes:

Fix up reject due to earlier inversion in calling perf_evlist__init().

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20190721112506.12306-57-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
14 files changed:
tools/perf/arch/x86/tests/perf-time-to-tsc.c
tools/perf/builtin-script.c
tools/perf/builtin-stat.c
tools/perf/lib/evlist.c
tools/perf/lib/include/perf/evlist.h
tools/perf/lib/libperf.map
tools/perf/tests/code-reading.c
tools/perf/tests/keep-tracking.c
tools/perf/tests/mmap-basic.c
tools/perf/tests/sw-clock.c
tools/perf/tests/switch-tracking.c
tools/perf/tests/task-exit.c
tools/perf/util/evlist.c
tools/perf/util/evlist.h

index 261bdd6806517c1449c0e6fd9a517b65eaa61c61..582182d98a7f4a23de34e06038c6e1508761bdc5 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/types.h>
 #include <sys/prctl.h>
 #include <perf/cpumap.h>
+#include <perf/evlist.h>
 
 #include "parse-events.h"
 #include "evlist.h"
@@ -72,7 +73,7 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybe
        evlist = evlist__new();
        CHECK_NOT_NULL__(evlist);
 
-       perf_evlist__set_maps(evlist, cpus, threads);
+       perf_evlist__set_maps(&evlist->core, cpus, threads);
 
        CHECK__(parse_events(evlist, "cycles:u", NULL));
 
index a787c5cb13314e6c2eb13c24c6e82376be45c221..46fadbbe1c3ebdc31880eed1761224afc3dba15c 100644 (file)
@@ -48,6 +48,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <subcmd/pager.h>
+#include <perf/evlist.h>
 
 #include <linux/ctype.h>
 
@@ -3264,7 +3265,7 @@ static int set_maps(struct perf_script *script)
        if (WARN_ONCE(script->allocated, "stats double allocation\n"))
                return -EINVAL;
 
-       perf_evlist__set_maps(evlist, script->cpus, script->threads);
+       perf_evlist__set_maps(&evlist->core, script->cpus, script->threads);
 
        if (perf_evlist__alloc_stats(evlist, true))
                return -ENOMEM;
index 4a94ca131d56096b1d1d68ba513e9660109c1ec7..14e4c970d16ac3b304ea7049126c350610d1d7f4 100644 (file)
@@ -83,6 +83,7 @@
 #include <sys/resource.h>
 
 #include <linux/ctype.h>
+#include <perf/evlist.h>
 
 #define DEFAULT_SEPARATOR      " "
 #define FREEZE_ON_SMI_PATH     "devices/cpu/freeze_on_smi"
@@ -1517,7 +1518,7 @@ static int set_maps(struct perf_stat *st)
        if (WARN_ONCE(st->maps_allocated, "stats double allocation\n"))
                return -EINVAL;
 
-       perf_evlist__set_maps(evsel_list, st->cpus, st->threads);
+       perf_evlist__set_maps(&evsel_list->core, st->cpus, st->threads);
 
        if (perf_evlist__alloc_stats(evsel_list, true))
                return -ENOMEM;
index 087ef76ea8fdf044a9d2cfcde590ac28c9f2640c..6a2308ef9868034a847838b187eeb1eec6ff9587 100644 (file)
@@ -5,6 +5,8 @@
 #include <internal/evsel.h>
 #include <linux/zalloc.h>
 #include <stdlib.h>
+#include <perf/cpumap.h>
+#include <perf/threadmap.h>
 
 void perf_evlist__init(struct perf_evlist *evlist)
 {
@@ -12,11 +14,39 @@ void perf_evlist__init(struct perf_evlist *evlist)
        evlist->nr_entries = 0;
 }
 
+static void __perf_evlist__propagate_maps(struct perf_evlist *evlist,
+                                         struct perf_evsel *evsel)
+{
+       /*
+        * We already have cpus for evsel (via PMU sysfs) so
+        * keep it, if there's no target cpu list defined.
+        */
+       if (!evsel->own_cpus || evlist->has_user_cpus) {
+               perf_cpu_map__put(evsel->cpus);
+               evsel->cpus = perf_cpu_map__get(evlist->cpus);
+       } else if (evsel->cpus != evsel->own_cpus) {
+               perf_cpu_map__put(evsel->cpus);
+               evsel->cpus = perf_cpu_map__get(evsel->own_cpus);
+       }
+
+       perf_thread_map__put(evsel->threads);
+       evsel->threads = perf_thread_map__get(evlist->threads);
+}
+
+static void perf_evlist__propagate_maps(struct perf_evlist *evlist)
+{
+       struct perf_evsel *evsel;
+
+       perf_evlist__for_each_evsel(evlist, evsel)
+               __perf_evlist__propagate_maps(evlist, evsel);
+}
+
 void perf_evlist__add(struct perf_evlist *evlist,
                      struct perf_evsel *evsel)
 {
        list_add_tail(&evsel->node, &evlist->entries);
        evlist->nr_entries += 1;
+       __perf_evlist__propagate_maps(evlist, evsel);
 }
 
 void perf_evlist__remove(struct perf_evlist *evlist,
@@ -60,3 +90,27 @@ void perf_evlist__delete(struct perf_evlist *evlist)
 {
        free(evlist);
 }
+
+void perf_evlist__set_maps(struct perf_evlist *evlist,
+                          struct perf_cpu_map *cpus,
+                          struct perf_thread_map *threads)
+{
+       /*
+        * Allow for the possibility that one or another of the maps isn't being
+        * changed i.e. don't put it.  Note we are assuming the maps that are
+        * being applied are brand new and evlist is taking ownership of the
+        * original reference count of 1.  If that is not the case it is up to
+        * the caller to increase the reference count.
+        */
+       if (cpus != evlist->cpus) {
+               perf_cpu_map__put(evlist->cpus);
+               evlist->cpus = perf_cpu_map__get(cpus);
+       }
+
+       if (threads != evlist->threads) {
+               perf_thread_map__put(evlist->threads);
+               evlist->threads = perf_thread_map__get(threads);
+       }
+
+       perf_evlist__propagate_maps(evlist);
+}
index 9a126fd0773cd3ce79ca7021a53296fcfb5831b9..b1d8dee018d63795250d29cfe71b82704da9d280 100644 (file)
@@ -6,6 +6,8 @@
 
 struct perf_evlist;
 struct perf_evsel;
+struct perf_cpu_map;
+struct perf_thread_map;
 
 LIBPERF_API void perf_evlist__init(struct perf_evlist *evlist);
 LIBPERF_API void perf_evlist__add(struct perf_evlist *evlist,
@@ -22,4 +24,8 @@ LIBPERF_API struct perf_evsel* perf_evlist__next(struct perf_evlist *evlist,
             (pos) != NULL;                             \
             (pos) = perf_evlist__next((evlist), (pos)))
 
+LIBPERF_API void perf_evlist__set_maps(struct perf_evlist *evlist,
+                                      struct perf_cpu_map *cpus,
+                                      struct perf_thread_map *threads);
+
 #endif /* __LIBPERF_EVLIST_H */
index 28ed04cbd2233ff65225b8d7598ed87c4289209f..9b6e8f165014a9e5c987348958c52455832e4c62 100644 (file)
@@ -20,6 +20,7 @@ LIBPERF_0.0.1 {
                perf_evlist__add;
                perf_evlist__remove;
                perf_evlist__next;
+               perf_evlist__set_maps;
        local:
                *;
 };
index bfaf22c2023c47748a312439867a530119182abc..e45df0736261c01f2ddc2b3873eec961f15f3117 100644 (file)
@@ -9,6 +9,7 @@
 #include <string.h>
 #include <sys/param.h>
 #include <perf/cpumap.h>
+#include <perf/evlist.h>
 
 #include "parse-events.h"
 #include "evlist.h"
@@ -629,7 +630,7 @@ static int do_test_code_reading(bool try_kcore)
                        goto out_put;
                }
 
-               perf_evlist__set_maps(evlist, cpus, threads);
+               perf_evlist__set_maps(&evlist->core, cpus, threads);
 
                str = do_determine_event(excl_kernel);
                pr_debug("Parsing event '%s'\n", str);
@@ -658,7 +659,7 @@ static int do_test_code_reading(bool try_kcore)
                                 */
                                perf_cpu_map__get(cpus);
                                perf_thread_map__get(threads);
-                               perf_evlist__set_maps(evlist, NULL, NULL);
+                               perf_evlist__set_maps(&evlist->core, NULL, NULL);
                                evlist__delete(evlist);
                                evlist = NULL;
                                continue;
index 46478ba1ed1671ee80e18b46c39f4ae3a59ec09d..0ce5ce33bac4c90f6b36e65a44291ad547514362 100644 (file)
@@ -3,6 +3,7 @@
 #include <unistd.h>
 #include <sys/prctl.h>
 #include <perf/cpumap.h>
+#include <perf/evlist.h>
 
 #include "parse-events.h"
 #include "evlist.h"
@@ -82,7 +83,7 @@ int test__keep_tracking(struct test *test __maybe_unused, int subtest __maybe_un
        evlist = evlist__new();
        CHECK_NOT_NULL__(evlist);
 
-       perf_evlist__set_maps(evlist, cpus, threads);
+       perf_evlist__set_maps(&evlist->core, cpus, threads);
 
        CHECK__(parse_events(evlist, "dummy:u", NULL));
        CHECK__(parse_events(evlist, "cycles:u", NULL));
index aa792aebd7f030fb9a1ff6bcab8c155e3f60be52..7327694fbde06866871c4d540cdd79184765d53a 100644 (file)
@@ -12,6 +12,7 @@
 #include "tests.h"
 #include <linux/err.h>
 #include <linux/kernel.h>
+#include <perf/evlist.h>
 
 /*
  * This test will generate random numbers of calls to some getpid syscalls,
@@ -68,7 +69,7 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse
                goto out_free_cpus;
        }
 
-       perf_evlist__set_maps(evlist, cpus, threads);
+       perf_evlist__set_maps(&evlist->core, cpus, threads);
 
        for (i = 0; i < nsyscalls; ++i) {
                char name[64];
index 2decda2d4c17ffce9a26231f513fbfc55e3cd3d7..c5f1a9f833808852dcae0010fec8d96d595de772 100644 (file)
@@ -11,6 +11,7 @@
 #include "util/evlist.h"
 #include "util/cpumap.h"
 #include "util/thread_map.h"
+#include <perf/evlist.h>
 
 #define NR_LOOPS  10000000
 
@@ -64,7 +65,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
                goto out_free_maps;
        }
 
-       perf_evlist__set_maps(evlist, cpus, threads);
+       perf_evlist__set_maps(&evlist->core, cpus, threads);
 
        cpus    = NULL;
        threads = NULL;
index 9e0bbea15005d638d0140d517a0e4eed61c232ed..e3cee69f6ea29e638b8695ccb58dfbd0c2120c37 100644 (file)
@@ -6,6 +6,7 @@
 #include <stdlib.h>
 #include <linux/zalloc.h>
 #include <perf/cpumap.h>
+#include <perf/evlist.h>
 
 #include "parse-events.h"
 #include "evlist.h"
@@ -354,7 +355,7 @@ int test__switch_tracking(struct test *test __maybe_unused, int subtest __maybe_
                goto out_err;
        }
 
-       perf_evlist__set_maps(evlist, cpus, threads);
+       perf_evlist__set_maps(&evlist->core, cpus, threads);
 
        /* First event */
        err = parse_events(evlist, "cpu-clock:u", NULL);
index b0192ea636a7b72dbac829c842efd90e7dd1a0b0..4ca38fd0379a3c3be55d1b82ee7be3d10c97dbaf 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <errno.h>
 #include <signal.h>
+#include <perf/evlist.h>
 
 static int exited;
 static int nr_exit;
@@ -71,7 +72,7 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unused
                goto out_free_maps;
        }
 
-       perf_evlist__set_maps(evlist, cpus, threads);
+       perf_evlist__set_maps(&evlist->core, cpus, threads);
 
        cpus    = NULL;
        threads = NULL;
index 1a6f877ebb039c90d08ce6275b06711714eec917..4433b656cfb7f67d995a60f61200443e08a4aa21 100644 (file)
@@ -51,7 +51,7 @@ void evlist__init(struct evlist *evlist, struct perf_cpu_map *cpus,
        for (i = 0; i < PERF_EVLIST__HLIST_SIZE; ++i)
                INIT_HLIST_HEAD(&evlist->heads[i]);
        perf_evlist__init(&evlist->core);
-       perf_evlist__set_maps(evlist, cpus, threads);
+       perf_evlist__set_maps(&evlist->core, cpus, threads);
        fdarray__init(&evlist->pollfd, 64);
        evlist->workload.pid = -1;
        evlist->bkw_mmap_state = BKW_MMAP_NOTREADY;
@@ -152,33 +152,6 @@ void evlist__delete(struct evlist *evlist)
        free(evlist);
 }
 
-static void __perf_evlist__propagate_maps(struct evlist *evlist,
-                                         struct evsel *evsel)
-{
-       /*
-        * We already have cpus for evsel (via PMU sysfs) so
-        * keep it, if there's no target cpu list defined.
-        */
-       if (!evsel->core.own_cpus || evlist->core.has_user_cpus) {
-               perf_cpu_map__put(evsel->core.cpus);
-               evsel->core.cpus = perf_cpu_map__get(evlist->core.cpus);
-       } else if (evsel->core.cpus != evsel->core.own_cpus) {
-               perf_cpu_map__put(evsel->core.cpus);
-               evsel->core.cpus = perf_cpu_map__get(evsel->core.own_cpus);
-       }
-
-       perf_thread_map__put(evsel->core.threads);
-       evsel->core.threads = perf_thread_map__get(evlist->core.threads);
-}
-
-static void perf_evlist__propagate_maps(struct evlist *evlist)
-{
-       struct evsel *evsel;
-
-       evlist__for_each_entry(evlist, evsel)
-               __perf_evlist__propagate_maps(evlist, evsel);
-}
-
 void evlist__add(struct evlist *evlist, struct evsel *entry)
 {
        entry->evlist = evlist;
@@ -189,8 +162,6 @@ void evlist__add(struct evlist *evlist, struct evsel *entry)
 
        if (evlist->core.nr_entries == 1)
                perf_evlist__set_id_pos(evlist);
-
-       __perf_evlist__propagate_maps(evlist, entry);
 }
 
 void evlist__remove(struct evlist *evlist, struct evsel *evsel)
@@ -1097,7 +1068,7 @@ int perf_evlist__create_maps(struct evlist *evlist, struct target *target)
 
        evlist->core.has_user_cpus = !!target->cpu_list;
 
-       perf_evlist__set_maps(evlist, cpus, threads);
+       perf_evlist__set_maps(&evlist->core, cpus, threads);
 
        return 0;
 
@@ -1106,29 +1077,6 @@ int perf_evlist__create_maps(struct evlist *evlist, struct target *target)
        return -1;
 }
 
-void perf_evlist__set_maps(struct evlist *evlist, struct perf_cpu_map *cpus,
-                          struct perf_thread_map *threads)
-{
-       /*
-        * Allow for the possibility that one or another of the maps isn't being
-        * changed i.e. don't put it.  Note we are assuming the maps that are
-        * being applied are brand new and evlist is taking ownership of the
-        * original reference count of 1.  If that is not the case it is up to
-        * the caller to increase the reference count.
-        */
-       if (cpus != evlist->core.cpus) {
-               perf_cpu_map__put(evlist->core.cpus);
-               evlist->core.cpus = perf_cpu_map__get(cpus);
-       }
-
-       if (threads != evlist->core.threads) {
-               perf_thread_map__put(evlist->core.threads);
-               evlist->core.threads = perf_thread_map__get(threads);
-       }
-
-       perf_evlist__propagate_maps(evlist);
-}
-
 void __perf_evlist__set_sample_bit(struct evlist *evlist,
                                   enum perf_event_sample_format bit)
 {
@@ -1381,7 +1329,7 @@ static int perf_evlist__create_syswide_maps(struct evlist *evlist)
        if (!threads)
                goto out_put;
 
-       perf_evlist__set_maps(evlist, cpus, threads);
+       perf_evlist__set_maps(&evlist->core, cpus, threads);
 out:
        return err;
 out_put:
index de2025d198d47dd69c7b8dfb971c4bfe6c898393..e31ddcc058f2f60348923b461307b95c94717e34 100644 (file)
@@ -191,8 +191,6 @@ int perf_evlist__enable_event_idx(struct evlist *evlist,
 void perf_evlist__set_selected(struct evlist *evlist,
                               struct evsel *evsel);
 
-void perf_evlist__set_maps(struct evlist *evlist, struct perf_cpu_map *cpus,
-                          struct perf_thread_map *threads);
 int perf_evlist__create_maps(struct evlist *evlist, struct target *target);
 int perf_evlist__apply_filters(struct evlist *evlist, struct evsel **err_evsel);