Re: [PATCH V3 11/14] perf tools: Fix perf_evlist__add() not propagating maps

From: Arnaldo Carvalho de Melo
Date: Tue Sep 15 2015 - 10:18:28 EST


Em Tue, Sep 08, 2015 at 10:58:59AM +0300, Adrian Hunter escreveu:
> If evsels are added after maps are created, then they won't
> have any maps propagated to them. Fix that.

Next time please consider, when introducing this a new function A() that
will be needed by a function B() in a subsequent patch to introduce A()
before B() if A() is static, i.e. to avoid making the patch making B()
use A() be larger than necessary by having to move A() to before B().

When reviewing I went, "oh, but this function was introduced already in
the previous patch?!" only to figure out that it was unchanged, just
being moved.

I did it this time, please see the two attached patches.

Thanks,

- Arnaldo

> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
> ---
> tools/perf/util/evlist.c | 56 +++++++++++++++++++++++++-----------------------
> 1 file changed, 29 insertions(+), 27 deletions(-)
>
> diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> index fcaabd1e5dbb..99267ab0d24a 100644
> --- a/tools/perf/util/evlist.c
> +++ b/tools/perf/util/evlist.c
> @@ -124,6 +124,33 @@ void perf_evlist__delete(struct perf_evlist *evlist)
> free(evlist);
> }
>
> +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) {
> + cpu_map__put(evsel->cpus);
> + evsel->cpus = cpu_map__get(evlist->cpus);
> + } else if (evsel->cpus != evsel->own_cpus) {
> + cpu_map__put(evsel->cpus);
> + evsel->cpus = cpu_map__get(evsel->own_cpus);
> + }
> +
> + thread_map__put(evsel->threads);
> + evsel->threads = thread_map__get(evlist->threads);
> +}
> +
> +static void perf_evlist__propagate_maps(struct perf_evlist *evlist)
> +{
> + struct perf_evsel *evsel;
> +
> + evlist__for_each(evlist, evsel)
> + __perf_evlist__propagate_maps(evlist, evsel);
> +}
> +
> void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
> {
> entry->evlist = evlist;
> @@ -133,6 +160,8 @@ void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
>
> if (!evlist->nr_entries++)
> perf_evlist__set_id_pos(evlist);
> +
> + __perf_evlist__propagate_maps(evlist, entry);
> }
>
> void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
> @@ -1102,33 +1131,6 @@ int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
> return perf_evlist__mmap_ex(evlist, pages, overwrite, 0, false);
> }
>
> -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) {
> - cpu_map__put(evsel->cpus);
> - evsel->cpus = cpu_map__get(evlist->cpus);
> - } else if (evsel->cpus != evsel->own_cpus) {
> - cpu_map__put(evsel->cpus);
> - evsel->cpus = cpu_map__get(evsel->own_cpus);
> - }
> -
> - thread_map__put(evsel->threads);
> - evsel->threads = thread_map__get(evlist->threads);
> -}
> -
> -static void perf_evlist__propagate_maps(struct perf_evlist *evlist)
> -{
> - struct perf_evsel *evsel;
> -
> - evlist__for_each(evlist, evsel)
> - __perf_evlist__propagate_maps(evlist, evsel);
> -}
> -
> int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target)
> {
> struct cpu_map *cpus;
> --
> 1.9.1