libperf: Move 'leader' from tools/perf to perf_evsel::leader
Move evsel::leader to perf_evsel::leader, so we can move the group
interface to libperf.
Also add several evsel helpers to ease up the transition:
struct evsel *evsel__leader(struct evsel *evsel);
- get leader evsel
bool evsel__has_leader(struct evsel *evsel, struct evsel *leader);
- true if evsel has leader as leader
bool evsel__is_leader(struct evsel *evsel);
- true if evsel is itw own leader
void evsel__set_leader(struct evsel *evsel, struct evsel *leader);
- set leader for evsel
Committer notes:
Fix this when building with 'make BUILD_BPF_SKEL=1'
tools/perf/util/bpf_counter.c
- if (evsel->leader->core.nr_members > 1) {
+ if (evsel->core.leader->nr_members > 1) {
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Requested-by: Shunsuke Nakamura <nakamura.shun@fujitsu.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20210706151704.73662-4-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
38fe0e0156
commit
fba7c86601
@@ -118,7 +118,6 @@ struct evsel {
|
||||
bool reset_group;
|
||||
bool errored;
|
||||
struct hashmap *per_pkg_mask;
|
||||
struct evsel *leader;
|
||||
int err;
|
||||
int cpu_iter;
|
||||
struct {
|
||||
@@ -367,7 +366,7 @@ static inline struct evsel *evsel__prev(struct evsel *evsel)
|
||||
*/
|
||||
static inline bool evsel__is_group_leader(const struct evsel *evsel)
|
||||
{
|
||||
return evsel->leader == evsel;
|
||||
return evsel->core.leader == &evsel->core;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -405,19 +404,19 @@ int evsel__open_strerror(struct evsel *evsel, struct target *target,
|
||||
|
||||
static inline int evsel__group_idx(struct evsel *evsel)
|
||||
{
|
||||
return evsel->core.idx - evsel->leader->core.idx;
|
||||
return evsel->core.idx - evsel->core.leader->idx;
|
||||
}
|
||||
|
||||
/* Iterates group WITHOUT the leader. */
|
||||
#define for_each_group_member(_evsel, _leader) \
|
||||
for ((_evsel) = list_entry((_leader)->core.node.next, struct evsel, core.node); \
|
||||
(_evsel) && (_evsel)->leader == (_leader); \
|
||||
(_evsel) && (_evsel)->core.leader == (&_leader->core); \
|
||||
(_evsel) = list_entry((_evsel)->core.node.next, struct evsel, core.node))
|
||||
|
||||
/* Iterates group WITH the leader. */
|
||||
#define for_each_group_evsel(_evsel, _leader) \
|
||||
for ((_evsel) = _leader; \
|
||||
(_evsel) && (_evsel)->leader == (_leader); \
|
||||
(_evsel) && (_evsel)->core.leader == (&_leader->core); \
|
||||
(_evsel) = list_entry((_evsel)->core.node.next, struct evsel, core.node))
|
||||
|
||||
static inline bool evsel__has_branch_callstack(const struct evsel *evsel)
|
||||
@@ -462,4 +461,8 @@ int evsel__store_ids(struct evsel *evsel, struct evlist *evlist);
|
||||
|
||||
void evsel__zero_per_pkg(struct evsel *evsel);
|
||||
bool evsel__is_hybrid(struct evsel *evsel);
|
||||
struct evsel *evsel__leader(struct evsel *evsel);
|
||||
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);
|
||||
#endif /* __PERF_EVSEL_H */
|
||||
|
||||
Reference in New Issue
Block a user