Re: [PATCH v2 1/2] perf evlist: Allow setting arbitrary leader
From: Arnaldo Carvalho de Melo <acme@kernel.org>
Date: 2021-11-30 15:15:37
Also in:
lkml
Em Thu, Nov 18, 2021 at 02:06:46PM -0800, Ian Rogers escreveu:
quoted hunk ↗ jump to hunk
The leader of a group is the first, but allow it to be an arbitrary list member so that for Intel topdown events slots may always be the group leader. Reviewed-by: Kajol Jain<redacted> Signed-off-by: Ian Rogers <irogers@google.com> --- tools/lib/perf/evlist.c | 15 +++++++++------ tools/lib/perf/include/internal/evlist.h | 2 +- tools/perf/util/parse-events.c | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-)diff --git a/tools/lib/perf/evlist.c b/tools/lib/perf/evlist.c index e37dfad31383..974da341b8b0 100644 --- a/tools/lib/perf/evlist.c +++ b/tools/lib/perf/evlist.c@@ -643,14 +643,14 @@ perf_evlist__next_mmap(struct perf_evlist *evlist, struct perf_mmap *map, return overwrite ? evlist->mmap_ovw_first : evlist->mmap_first; } -void __perf_evlist__set_leader(struct list_head *list) +void __perf_evlist__set_leader(struct list_head *list, struct perf_evsel *leader) { - struct perf_evsel *evsel, *leader; + struct perf_evsel *first, *last, *evsel; - leader = list_entry(list->next, struct perf_evsel, node); - evsel = list_entry(list->prev, struct perf_evsel, node); + first = list_entry(list->next, struct perf_evsel, node); + last = list_entry(list->prev, struct perf_evsel, node);
We have list_first_entry() and list_last_entry(): For instance: tools/perf/util/parse-events.c: leader = list_first_entry(list, struct evsel, core.node); Can we use it here?
quoted hunk ↗ jump to hunk
- leader->nr_members = evsel->idx - leader->idx + 1; + leader->nr_members = last->idx - first->idx + 1; __perf_evlist__for_each_entry(list, evsel) evsel->leader = leader;@@ -659,7 +659,10 @@ void __perf_evlist__set_leader(struct list_head *list) void perf_evlist__set_leader(struct perf_evlist *evlist) { if (evlist->nr_entries) { + struct perf_evsel *first = list_entry(evlist->entries.next, + struct perf_evsel, node); + evlist->nr_groups = evlist->nr_entries > 1 ? 1 : 0; - __perf_evlist__set_leader(&evlist->entries); + __perf_evlist__set_leader(&evlist->entries, first); } }diff --git a/tools/lib/perf/include/internal/evlist.h b/tools/lib/perf/include/internal/evlist.h index f366dbad6a88..6f74269a3ad4 100644 --- a/tools/lib/perf/include/internal/evlist.h +++ b/tools/lib/perf/include/internal/evlist.h@@ -127,5 +127,5 @@ int perf_evlist__id_add_fd(struct perf_evlist *evlist, void perf_evlist__reset_id_hash(struct perf_evlist *evlist); -void __perf_evlist__set_leader(struct list_head *list); +void __perf_evlist__set_leader(struct list_head *list, struct perf_evsel *leader); #endif /* __LIBPERF_INTERNAL_EVLIST_H */diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 5bfb6f892489..6308ba739d19 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c@@ -1834,8 +1834,8 @@ void parse_events__set_leader(char *name, struct list_head *list, if (parse_events__set_leader_for_uncore_aliase(name, list, parse_state)) return; - __perf_evlist__set_leader(list); leader = list_entry(list->next, struct evsel, core.node); + __perf_evlist__set_leader(list, &leader->core); leader->group_name = name ? strdup(name) : NULL;
Ditto
} -- 2.34.0.rc2.393.gf8c9666880-goog
-- - Arnaldo