lkml.org 
[lkml]   [2015]   [Sep]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V3 11/14] perf tools: Fix perf_evlist__add() not propagating maps
    Date
    If evsels are added after maps are created, then they won't
    have any maps propagated to them. Fix that.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    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


    \
     
     \ /
      Last update: 2015-09-08 10:21    [W:4.328 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site