libperf: Move 'idx' from tools/perf to perf_evsel::idx
Move evsel::idx to perf_evsel::idx, so we can move the group interface to libperf. Committer notes: Fixup evsel->idx usage in tools/perf/util/bpf_counter_cgroup.c, that appeared in my tree in my local tree. Also fixed up these: $ find tools/perf/ -name "*.[ch]" | xargs grep 'evsel->idx' tools/perf/ui/gtk/annotate.c: evsel->idx + i); tools/perf/ui/gtk/annotate.c: evsel->idx); $ That running 'make -C tools/perf build-test' caught. 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-3-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
3d970601da
Коммит
38fe0e0156
|
@ -66,6 +66,7 @@ static void perf_evlist__propagate_maps(struct perf_evlist *evlist)
|
||||||
void perf_evlist__add(struct perf_evlist *evlist,
|
void perf_evlist__add(struct perf_evlist *evlist,
|
||||||
struct perf_evsel *evsel)
|
struct perf_evsel *evsel)
|
||||||
{
|
{
|
||||||
|
evsel->idx = evlist->nr_entries;
|
||||||
list_add_tail(&evsel->node, &evlist->entries);
|
list_add_tail(&evsel->node, &evlist->entries);
|
||||||
evlist->nr_entries += 1;
|
evlist->nr_entries += 1;
|
||||||
__perf_evlist__propagate_maps(evlist, evsel);
|
__perf_evlist__propagate_maps(evlist, evsel);
|
||||||
|
|
|
@ -18,10 +18,12 @@
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr)
|
void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr,
|
||||||
|
int idx)
|
||||||
{
|
{
|
||||||
INIT_LIST_HEAD(&evsel->node);
|
INIT_LIST_HEAD(&evsel->node);
|
||||||
evsel->attr = *attr;
|
evsel->attr = *attr;
|
||||||
|
evsel->idx = idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr)
|
struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr)
|
||||||
|
@ -29,7 +31,7 @@ struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr)
|
||||||
struct perf_evsel *evsel = zalloc(sizeof(*evsel));
|
struct perf_evsel *evsel = zalloc(sizeof(*evsel));
|
||||||
|
|
||||||
if (evsel != NULL)
|
if (evsel != NULL)
|
||||||
perf_evsel__init(evsel, attr);
|
perf_evsel__init(evsel, attr, 0);
|
||||||
|
|
||||||
return evsel;
|
return evsel;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,9 +49,11 @@ struct perf_evsel {
|
||||||
/* parse modifier helper */
|
/* parse modifier helper */
|
||||||
int nr_members;
|
int nr_members;
|
||||||
bool system_wide;
|
bool system_wide;
|
||||||
|
int idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr);
|
void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr,
|
||||||
|
int idx);
|
||||||
int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads);
|
int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads);
|
||||||
void perf_evsel__close_fd(struct perf_evsel *evsel);
|
void perf_evsel__close_fd(struct perf_evsel *evsel);
|
||||||
void perf_evsel__free_fd(struct perf_evsel *evsel);
|
void perf_evsel__free_fd(struct perf_evsel *evsel);
|
||||||
|
|
|
@ -322,7 +322,7 @@ static int iostat_event_group(struct evlist *evl,
|
||||||
}
|
}
|
||||||
|
|
||||||
evlist__for_each_entry(evl, evsel) {
|
evlist__for_each_entry(evl, evsel) {
|
||||||
evsel->priv = list->rps[evsel->idx / metrics_count];
|
evsel->priv = list->rps[evsel->core.idx / metrics_count];
|
||||||
}
|
}
|
||||||
list->nr_entries = 0;
|
list->nr_entries = 0;
|
||||||
err:
|
err:
|
||||||
|
@ -428,7 +428,7 @@ void iostat_print_metric(struct perf_stat_config *config, struct evsel *evsel,
|
||||||
{
|
{
|
||||||
double iostat_value = 0;
|
double iostat_value = 0;
|
||||||
u64 prev_count_val = 0;
|
u64 prev_count_val = 0;
|
||||||
const char *iostat_metric = iostat_metric_by_idx(evsel->idx);
|
const char *iostat_metric = iostat_metric_by_idx(evsel->core.idx);
|
||||||
u8 die = ((struct iio_root_port *)evsel->priv)->die;
|
u8 die = ((struct iio_root_port *)evsel->priv)->die;
|
||||||
struct perf_counts_values *count = perf_counts(evsel->counts, die, 0);
|
struct perf_counts_values *count = perf_counts(evsel->counts, die, 0);
|
||||||
|
|
||||||
|
|
|
@ -1031,12 +1031,12 @@ static int process_base_stream(struct data__file *data_base,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
es_base = evsel_streams__entry(data_base->evlist_streams,
|
es_base = evsel_streams__entry(data_base->evlist_streams,
|
||||||
evsel_base->idx);
|
evsel_base->core.idx);
|
||||||
if (!es_base)
|
if (!es_base)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
es_pair = evsel_streams__entry(data_pair->evlist_streams,
|
es_pair = evsel_streams__entry(data_pair->evlist_streams,
|
||||||
evsel_pair->idx);
|
evsel_pair->core.idx);
|
||||||
if (!es_pair)
|
if (!es_pair)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
|
|
@ -332,7 +332,7 @@ static int process_read_event(struct perf_tool *tool,
|
||||||
const char *name = evsel__name(evsel);
|
const char *name = evsel__name(evsel);
|
||||||
int err = perf_read_values_add_value(&rep->show_threads_values,
|
int err = perf_read_values_add_value(&rep->show_threads_values,
|
||||||
event->read.pid, event->read.tid,
|
event->read.pid, event->read.tid,
|
||||||
evsel->idx,
|
evsel->core.idx,
|
||||||
name,
|
name,
|
||||||
event->read.value);
|
event->read.value);
|
||||||
|
|
||||||
|
@ -666,7 +666,7 @@ static int report__collapse_hists(struct report *rep)
|
||||||
evlist__for_each_entry(rep->session->evlist, pos) {
|
evlist__for_each_entry(rep->session->evlist, pos) {
|
||||||
struct hists *hists = evsel__hists(pos);
|
struct hists *hists = evsel__hists(pos);
|
||||||
|
|
||||||
if (pos->idx == 0)
|
if (pos->core.idx == 0)
|
||||||
hists->symbol_filter_str = rep->symbol_filter_str;
|
hists->symbol_filter_str = rep->symbol_filter_str;
|
||||||
|
|
||||||
hists->socket_filter = rep->socket_filter;
|
hists->socket_filter = rep->socket_filter;
|
||||||
|
|
|
@ -264,9 +264,9 @@ static void perf_top__show_details(struct perf_top *top)
|
||||||
|
|
||||||
if (top->evlist->enabled) {
|
if (top->evlist->enabled) {
|
||||||
if (top->zero)
|
if (top->zero)
|
||||||
symbol__annotate_zero_histogram(symbol, top->sym_evsel->idx);
|
symbol__annotate_zero_histogram(symbol, top->sym_evsel->core.idx);
|
||||||
else
|
else
|
||||||
symbol__annotate_decay_histogram(symbol, top->sym_evsel->idx);
|
symbol__annotate_decay_histogram(symbol, top->sym_evsel->core.idx);
|
||||||
}
|
}
|
||||||
if (more != 0)
|
if (more != 0)
|
||||||
printf("%d lines not displayed, maybe increase display entries [e]\n", more);
|
printf("%d lines not displayed, maybe increase display entries [e]\n", more);
|
||||||
|
@ -530,7 +530,7 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)
|
||||||
fprintf(stderr, "\nAvailable events:");
|
fprintf(stderr, "\nAvailable events:");
|
||||||
|
|
||||||
evlist__for_each_entry(top->evlist, top->sym_evsel)
|
evlist__for_each_entry(top->evlist, top->sym_evsel)
|
||||||
fprintf(stderr, "\n\t%d %s", top->sym_evsel->idx, evsel__name(top->sym_evsel));
|
fprintf(stderr, "\n\t%d %s", top->sym_evsel->core.idx, evsel__name(top->sym_evsel));
|
||||||
|
|
||||||
prompt_integer(&counter, "Enter details event counter");
|
prompt_integer(&counter, "Enter details event counter");
|
||||||
|
|
||||||
|
@ -541,7 +541,7 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
evlist__for_each_entry(top->evlist, top->sym_evsel)
|
evlist__for_each_entry(top->evlist, top->sym_evsel)
|
||||||
if (top->sym_evsel->idx == counter)
|
if (top->sym_evsel->core.idx == counter)
|
||||||
break;
|
break;
|
||||||
} else
|
} else
|
||||||
top->sym_evsel = evlist__first(top->evlist);
|
top->sym_evsel = evlist__first(top->evlist);
|
||||||
|
|
|
@ -44,7 +44,7 @@ static int perf_evsel__roundtrip_cache_name_test(void)
|
||||||
|
|
||||||
for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
|
for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
|
||||||
__evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name));
|
__evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name));
|
||||||
if (evsel->idx != idx)
|
if (evsel->core.idx != idx)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
++idx;
|
++idx;
|
||||||
|
@ -84,9 +84,9 @@ static int __perf_evsel__name_array_test(const char *names[], int nr_names,
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
evlist__for_each_entry(evlist, evsel) {
|
evlist__for_each_entry(evlist, evsel) {
|
||||||
if (strcmp(evsel__name(evsel), names[evsel->idx / distance])) {
|
if (strcmp(evsel__name(evsel), names[evsel->core.idx / distance])) {
|
||||||
--err;
|
--err;
|
||||||
pr_debug("%s != %s\n", evsel__name(evsel), names[evsel->idx / distance]);
|
pr_debug("%s != %s\n", evsel__name(evsel), names[evsel->core.idx / distance]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse
|
||||||
" doesn't map to an evsel\n", sample.id);
|
" doesn't map to an evsel\n", sample.id);
|
||||||
goto out_delete_evlist;
|
goto out_delete_evlist;
|
||||||
}
|
}
|
||||||
nr_events[evsel->idx]++;
|
nr_events[evsel->core.idx]++;
|
||||||
perf_mmap__consume(&md->core);
|
perf_mmap__consume(&md->core);
|
||||||
}
|
}
|
||||||
perf_mmap__read_done(&md->core);
|
perf_mmap__read_done(&md->core);
|
||||||
|
@ -147,10 +147,10 @@ int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unuse
|
||||||
out_init:
|
out_init:
|
||||||
err = 0;
|
err = 0;
|
||||||
evlist__for_each_entry(evlist, evsel) {
|
evlist__for_each_entry(evlist, evsel) {
|
||||||
if (nr_events[evsel->idx] != expected_nr_events[evsel->idx]) {
|
if (nr_events[evsel->core.idx] != expected_nr_events[evsel->core.idx]) {
|
||||||
pr_debug("expected %d %s events, got %d\n",
|
pr_debug("expected %d %s events, got %d\n",
|
||||||
expected_nr_events[evsel->idx],
|
expected_nr_events[evsel->core.idx],
|
||||||
evsel__name(evsel), nr_events[evsel->idx]);
|
evsel__name(evsel), nr_events[evsel->core.idx]);
|
||||||
err = -1;
|
err = -1;
|
||||||
goto out_delete_evlist;
|
goto out_delete_evlist;
|
||||||
}
|
}
|
||||||
|
|
|
@ -749,7 +749,7 @@ static int annotate_browser__run(struct annotate_browser *browser,
|
||||||
hbt->timer(hbt->arg);
|
hbt->timer(hbt->arg);
|
||||||
|
|
||||||
if (delay_secs != 0) {
|
if (delay_secs != 0) {
|
||||||
symbol__annotate_decay_histogram(sym, evsel->idx);
|
symbol__annotate_decay_histogram(sym, evsel->core.idx);
|
||||||
hists__scnprintf_title(hists, title, sizeof(title));
|
hists__scnprintf_title(hists, title, sizeof(title));
|
||||||
annotate_browser__show(&browser->b, title, help);
|
annotate_browser__show(&browser->b, title, help);
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,12 +135,12 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct map_symbol *ms,
|
||||||
ret += perf_gtk__get_percent(s + ret,
|
ret += perf_gtk__get_percent(s + ret,
|
||||||
sizeof(s) - ret,
|
sizeof(s) - ret,
|
||||||
sym, pos,
|
sym, pos,
|
||||||
evsel->idx + i);
|
evsel->core.idx + i);
|
||||||
ret += scnprintf(s + ret, sizeof(s) - ret, " ");
|
ret += scnprintf(s + ret, sizeof(s) - ret, " ");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = perf_gtk__get_percent(s, sizeof(s), sym, pos,
|
ret = perf_gtk__get_percent(s, sizeof(s), sym, pos,
|
||||||
evsel->idx);
|
evsel->core.idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -961,7 +961,7 @@ static int symbol__inc_addr_samples(struct map_symbol *ms,
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
src = symbol__hists(sym, evsel->evlist->core.nr_entries);
|
src = symbol__hists(sym, evsel->evlist->core.nr_entries);
|
||||||
return src ? __symbol__inc_addr_samples(ms, src, evsel->idx, addr, sample) : 0;
|
return src ? __symbol__inc_addr_samples(ms, src, evsel->core.idx, addr, sample) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int symbol__account_cycles(u64 addr, u64 start,
|
static int symbol__account_cycles(u64 addr, u64 start,
|
||||||
|
@ -2159,7 +2159,7 @@ static void annotation__calc_percent(struct annotation *notes,
|
||||||
|
|
||||||
BUG_ON(i >= al->data_nr);
|
BUG_ON(i >= al->data_nr);
|
||||||
|
|
||||||
sym_hist = annotation__histogram(notes, evsel->idx);
|
sym_hist = annotation__histogram(notes, evsel->core.idx);
|
||||||
data = &al->data[i++];
|
data = &al->data[i++];
|
||||||
|
|
||||||
calc_percent(sym_hist, hists, data, al->offset, end);
|
calc_percent(sym_hist, hists, data, al->offset, end);
|
||||||
|
@ -2340,7 +2340,7 @@ static void print_summary(struct rb_root *root, const char *filename)
|
||||||
static void symbol__annotate_hits(struct symbol *sym, struct evsel *evsel)
|
static void symbol__annotate_hits(struct symbol *sym, struct evsel *evsel)
|
||||||
{
|
{
|
||||||
struct annotation *notes = symbol__annotation(sym);
|
struct annotation *notes = symbol__annotation(sym);
|
||||||
struct sym_hist *h = annotation__histogram(notes, evsel->idx);
|
struct sym_hist *h = annotation__histogram(notes, evsel->core.idx);
|
||||||
u64 len = symbol__size(sym), offset;
|
u64 len = symbol__size(sym), offset;
|
||||||
|
|
||||||
for (offset = 0; offset < len; ++offset)
|
for (offset = 0; offset < len; ++offset)
|
||||||
|
@ -2373,7 +2373,7 @@ int symbol__annotate_printf(struct map_symbol *ms, struct evsel *evsel,
|
||||||
const char *d_filename;
|
const char *d_filename;
|
||||||
const char *evsel_name = evsel__name(evsel);
|
const char *evsel_name = evsel__name(evsel);
|
||||||
struct annotation *notes = symbol__annotation(sym);
|
struct annotation *notes = symbol__annotation(sym);
|
||||||
struct sym_hist *h = annotation__histogram(notes, evsel->idx);
|
struct sym_hist *h = annotation__histogram(notes, evsel->core.idx);
|
||||||
struct annotation_line *pos, *queue = NULL;
|
struct annotation_line *pos, *queue = NULL;
|
||||||
u64 start = map__rip_2objdump(map, sym->start);
|
u64 start = map__rip_2objdump(map, sym->start);
|
||||||
int printed = 2, queue_len = 0, addr_fmt_width;
|
int printed = 2, queue_len = 0, addr_fmt_width;
|
||||||
|
|
|
@ -124,7 +124,7 @@ static int bperf_load_program(struct evlist *evlist)
|
||||||
map_fd = bpf_map__fd(skel->maps.events);
|
map_fd = bpf_map__fd(skel->maps.events);
|
||||||
for (cpu = 0; cpu < nr_cpus; cpu++) {
|
for (cpu = 0; cpu < nr_cpus; cpu++) {
|
||||||
int fd = FD(evsel, cpu);
|
int fd = FD(evsel, cpu);
|
||||||
__u32 idx = evsel->idx * total_cpus +
|
__u32 idx = evsel->core.idx * total_cpus +
|
||||||
evlist->core.all_cpus->map[cpu];
|
evlist->core.all_cpus->map[cpu];
|
||||||
|
|
||||||
err = bpf_map_update_elem(map_fd, &idx, &fd,
|
err = bpf_map_update_elem(map_fd, &idx, &fd,
|
||||||
|
@ -221,7 +221,7 @@ static int bperf_cgrp__sync_counters(struct evlist *evlist)
|
||||||
|
|
||||||
static int bperf_cgrp__enable(struct evsel *evsel)
|
static int bperf_cgrp__enable(struct evsel *evsel)
|
||||||
{
|
{
|
||||||
if (evsel->idx)
|
if (evsel->core.idx)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bperf_cgrp__sync_counters(evsel->evlist);
|
bperf_cgrp__sync_counters(evsel->evlist);
|
||||||
|
@ -232,7 +232,7 @@ static int bperf_cgrp__enable(struct evsel *evsel)
|
||||||
|
|
||||||
static int bperf_cgrp__disable(struct evsel *evsel)
|
static int bperf_cgrp__disable(struct evsel *evsel)
|
||||||
{
|
{
|
||||||
if (evsel->idx)
|
if (evsel->core.idx)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bperf_cgrp__sync_counters(evsel->evlist);
|
bperf_cgrp__sync_counters(evsel->evlist);
|
||||||
|
@ -251,7 +251,7 @@ static int bperf_cgrp__read(struct evsel *evsel)
|
||||||
int reading_map_fd, err = 0;
|
int reading_map_fd, err = 0;
|
||||||
__u32 idx;
|
__u32 idx;
|
||||||
|
|
||||||
if (evsel->idx)
|
if (evsel->core.idx)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bperf_cgrp__sync_counters(evsel->evlist);
|
bperf_cgrp__sync_counters(evsel->evlist);
|
||||||
|
@ -263,7 +263,7 @@ static int bperf_cgrp__read(struct evsel *evsel)
|
||||||
reading_map_fd = bpf_map__fd(skel->maps.cgrp_readings);
|
reading_map_fd = bpf_map__fd(skel->maps.cgrp_readings);
|
||||||
|
|
||||||
evlist__for_each_entry(evlist, evsel) {
|
evlist__for_each_entry(evlist, evsel) {
|
||||||
idx = evsel->idx;
|
idx = evsel->core.idx;
|
||||||
err = bpf_map_lookup_elem(reading_map_fd, &idx, values);
|
err = bpf_map_lookup_elem(reading_map_fd, &idx, values);
|
||||||
if (err) {
|
if (err) {
|
||||||
pr_err("bpf map lookup falied: idx=%u, event=%s, cgrp=%s\n",
|
pr_err("bpf map lookup falied: idx=%u, event=%s, cgrp=%s\n",
|
||||||
|
@ -288,7 +288,7 @@ out:
|
||||||
|
|
||||||
static int bperf_cgrp__destroy(struct evsel *evsel)
|
static int bperf_cgrp__destroy(struct evsel *evsel)
|
||||||
{
|
{
|
||||||
if (evsel->idx)
|
if (evsel->core.idx)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bperf_cgroup_bpf__destroy(skel);
|
bperf_cgroup_bpf__destroy(skel);
|
||||||
|
|
|
@ -165,11 +165,9 @@ void evlist__delete(struct evlist *evlist)
|
||||||
|
|
||||||
void evlist__add(struct evlist *evlist, struct evsel *entry)
|
void evlist__add(struct evlist *evlist, struct evsel *entry)
|
||||||
{
|
{
|
||||||
entry->evlist = evlist;
|
|
||||||
entry->idx = evlist->core.nr_entries;
|
|
||||||
entry->tracking = !entry->idx;
|
|
||||||
|
|
||||||
perf_evlist__add(&evlist->core, &entry->core);
|
perf_evlist__add(&evlist->core, &entry->core);
|
||||||
|
entry->evlist = evlist;
|
||||||
|
entry->tracking = !entry->core.idx;
|
||||||
|
|
||||||
if (evlist->core.nr_entries == 1)
|
if (evlist->core.nr_entries == 1)
|
||||||
evlist__set_id_pos(evlist);
|
evlist__set_id_pos(evlist);
|
||||||
|
@ -232,7 +230,7 @@ void __evlist__set_leader(struct list_head *list)
|
||||||
leader = list_entry(list->next, struct evsel, core.node);
|
leader = list_entry(list->next, struct evsel, core.node);
|
||||||
evsel = list_entry(list->prev, struct evsel, core.node);
|
evsel = list_entry(list->prev, struct evsel, core.node);
|
||||||
|
|
||||||
leader->core.nr_members = evsel->idx - leader->idx + 1;
|
leader->core.nr_members = evsel->core.idx - leader->core.idx + 1;
|
||||||
|
|
||||||
__evlist__for_each_entry(list, evsel) {
|
__evlist__for_each_entry(list, evsel) {
|
||||||
evsel->leader = leader;
|
evsel->leader = leader;
|
||||||
|
@ -2137,7 +2135,7 @@ struct evsel *evlist__find_evsel(struct evlist *evlist, int idx)
|
||||||
struct evsel *evsel;
|
struct evsel *evsel;
|
||||||
|
|
||||||
evlist__for_each_entry(evlist, evsel) {
|
evlist__for_each_entry(evlist, evsel) {
|
||||||
if (evsel->idx == idx)
|
if (evsel->core.idx == idx)
|
||||||
return evsel;
|
return evsel;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -239,8 +239,7 @@ bool evsel__is_function_event(struct evsel *evsel)
|
||||||
void evsel__init(struct evsel *evsel,
|
void evsel__init(struct evsel *evsel,
|
||||||
struct perf_event_attr *attr, int idx)
|
struct perf_event_attr *attr, int idx)
|
||||||
{
|
{
|
||||||
perf_evsel__init(&evsel->core, attr);
|
perf_evsel__init(&evsel->core, attr, idx);
|
||||||
evsel->idx = idx;
|
|
||||||
evsel->tracking = !idx;
|
evsel->tracking = !idx;
|
||||||
evsel->leader = evsel;
|
evsel->leader = evsel;
|
||||||
evsel->unit = "";
|
evsel->unit = "";
|
||||||
|
|
|
@ -49,7 +49,6 @@ struct evsel {
|
||||||
struct perf_evsel core;
|
struct perf_evsel core;
|
||||||
struct evlist *evlist;
|
struct evlist *evlist;
|
||||||
off_t id_offset;
|
off_t id_offset;
|
||||||
int idx;
|
|
||||||
int id_pos;
|
int id_pos;
|
||||||
int is_pos;
|
int is_pos;
|
||||||
unsigned int sample_size;
|
unsigned int sample_size;
|
||||||
|
@ -406,7 +405,7 @@ int evsel__open_strerror(struct evsel *evsel, struct target *target,
|
||||||
|
|
||||||
static inline int evsel__group_idx(struct evsel *evsel)
|
static inline int evsel__group_idx(struct evsel *evsel)
|
||||||
{
|
{
|
||||||
return evsel->idx - evsel->leader->idx;
|
return evsel->core.idx - evsel->leader->core.idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Iterates group WITHOUT the leader. */
|
/* Iterates group WITHOUT the leader. */
|
||||||
|
|
|
@ -789,7 +789,7 @@ static int write_group_desc(struct feat_fd *ff,
|
||||||
evlist__for_each_entry(evlist, evsel) {
|
evlist__for_each_entry(evlist, evsel) {
|
||||||
if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
|
if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
|
||||||
const char *name = evsel->group_name ?: "{anon_group}";
|
const char *name = evsel->group_name ?: "{anon_group}";
|
||||||
u32 leader_idx = evsel->idx;
|
u32 leader_idx = evsel->core.idx;
|
||||||
u32 nr_members = evsel->core.nr_members;
|
u32 nr_members = evsel->core.nr_members;
|
||||||
|
|
||||||
ret = do_write_string(ff, name);
|
ret = do_write_string(ff, name);
|
||||||
|
@ -1844,7 +1844,7 @@ static struct evsel *read_event_desc(struct feat_fd *ff)
|
||||||
msz = sz;
|
msz = sz;
|
||||||
|
|
||||||
for (i = 0, evsel = events; i < nre; evsel++, i++) {
|
for (i = 0, evsel = events; i < nre; evsel++, i++) {
|
||||||
evsel->idx = i;
|
evsel->core.idx = i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* must read entire on-file attr struct to
|
* must read entire on-file attr struct to
|
||||||
|
@ -2379,7 +2379,7 @@ static struct evsel *evlist__find_by_index(struct evlist *evlist, int idx)
|
||||||
struct evsel *evsel;
|
struct evsel *evsel;
|
||||||
|
|
||||||
evlist__for_each_entry(evlist, evsel) {
|
evlist__for_each_entry(evlist, evsel) {
|
||||||
if (evsel->idx == idx)
|
if (evsel->core.idx == idx)
|
||||||
return evsel;
|
return evsel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2393,7 +2393,7 @@ static void evlist__set_event_name(struct evlist *evlist, struct evsel *event)
|
||||||
if (!event->name)
|
if (!event->name)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
evsel = evlist__find_by_index(evlist, event->idx);
|
evsel = evlist__find_by_index(evlist, event->core.idx);
|
||||||
if (!evsel)
|
if (!evsel)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -2739,7 +2739,7 @@ static int process_group_desc(struct feat_fd *ff, void *data __maybe_unused)
|
||||||
|
|
||||||
i = nr = 0;
|
i = nr = 0;
|
||||||
evlist__for_each_entry(session->evlist, evsel) {
|
evlist__for_each_entry(session->evlist, evsel) {
|
||||||
if (evsel->idx == (int) desc[i].leader_idx) {
|
if (evsel->core.idx == (int) desc[i].leader_idx) {
|
||||||
evsel->leader = evsel;
|
evsel->leader = evsel;
|
||||||
/* {anon_group} is a dummy name */
|
/* {anon_group} is a dummy name */
|
||||||
if (strcmp(desc[i].name, "{anon_group}")) {
|
if (strcmp(desc[i].name, "{anon_group}")) {
|
||||||
|
|
|
@ -219,7 +219,7 @@ static struct evsel *find_evsel_group(struct evlist *perf_evlist,
|
||||||
if (has_constraint && ev->weak_group)
|
if (has_constraint && ev->weak_group)
|
||||||
continue;
|
continue;
|
||||||
/* Ignore event if already used and merging is disabled. */
|
/* Ignore event if already used and merging is disabled. */
|
||||||
if (metric_no_merge && test_bit(ev->idx, evlist_used))
|
if (metric_no_merge && test_bit(ev->core.idx, evlist_used))
|
||||||
continue;
|
continue;
|
||||||
if (!has_constraint && ev->leader != current_leader) {
|
if (!has_constraint && ev->leader != current_leader) {
|
||||||
/*
|
/*
|
||||||
|
@ -269,7 +269,7 @@ static struct evsel *find_evsel_group(struct evlist *perf_evlist,
|
||||||
for (i = 0; i < idnum; i++) {
|
for (i = 0; i < idnum; i++) {
|
||||||
ev = metric_events[i];
|
ev = metric_events[i];
|
||||||
/* Don't free the used events. */
|
/* Don't free the used events. */
|
||||||
set_bit(ev->idx, evlist_used);
|
set_bit(ev->core.idx, evlist_used);
|
||||||
/*
|
/*
|
||||||
* The metric leader points to the identically named event in
|
* The metric leader points to the identically named event in
|
||||||
* metric_events.
|
* metric_events.
|
||||||
|
@ -291,7 +291,7 @@ static struct evsel *find_evsel_group(struct evlist *perf_evlist,
|
||||||
evsel_same_pmu_or_none(ev->leader, metric_events[i]->leader))
|
evsel_same_pmu_or_none(ev->leader, metric_events[i]->leader))
|
||||||
break;
|
break;
|
||||||
if (!strcmp(metric_events[i]->name, ev->name)) {
|
if (!strcmp(metric_events[i]->name, ev->name)) {
|
||||||
set_bit(ev->idx, evlist_used);
|
set_bit(ev->core.idx, evlist_used);
|
||||||
ev->metric_leader = metric_events[i];
|
ev->metric_leader = metric_events[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -391,7 +391,7 @@ static int metricgroup__setup_events(struct list_head *groups,
|
||||||
}
|
}
|
||||||
|
|
||||||
evlist__for_each_entry_safe(perf_evlist, tmp, evsel) {
|
evlist__for_each_entry_safe(perf_evlist, tmp, evsel) {
|
||||||
if (!test_bit(evsel->idx, evlist_used)) {
|
if (!test_bit(evsel->core.idx, evlist_used)) {
|
||||||
evlist__remove(perf_evlist, evsel);
|
evlist__remove(perf_evlist, evsel);
|
||||||
evsel__delete(evsel);
|
evsel__delete(evsel);
|
||||||
}
|
}
|
||||||
|
@ -1312,7 +1312,7 @@ int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp,
|
||||||
nd = rblist__entry(old_metric_events, i);
|
nd = rblist__entry(old_metric_events, i);
|
||||||
old_me = container_of(nd, struct metric_event, nd);
|
old_me = container_of(nd, struct metric_event, nd);
|
||||||
|
|
||||||
evsel = evlist__find_evsel(evlist, old_me->evsel->idx);
|
evsel = evlist__find_evsel(evlist, old_me->evsel->core.idx);
|
||||||
if (!evsel)
|
if (!evsel)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
new_me = metricgroup__lookup(new_metric_events, evsel, true);
|
new_me = metricgroup__lookup(new_metric_events, evsel, true);
|
||||||
|
@ -1320,7 +1320,7 @@ int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
pr_debug("copying metric event for cgroup '%s': %s (idx=%d)\n",
|
pr_debug("copying metric event for cgroup '%s': %s (idx=%d)\n",
|
||||||
cgrp ? cgrp->name : "root", evsel->name, evsel->idx);
|
cgrp ? cgrp->name : "root", evsel->name, evsel->core.idx);
|
||||||
|
|
||||||
list_for_each_entry(old_expr, &old_me->head, nd) {
|
list_for_each_entry(old_expr, &old_me->head, nd) {
|
||||||
new_expr = malloc(sizeof(*new_expr));
|
new_expr = malloc(sizeof(*new_expr));
|
||||||
|
@ -1363,7 +1363,7 @@ int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp,
|
||||||
/* copy evsel in the same position */
|
/* copy evsel in the same position */
|
||||||
for (idx = 0; idx < nr; idx++) {
|
for (idx = 0; idx < nr; idx++) {
|
||||||
evsel = old_expr->metric_events[idx];
|
evsel = old_expr->metric_events[idx];
|
||||||
evsel = evlist__find_evsel(evlist, evsel->idx);
|
evsel = evlist__find_evsel(evlist, evsel->core.idx);
|
||||||
if (evsel == NULL) {
|
if (evsel == NULL) {
|
||||||
free(new_expr->metric_events);
|
free(new_expr->metric_events);
|
||||||
free(new_expr->metric_refs);
|
free(new_expr->metric_refs);
|
||||||
|
|
|
@ -1740,7 +1740,7 @@ parse_events__set_leader_for_uncore_aliase(char *name, struct list_head *list,
|
||||||
|
|
||||||
leader = list_first_entry(list, struct evsel, core.node);
|
leader = list_first_entry(list, struct evsel, core.node);
|
||||||
evsel = list_last_entry(list, struct evsel, core.node);
|
evsel = list_last_entry(list, struct evsel, core.node);
|
||||||
total_members = evsel->idx - leader->idx + 1;
|
total_members = evsel->core.idx - leader->core.idx + 1;
|
||||||
|
|
||||||
leaders = calloc(total_members, sizeof(uintptr_t));
|
leaders = calloc(total_members, sizeof(uintptr_t));
|
||||||
if (WARN_ON(!leaders))
|
if (WARN_ON(!leaders))
|
||||||
|
|
|
@ -1032,7 +1032,7 @@ static PyObject *pyrf_evlist__add(struct pyrf_evlist *pevlist,
|
||||||
|
|
||||||
Py_INCREF(pevsel);
|
Py_INCREF(pevsel);
|
||||||
evsel = &((struct pyrf_evsel *)pevsel)->evsel;
|
evsel = &((struct pyrf_evsel *)pevsel)->evsel;
|
||||||
evsel->idx = evlist->core.nr_entries;
|
evsel->core.idx = evlist->core.nr_entries;
|
||||||
evlist__add(evlist, evsel);
|
evlist__add(evlist, evsel);
|
||||||
|
|
||||||
return Py_BuildValue("i", evlist->core.nr_entries);
|
return Py_BuildValue("i", evlist->core.nr_entries);
|
||||||
|
|
|
@ -139,7 +139,7 @@ static int evlist__init_callchain_streams(struct evlist *evlist,
|
||||||
|
|
||||||
hists__output_resort(hists, NULL);
|
hists__output_resort(hists, NULL);
|
||||||
init_hot_callchain(hists, &es[i]);
|
init_hot_callchain(hists, &es[i]);
|
||||||
es[i].evsel_idx = pos->idx;
|
es[i].evsel_idx = pos->core.idx;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче