lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 543/772] perf stat: Always keep perf metrics topdown events in a group
    Date
    From: Kan Liang <kan.liang@linux.intel.com>

    [ Upstream commit e8f4f794d7047dd36f090f44f12cd645fba204d2 ]

    If any member in a group has a different cpu mask than the other
    members, the current perf stat disables group. when the perf metrics
    topdown events are part of the group, the below <not supported> error
    will be triggered.

    $ perf stat -e "{slots,topdown-retiring,uncore_imc_free_running_0/dclk/}" -a sleep 1
    WARNING: grouped events cpus do not match, disabling group:
    anon group { slots, topdown-retiring, uncore_imc_free_running_0/dclk/ }

    Performance counter stats for 'system wide':

    141,465,174 slots
    <not supported> topdown-retiring
    1,605,330,334 uncore_imc_free_running_0/dclk/

    The perf metrics topdown events must always be grouped with a slots
    event as leader.

    Factor out evsel__remove_from_group() to only remove the regular events
    from the group.

    Remove evsel__must_be_in_group(), since no one use it anymore.

    With the patch, the topdown events aren't broken from the group for the
    splitting.

    $ perf stat -e "{slots,topdown-retiring,uncore_imc_free_running_0/dclk/}" -a sleep 1
    WARNING: grouped events cpus do not match, disabling group:
    anon group { slots, topdown-retiring, uncore_imc_free_running_0/dclk/ }

    Performance counter stats for 'system wide':

    346,110,588 slots
    124,608,256 topdown-retiring
    1,606,869,976 uncore_imc_free_running_0/dclk/

    1.003877592 seconds time elapsed

    Fixes: a9a1790247bdcf3b ("perf stat: Ensure group is defined on top of the same cpu mask")
    Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
    Acked-by: Ian Rogers <irogers@google.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com>
    Link: https://lore.kernel.org/r/20220518143900.1493980-3-kan.liang@linux.intel.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/perf/builtin-stat.c | 7 ++-----
    tools/perf/util/evlist.c | 6 +-----
    tools/perf/util/evsel.c | 13 +++++++++++--
    tools/perf/util/evsel.h | 2 +-
    4 files changed, 15 insertions(+), 13 deletions(-)

    diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
    index 60baa3dadc4b..416a6a4fbcc7 100644
    --- a/tools/perf/builtin-stat.c
    +++ b/tools/perf/builtin-stat.c
    @@ -271,11 +271,8 @@ static void evlist__check_cpu_maps(struct evlist *evlist)
    pr_warning(" %s: %s\n", evsel->name, buf);
    }

    - for_each_group_evsel(pos, leader) {
    - evsel__set_leader(pos, pos);
    - pos->core.nr_members = 0;
    - }
    - evsel->core.leader->nr_members = 0;
    + for_each_group_evsel(pos, leader)
    + evsel__remove_from_group(pos, leader);
    }
    }

    diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
    index 3ff0de0b6710..ec745209c8b4 100644
    --- a/tools/perf/util/evlist.c
    +++ b/tools/perf/util/evlist.c
    @@ -1795,11 +1795,7 @@ struct evsel *evlist__reset_weak_group(struct evlist *evsel_list, struct evsel *
    * them. Some events, like Intel topdown, require being
    * in a group and so keep these in the group.
    */
    - if (!evsel__must_be_in_group(c2) && c2 != leader) {
    - evsel__set_leader(c2, c2);
    - c2->core.nr_members = 0;
    - leader->core.nr_members--;
    - }
    + evsel__remove_from_group(c2, leader);

    /*
    * Set this for all former members of the group
    diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
    index 6fb3cf924dd2..63284e98c419 100644
    --- a/tools/perf/util/evsel.c
    +++ b/tools/perf/util/evsel.c
    @@ -3054,7 +3054,16 @@ bool __weak arch_evsel__must_be_in_group(const struct evsel *evsel __maybe_unuse
    return false;
    }

    -bool evsel__must_be_in_group(const struct evsel *evsel)
    +/*
    + * Remove an event from a given group (leader).
    + * Some events, e.g., perf metrics Topdown events,
    + * must always be grouped. Ignore the events.
    + */
    +void evsel__remove_from_group(struct evsel *evsel, struct evsel *leader)
    {
    - return arch_evsel__must_be_in_group(evsel);
    + if (!arch_evsel__must_be_in_group(evsel) && evsel != leader) {
    + evsel__set_leader(evsel, evsel);
    + evsel->core.nr_members = 0;
    + leader->core.nr_members--;
    + }
    }
    diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
    index a36172ed4cf6..47f65f8e7c74 100644
    --- a/tools/perf/util/evsel.h
    +++ b/tools/perf/util/evsel.h
    @@ -483,7 +483,7 @@ bool evsel__has_leader(struct evsel *evsel, struct evsel *leader);
    bool evsel__is_leader(struct evsel *evsel);
    void evsel__set_leader(struct evsel *evsel, struct evsel *leader);
    int evsel__source_count(const struct evsel *evsel);
    -bool evsel__must_be_in_group(const struct evsel *evsel);
    +void evsel__remove_from_group(struct evsel *evsel, struct evsel *leader);

    bool arch_evsel__must_be_in_group(const struct evsel *evsel);

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-07 23:28    [W:4.038 / U:0.688 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site