Messages in this thread | | | From | Arnaldo Carvalho de Melo <> | Date | Wed, 24 Jul 2019 14:14:27 -0300 | Subject | Re: [PATCH 56/79] libperf: Add perf_evlist__set_maps function |
| |
Em Sun, Jul 21, 2019 at 01:24:43PM +0200, Jiri Olsa escreveu: > Moving evlist__set_maps function under libperf.
Fixed up conflict due to the fix in the call order with perf_evlist__init() in a previous patch, pushed out to acme/perf/core, will continue later.
- Arnaldo
> Link: http://lkml.kernel.org/n/tip-y5d2tm0l5cw0q1ts301ukgtk@git.kernel.org > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > --- > tools/perf/arch/x86/tests/perf-time-to-tsc.c | 3 +- > tools/perf/builtin-script.c | 3 +- > tools/perf/builtin-stat.c | 3 +- > tools/perf/lib/evlist.c | 54 ++++++++++++++++++ > tools/perf/lib/include/perf/evlist.h | 6 ++ > tools/perf/lib/libperf.map | 1 + > tools/perf/tests/code-reading.c | 5 +- > tools/perf/tests/keep-tracking.c | 3 +- > tools/perf/tests/mmap-basic.c | 3 +- > tools/perf/tests/sw-clock.c | 3 +- > tools/perf/tests/switch-tracking.c | 3 +- > tools/perf/tests/task-exit.c | 3 +- > tools/perf/util/evlist.c | 58 +------------------- > tools/perf/util/evlist.h | 2 - > 14 files changed, 83 insertions(+), 67 deletions(-) > > diff --git a/tools/perf/arch/x86/tests/perf-time-to-tsc.c b/tools/perf/arch/x86/tests/perf-time-to-tsc.c > index 261bdd680651..582182d98a7f 100644 > --- a/tools/perf/arch/x86/tests/perf-time-to-tsc.c > +++ b/tools/perf/arch/x86/tests/perf-time-to-tsc.c > @@ -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)); > > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c > index a787c5cb1331..46fadbbe1c3e 100644 > --- a/tools/perf/builtin-script.c > +++ b/tools/perf/builtin-script.c > @@ -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; > diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c > index 4a94ca131d56..14e4c970d16a 100644 > --- a/tools/perf/builtin-stat.c > +++ b/tools/perf/builtin-stat.c > @@ -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; > diff --git a/tools/perf/lib/evlist.c b/tools/perf/lib/evlist.c > index c14b535bd765..e01788092d8f 100644 > --- a/tools/perf/lib/evlist.c > +++ b/tools/perf/lib/evlist.c > @@ -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); > +} > diff --git a/tools/perf/lib/include/perf/evlist.h b/tools/perf/lib/include/perf/evlist.h > index 9a126fd0773c..b1d8dee018d6 100644 > --- a/tools/perf/lib/include/perf/evlist.h > +++ b/tools/perf/lib/include/perf/evlist.h > @@ -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 */ > diff --git a/tools/perf/lib/libperf.map b/tools/perf/lib/libperf.map > index 28ed04cbd223..9b6e8f165014 100644 > --- a/tools/perf/lib/libperf.map > +++ b/tools/perf/lib/libperf.map > @@ -20,6 +20,7 @@ LIBPERF_0.0.1 { > perf_evlist__add; > perf_evlist__remove; > perf_evlist__next; > + perf_evlist__set_maps; > local: > *; > }; > diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c > index bfaf22c2023c..e45df0736261 100644 > --- a/tools/perf/tests/code-reading.c > +++ b/tools/perf/tests/code-reading.c > @@ -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; > diff --git a/tools/perf/tests/keep-tracking.c b/tools/perf/tests/keep-tracking.c > index 46478ba1ed16..0ce5ce33bac4 100644 > --- a/tools/perf/tests/keep-tracking.c > +++ b/tools/perf/tests/keep-tracking.c > @@ -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)); > diff --git a/tools/perf/tests/mmap-basic.c b/tools/perf/tests/mmap-basic.c > index aa792aebd7f0..7327694fbde0 100644 > --- a/tools/perf/tests/mmap-basic.c > +++ b/tools/perf/tests/mmap-basic.c > @@ -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]; > diff --git a/tools/perf/tests/sw-clock.c b/tools/perf/tests/sw-clock.c > index 2decda2d4c17..c5f1a9f83380 100644 > --- a/tools/perf/tests/sw-clock.c > +++ b/tools/perf/tests/sw-clock.c > @@ -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; > diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c > index 9e0bbea15005..e3cee69f6ea2 100644 > --- a/tools/perf/tests/switch-tracking.c > +++ b/tools/perf/tests/switch-tracking.c > @@ -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); > diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c > index b0192ea636a7..4ca38fd0379a 100644 > --- a/tools/perf/tests/task-exit.c > +++ b/tools/perf/tests/task-exit.c > @@ -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; > diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c > index 53eb96d8355d..20e22596d4cf 100644 > --- a/tools/perf/util/evlist.c > +++ b/tools/perf/util/evlist.c > @@ -50,7 +50,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__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: > diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h > index de2025d198d4..e31ddcc058f2 100644 > --- a/tools/perf/util/evlist.h > +++ b/tools/perf/util/evlist.h > @@ -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); > > -- > 2.21.0
--
- Arnaldo
| |