Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Jiri Olsa and committed by
Arnaldo Carvalho de Melo
fba7c866 38fe0e01

+103 -77
+1
tools/lib/perf/evsel.c
··· 24 24 INIT_LIST_HEAD(&evsel->node); 25 25 evsel->attr = *attr; 26 26 evsel->idx = idx; 27 + evsel->leader = evsel; 27 28 } 28 29 29 30 struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr)
+1
tools/lib/perf/include/internal/evsel.h
··· 45 45 struct xyarray *sample_id; 46 46 u64 *id; 47 47 u32 ids; 48 + struct perf_evsel *leader; 48 49 49 50 /* parse modifier helper */ 50 51 int nr_members;
+1 -1
tools/perf/builtin-record.c
··· 926 926 goto try_again; 927 927 } 928 928 if ((errno == EINVAL || errno == EBADF) && 929 - pos->leader != pos && 929 + pos->core.leader != &pos->core && 930 930 pos->weak_group) { 931 931 pos = evlist__reset_weak_group(evlist, pos, true); 932 932 goto try_again;
+1 -1
tools/perf/builtin-report.c
··· 677 677 678 678 /* Non-group events are considered as leader */ 679 679 if (symbol_conf.event_group && !evsel__is_group_leader(pos)) { 680 - struct hists *leader_hists = evsel__hists(pos->leader); 680 + struct hists *leader_hists = evsel__hists(evsel__leader(pos)); 681 681 682 682 hists__match(leader_hists, hists); 683 683 hists__link(leader_hists, hists);
+5 -4
tools/perf/builtin-script.c
··· 1899 1899 struct perf_sample *sample, 1900 1900 FILE *fp) 1901 1901 { 1902 + struct evsel *leader = evsel__leader(evsel); 1902 1903 struct perf_stat_output_ctx ctx = { 1903 1904 .print_metric = script_print_metric, 1904 1905 .new_line = script_new_line, ··· 1916 1915 1917 1916 if (!evsel->stats) 1918 1917 evlist__alloc_stats(script->session->evlist, false); 1919 - if (evsel_script(evsel->leader)->gnum++ == 0) 1918 + if (evsel_script(leader)->gnum++ == 0) 1920 1919 perf_stat__reset_shadow_stats(); 1921 1920 val = sample->period * evsel->scale; 1922 1921 perf_stat__update_shadow_stats(evsel, ··· 1924 1923 sample->cpu, 1925 1924 &rt_stat); 1926 1925 evsel_script(evsel)->val = val; 1927 - if (evsel_script(evsel->leader)->gnum == evsel->leader->core.nr_members) { 1928 - for_each_group_member (ev2, evsel->leader) { 1926 + if (evsel_script(leader)->gnum == leader->core.nr_members) { 1927 + for_each_group_member (ev2, leader) { 1929 1928 perf_stat__print_shadow_stats(&stat_config, ev2, 1930 1929 evsel_script(ev2)->val, 1931 1930 sample->cpu, ··· 1933 1932 NULL, 1934 1933 &rt_stat); 1935 1934 } 1936 - evsel_script(evsel->leader)->gnum = 0; 1935 + evsel_script(leader)->gnum = 0; 1937 1936 } 1938 1937 } 1939 1938
+6 -6
tools/perf/builtin-stat.c
··· 248 248 evlist__warn_hybrid_group(evlist); 249 249 250 250 evlist__for_each_entry(evlist, evsel) { 251 - leader = evsel->leader; 251 + leader = evsel__leader(evsel); 252 252 253 253 /* Check that leader matches cpus with each member. */ 254 254 if (leader == evsel) ··· 269 269 } 270 270 271 271 for_each_group_evsel(pos, leader) { 272 - pos->leader = pos; 272 + evsel__set_leader(pos, pos); 273 273 pos->core.nr_members = 0; 274 274 } 275 - evsel->leader->core.nr_members = 0; 275 + evsel->core.leader->nr_members = 0; 276 276 } 277 277 } 278 278 ··· 745 745 */ 746 746 counter->errored = true; 747 747 748 - if ((counter->leader != counter) || 749 - !(counter->leader->core.nr_members > 1)) 748 + if ((evsel__leader(counter) != counter) || 749 + !(counter->core.leader->nr_members > 1)) 750 750 return COUNTER_SKIP; 751 751 } else if (evsel__fallback(counter, errno, msg, sizeof(msg))) { 752 752 if (verbose > 0) ··· 839 839 * Don't close here because we're in the wrong affinity. 840 840 */ 841 841 if ((errno == EINVAL || errno == EBADF) && 842 - counter->leader != counter && 842 + evsel__leader(counter) != counter && 843 843 counter->weak_group) { 844 844 evlist__reset_weak_group(evsel_list, counter, false); 845 845 assert(counter->reset_group);
+1 -1
tools/perf/builtin-top.c
··· 301 301 302 302 /* Non-group events are considered as leader */ 303 303 if (symbol_conf.event_group && !evsel__is_group_leader(pos)) { 304 - struct hists *leader_hists = evsel__hists(pos->leader); 304 + struct hists *leader_hists = evsel__hists(evsel__leader(pos)); 305 305 306 306 hists__match(leader_hists, hists); 307 307 hists__link(leader_hists, hists);
+26 -26
tools/perf/tests/parse-events.c
··· 698 698 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 699 699 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 700 700 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2); 701 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 701 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 702 702 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 703 703 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 704 704 ··· 739 739 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 740 740 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 741 741 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 742 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 742 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 743 743 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 744 744 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 745 745 ··· 798 798 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 799 799 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 800 800 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 3); 801 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 801 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 802 802 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 803 803 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 804 804 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); ··· 831 831 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 832 832 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 833 833 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 834 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 834 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 835 835 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 836 836 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 837 837 ··· 889 889 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 890 890 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 891 891 TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2); 892 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 892 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 893 893 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 894 894 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 895 895 ··· 931 931 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 932 932 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 933 933 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 934 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 934 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 935 935 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 936 936 TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); 937 937 ··· 963 963 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 964 964 TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host); 965 965 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 966 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 966 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 967 967 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 968 968 969 969 /* cycles */ ··· 1016 1016 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 1017 1017 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1018 1018 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1019 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1019 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1020 1020 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 1021 1021 1022 1022 return 0; ··· 1056 1056 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 1057 1057 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1058 1058 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1059 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1059 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1060 1060 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 1061 1061 1062 1062 return 0; ··· 1096 1096 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 1097 1097 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1098 1098 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1099 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1099 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1100 1100 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 1101 1101 1102 1102 return 0; ··· 1136 1136 TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest); 1137 1137 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1138 1138 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1139 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1139 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1140 1140 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1); 1141 1141 1142 1142 return 0; ··· 1160 1160 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1161 1161 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1162 1162 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1163 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1163 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1164 1164 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1165 1165 1166 1166 /* cache-misses - not sampling */ ··· 1174 1174 TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest); 1175 1175 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1176 1176 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1177 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1177 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1178 1178 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1179 1179 1180 1180 /* branch-misses - not sampling */ ··· 1189 1189 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1190 1190 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1191 1191 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1192 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1192 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1193 1193 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1194 1194 1195 1195 return 0; ··· 1213 1213 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1214 1214 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1215 1215 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1216 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1216 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1217 1217 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1218 1218 1219 1219 /* branch-misses - not sampling */ ··· 1228 1228 TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host); 1229 1229 TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 1230 1230 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1231 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1231 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1232 1232 TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read); 1233 1233 1234 1234 return 0; ··· 1259 1259 TEST_ASSERT_VAL("wrong config", 1260 1260 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 1261 1261 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1262 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1262 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1263 1263 TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned); 1264 1264 1265 1265 /* cache-misses - can not be pinned, but will go on with the leader */ ··· 1303 1303 TEST_ASSERT_VAL("wrong config", 1304 1304 PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config); 1305 1305 TEST_ASSERT_VAL("wrong group name", !evsel->group_name); 1306 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1306 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1307 1307 TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive); 1308 1308 1309 1309 /* cache-misses - can not be pinned, but will go on with the leader */ ··· 1530 1530 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 1531 1531 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 1532 1532 TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config); 1533 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1533 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1534 1534 1535 1535 evsel = evsel__next(evsel); 1536 1536 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 1537 1537 TEST_ASSERT_VAL("wrong config", 0xc0 == evsel->core.attr.config); 1538 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1538 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1539 1539 return 0; 1540 1540 } 1541 1541 ··· 1546 1546 evsel = leader = evlist__first(evlist); 1547 1547 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 1548 1548 TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type); 1549 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1549 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1550 1550 1551 1551 evsel = evsel__next(evsel); 1552 1552 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 1553 1553 TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config); 1554 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1554 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1555 1555 return 0; 1556 1556 } 1557 1557 ··· 1563 1563 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 1564 1564 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 1565 1565 TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config); 1566 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1566 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1567 1567 1568 1568 evsel = evsel__next(evsel); 1569 1569 TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type); 1570 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1570 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1571 1571 return 0; 1572 1572 } 1573 1573 ··· 1579 1579 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); 1580 1580 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 1581 1581 TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config); 1582 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1582 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1583 1583 TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user); 1584 1584 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); 1585 1585 1586 1586 evsel = evsel__next(evsel); 1587 1587 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); 1588 1588 TEST_ASSERT_VAL("wrong config", 0xc0 == evsel->core.attr.config); 1589 - TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); 1589 + TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader)); 1590 1590 TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); 1591 1591 TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); 1592 1592 return 0;
+6 -6
tools/perf/util/auxtrace.c
··· 73 73 grp = false; 74 74 evlist__for_each_entry(evlist, evsel) { 75 75 if (grp) { 76 - if (!(evsel->leader == leader || 77 - (evsel->leader == evsel && 76 + if (!(evsel__leader(evsel) == leader || 77 + (evsel__leader(evsel) == evsel && 78 78 evsel->core.nr_members <= 1))) 79 79 return -EINVAL; 80 80 } else if (evsel == leader) { ··· 87 87 grp = false; 88 88 evlist__for_each_entry(evlist, evsel) { 89 89 if (grp) { 90 - if (evsel->leader != leader) { 91 - evsel->leader = leader; 90 + if (!evsel__has_leader(evsel, leader)) { 91 + evsel__set_leader(evsel, leader); 92 92 if (leader->core.nr_members < 1) 93 93 leader->core.nr_members = 1; 94 94 leader->core.nr_members += 1; ··· 1231 1231 1232 1232 /* Find new leader for the group */ 1233 1233 evlist__for_each_entry(evlist, evsel) { 1234 - if (evsel->leader != leader || evsel == leader) 1234 + if (!evsel__has_leader(evsel, leader) || evsel == leader) 1235 1235 continue; 1236 1236 if (!new_leader) 1237 1237 new_leader = evsel; 1238 - evsel->leader = new_leader; 1238 + evsel__set_leader(evsel, new_leader); 1239 1239 } 1240 1240 1241 1241 /* Update group information */
+1 -1
tools/perf/util/bpf_counter.c
··· 353 353 enum bperf_filter_type *filter_type, 354 354 __u32 *filter_entry_cnt) 355 355 { 356 - if (evsel->leader->core.nr_members > 1) { 356 + if (evsel->core.leader->nr_members > 1) { 357 357 pr_err("bpf managed perf events do not yet support groups.\n"); 358 358 return -1; 359 359 }
+1 -1
tools/perf/util/cgroup.c
··· 459 459 460 460 if (evsel__is_group_leader(pos)) 461 461 leader = evsel; 462 - evsel->leader = leader; 462 + evsel__set_leader(evsel, leader); 463 463 464 464 evlist__add(tmp_list, evsel); 465 465 }
+9 -8
tools/perf/util/evlist.c
··· 192 192 } 193 193 194 194 __evlist__for_each_entry_safe(list, temp, evsel) { 195 - if (evsel->leader == leader) { 195 + if (evsel__has_leader(evsel, leader)) { 196 196 list_del_init(&evsel->core.node); 197 197 evlist__add(evlist, evsel); 198 198 } ··· 233 233 leader->core.nr_members = evsel->core.idx - leader->core.idx + 1; 234 234 235 235 __evlist__for_each_entry(list, evsel) { 236 - evsel->leader = leader; 236 + evsel->core.leader = &leader->core; 237 237 } 238 238 } 239 239 ··· 1624 1624 return; 1625 1625 1626 1626 evlist__for_each_entry_safe(evlist, n, evsel) { 1627 - if (evsel->leader == move_evsel->leader) 1627 + if (evsel__leader(evsel) == evsel__leader(move_evsel)) 1628 1628 list_move_tail(&evsel->core.node, &move); 1629 1629 } 1630 1630 ··· 1761 1761 struct evsel *c2, *leader; 1762 1762 bool is_open = true; 1763 1763 1764 - leader = evsel->leader; 1764 + leader = evsel__leader(evsel); 1765 + 1765 1766 pr_debug("Weak group for %s/%d failed\n", 1766 1767 leader->name, leader->core.nr_members); 1767 1768 ··· 1773 1772 evlist__for_each_entry(evsel_list, c2) { 1774 1773 if (c2 == evsel) 1775 1774 is_open = false; 1776 - if (c2->leader == leader) { 1775 + if (evsel__has_leader(c2, leader)) { 1777 1776 if (is_open && close) 1778 1777 perf_evsel__close(&c2->core); 1779 - c2->leader = c2; 1778 + evsel__set_leader(c2, c2); 1780 1779 c2->core.nr_members = 0; 1781 1780 /* 1782 1781 * Set this for all former members of the group ··· 2173 2172 * any valid memory load information. 2174 2173 */ 2175 2174 evlist__for_each_entry(evlist, evsel) { 2176 - leader = evsel->leader; 2175 + leader = evsel__leader(evsel); 2177 2176 if (leader == evsel) 2178 2177 continue; 2179 2178 2180 2179 if (leader->name && strstr(leader->name, "mem-loads-aux")) { 2181 2180 for_each_group_evsel(pos, leader) { 2182 - pos->leader = pos; 2181 + evsel__set_leader(pos, pos); 2183 2182 pos->core.nr_members = 0; 2184 2183 } 2185 2184 }
+24 -5
tools/perf/util/evsel.c
··· 241 241 { 242 242 perf_evsel__init(&evsel->core, attr, idx); 243 243 evsel->tracking = !idx; 244 - evsel->leader = evsel; 245 244 evsel->unit = ""; 246 245 evsel->scale = 1.0; 247 246 evsel->max_events = ULONG_MAX; ··· 408 409 evsel->cgrp = cgroup__get(orig->cgrp); 409 410 evsel->tp_format = orig->tp_format; 410 411 evsel->handler = orig->handler; 411 - evsel->leader = orig->leader; 412 + evsel->core.leader = orig->core.leader; 412 413 413 414 evsel->max_events = orig->max_events; 414 415 evsel->tool_event = orig->tool_event; ··· 1073 1074 void evsel__config(struct evsel *evsel, struct record_opts *opts, 1074 1075 struct callchain_param *callchain) 1075 1076 { 1076 - struct evsel *leader = evsel->leader; 1077 + struct evsel *leader = evsel__leader(evsel); 1077 1078 struct perf_event_attr *attr = &evsel->core.attr; 1078 1079 int track = evsel->tracking; 1079 1080 bool per_cpu = opts->target.default_per_cpu && !opts->target.per_thread; ··· 1591 1592 1592 1593 static int evsel__hybrid_group_cpu(struct evsel *evsel, int cpu) 1593 1594 { 1594 - struct evsel *leader = evsel->leader; 1595 + struct evsel *leader = evsel__leader(evsel); 1595 1596 1596 1597 if ((evsel__is_hybrid(evsel) && !evsel__is_hybrid(leader)) || 1597 1598 (!evsel__is_hybrid(evsel) && evsel__is_hybrid(leader))) { ··· 1603 1604 1604 1605 static int get_group_fd(struct evsel *evsel, int cpu, int thread) 1605 1606 { 1606 - struct evsel *leader = evsel->leader; 1607 + struct evsel *leader = evsel__leader(evsel); 1607 1608 int fd; 1608 1609 1609 1610 if (evsel__is_group_leader(evsel)) ··· 2848 2849 bool evsel__is_hybrid(struct evsel *evsel) 2849 2850 { 2850 2851 return evsel->pmu_name && perf_pmu__is_hybrid(evsel->pmu_name); 2852 + } 2853 + 2854 + struct evsel *evsel__leader(struct evsel *evsel) 2855 + { 2856 + return container_of(evsel->core.leader, struct evsel, core); 2857 + } 2858 + 2859 + bool evsel__has_leader(struct evsel *evsel, struct evsel *leader) 2860 + { 2861 + return evsel->core.leader == &leader->core; 2862 + } 2863 + 2864 + bool evsel__is_leader(struct evsel *evsel) 2865 + { 2866 + return evsel__has_leader(evsel, evsel); 2867 + } 2868 + 2869 + void evsel__set_leader(struct evsel *evsel, struct evsel *leader) 2870 + { 2871 + evsel->core.leader = &leader->core; 2851 2872 }
+8 -5
tools/perf/util/evsel.h
··· 118 118 bool reset_group; 119 119 bool errored; 120 120 struct hashmap *per_pkg_mask; 121 - struct evsel *leader; 122 121 int err; 123 122 int cpu_iter; 124 123 struct { ··· 366 367 */ 367 368 static inline bool evsel__is_group_leader(const struct evsel *evsel) 368 369 { 369 - return evsel->leader == evsel; 370 + return evsel->core.leader == &evsel->core; 370 371 } 371 372 372 373 /** ··· 404 405 405 406 static inline int evsel__group_idx(struct evsel *evsel) 406 407 { 407 - return evsel->core.idx - evsel->leader->core.idx; 408 + return evsel->core.idx - evsel->core.leader->idx; 408 409 } 409 410 410 411 /* Iterates group WITHOUT the leader. */ 411 412 #define for_each_group_member(_evsel, _leader) \ 412 413 for ((_evsel) = list_entry((_leader)->core.node.next, struct evsel, core.node); \ 413 - (_evsel) && (_evsel)->leader == (_leader); \ 414 + (_evsel) && (_evsel)->core.leader == (&_leader->core); \ 414 415 (_evsel) = list_entry((_evsel)->core.node.next, struct evsel, core.node)) 415 416 416 417 /* Iterates group WITH the leader. */ 417 418 #define for_each_group_evsel(_evsel, _leader) \ 418 419 for ((_evsel) = _leader; \ 419 - (_evsel) && (_evsel)->leader == (_leader); \ 420 + (_evsel) && (_evsel)->core.leader == (&_leader->core); \ 420 421 (_evsel) = list_entry((_evsel)->core.node.next, struct evsel, core.node)) 421 422 422 423 static inline bool evsel__has_branch_callstack(const struct evsel *evsel) ··· 461 462 462 463 void evsel__zero_per_pkg(struct evsel *evsel); 463 464 bool evsel__is_hybrid(struct evsel *evsel); 465 + struct evsel *evsel__leader(struct evsel *evsel); 466 + bool evsel__has_leader(struct evsel *evsel, struct evsel *leader); 467 + bool evsel__is_leader(struct evsel *evsel); 468 + void evsel__set_leader(struct evsel *evsel, struct evsel *leader); 464 469 #endif /* __PERF_EVSEL_H */
+2 -2
tools/perf/util/header.c
··· 2740 2740 i = nr = 0; 2741 2741 evlist__for_each_entry(session->evlist, evsel) { 2742 2742 if (evsel->core.idx == (int) desc[i].leader_idx) { 2743 - evsel->leader = evsel; 2743 + evsel__set_leader(evsel, evsel); 2744 2744 /* {anon_group} is a dummy name */ 2745 2745 if (strcmp(desc[i].name, "{anon_group}")) { 2746 2746 evsel->group_name = desc[i].name; ··· 2758 2758 i++; 2759 2759 } else if (nr) { 2760 2760 /* This is a group member */ 2761 - evsel->leader = leader; 2761 + evsel__set_leader(evsel, leader); 2762 2762 2763 2763 nr--; 2764 2764 }
+4 -4
tools/perf/util/metricgroup.c
··· 221 221 /* Ignore event if already used and merging is disabled. */ 222 222 if (metric_no_merge && test_bit(ev->core.idx, evlist_used)) 223 223 continue; 224 - if (!has_constraint && ev->leader != current_leader) { 224 + if (!has_constraint && !evsel__has_leader(ev, current_leader)) { 225 225 /* 226 226 * Start of a new group, discard the whole match and 227 227 * start again. ··· 229 229 matched_events = 0; 230 230 memset(metric_events, 0, 231 231 sizeof(struct evsel *) * idnum); 232 - current_leader = ev->leader; 232 + current_leader = evsel__leader(ev); 233 233 } 234 234 /* 235 235 * Check for duplicate events with the same name. For example, ··· 287 287 * when then group is left. 288 288 */ 289 289 if (!has_constraint && 290 - ev->leader != metric_events[i]->leader && 291 - evsel_same_pmu_or_none(ev->leader, metric_events[i]->leader)) 290 + ev->core.leader != metric_events[i]->core.leader && 291 + evsel_same_pmu_or_none(evsel__leader(ev), evsel__leader(metric_events[i]))) 292 292 break; 293 293 if (!strcmp(metric_events[i]->name, ev->name)) { 294 294 set_bit(ev->core.idx, evlist_used);
+1 -1
tools/perf/util/parse-events.c
··· 1800 1800 __evlist__for_each_entry(list, evsel) { 1801 1801 if (i >= nr_pmu) 1802 1802 i = 0; 1803 - evsel->leader = (struct evsel *) leaders[i++]; 1803 + evsel__set_leader(evsel, (struct evsel *) leaders[i++]); 1804 1804 } 1805 1805 1806 1806 /* The number of members and group name are same for each group */
+3 -3
tools/perf/util/record.c
··· 25 25 */ 26 26 static struct evsel *evsel__read_sampler(struct evsel *evsel, struct evlist *evlist) 27 27 { 28 - struct evsel *leader = evsel->leader; 28 + struct evsel *leader = evsel__leader(evsel); 29 29 30 30 if (evsel__is_aux_event(leader) || arch_topdown_sample_read(leader) || 31 31 is_mem_loads_aux_event(leader)) { 32 32 evlist__for_each_entry(evlist, evsel) { 33 - if (evsel->leader == leader && evsel != evsel->leader) 33 + if (evsel__leader(evsel) == leader && evsel != evsel__leader(evsel)) 34 34 return evsel; 35 35 } 36 36 } ··· 53 53 static void evsel__config_leader_sampling(struct evsel *evsel, struct evlist *evlist) 54 54 { 55 55 struct perf_event_attr *attr = &evsel->core.attr; 56 - struct evsel *leader = evsel->leader; 56 + struct evsel *leader = evsel__leader(evsel); 57 57 struct evsel *read_sampler; 58 58 u64 term_types, freq_mask; 59 59
+1 -1
tools/perf/util/stat-shadow.c
··· 379 379 evlist__for_each_entry(evsel_list, counter) { 380 380 bool invalid = false; 381 381 382 - leader = counter->leader; 382 + leader = evsel__leader(counter); 383 383 if (!counter->metric_expr) 384 384 continue; 385 385
+1 -1
tools/perf/util/stat.c
··· 534 534 int cpu) 535 535 { 536 536 struct perf_event_attr *attr = &evsel->core.attr; 537 - struct evsel *leader = evsel->leader; 537 + struct evsel *leader = evsel__leader(evsel); 538 538 539 539 attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | 540 540 PERF_FORMAT_TOTAL_TIME_RUNNING;