Messages in this thread | | | From | Namhyung Kim <> | Date | Mon, 2 May 2022 16:51:30 -0700 | Subject | Re: [PATCH v4 1/6] perf cpumap: Switch to using perf_cpu_map API |
| |
Hi Ian,
On Fri, Apr 29, 2022 at 11:23 PM Ian Rogers <irogers@google.com> wrote: > > Switch some raw accesses to the cpu map to using the library API. This > can help with reference count checking. > > Signed-off-by: Ian Rogers <irogers@google.com> > --- [...] > diff --git a/tools/perf/util/bpf_counter_cgroup.c b/tools/perf/util/bpf_counter_cgroup.c > index ac60c08e8e2a..a4b676920da0 100644 > --- a/tools/perf/util/bpf_counter_cgroup.c > +++ b/tools/perf/util/bpf_counter_cgroup.c > @@ -47,7 +47,7 @@ static int bperf_load_program(struct evlist *evlist) > struct evsel *evsel; > struct cgroup *cgrp, *leader_cgrp; > __u32 i, cpu; > - __u32 nr_cpus = evlist->core.all_cpus->nr; > + __u32 nr_cpus = perf_cpu_map__nr(evlist->core.all_cpus); > int total_cpus = cpu__max_cpu().cpu; > int map_size, map_fd; > int prog_fd, err; > @@ -125,7 +125,7 @@ static int bperf_load_program(struct evlist *evlist) > for (cpu = 0; cpu < nr_cpus; cpu++) { > int fd = FD(evsel, cpu); > __u32 idx = evsel->core.idx * total_cpus + > - evlist->core.all_cpus->map[cpu].cpu; > + perf_cpu_map__cpu(evlist->core.all_cpus, cpu).cpu; > > err = bpf_map_update_elem(map_fd, &idx, &fd, > BPF_ANY); > @@ -207,13 +207,13 @@ static int bperf_cgrp__install_pe(struct evsel *evsel __maybe_unused, > */ > static int bperf_cgrp__sync_counters(struct evlist *evlist) > { > - int i, cpu; > - int nr_cpus = evlist->core.all_cpus->nr; > + struct perf_cpu cpu; > + int idx; > int prog_fd = bpf_program__fd(skel->progs.trigger_read); > > - for (i = 0; i < nr_cpus; i++) { > - cpu = evlist->core.all_cpus->map[i].cpu; > - bperf_trigger_reading(prog_fd, cpu); > + perf_cpu_map__for_each_cpu(cpu, idx, cpus) {
s/cpus/evlist->core.all_cpus/?
> + cpu = perf_cpu_map__cpu(evlist->core.all_cpus, i);
I don't think we need this line anymore.
> + bperf_trigger_reading(prog_fd, cpu.cpu); > } > > return 0; > @@ -244,12 +244,10 @@ static int bperf_cgrp__disable(struct evsel *evsel) > static int bperf_cgrp__read(struct evsel *evsel) > { > struct evlist *evlist = evsel->evlist; > - int i, cpu, nr_cpus = evlist->core.all_cpus->nr; > int total_cpus = cpu__max_cpu().cpu; > struct perf_counts_values *counts; > struct bpf_perf_event_value *values; > int reading_map_fd, err = 0; > - __u32 idx; > > if (evsel->core.idx) > return 0; > @@ -263,7 +261,10 @@ static int bperf_cgrp__read(struct evsel *evsel) > reading_map_fd = bpf_map__fd(skel->maps.cgrp_readings); > > evlist__for_each_entry(evlist, evsel) { > - idx = evsel->core.idx; > + __u32 idx = evsel->core.idx; > + int i; > + struct perf_cpu_map cpu; > + > err = bpf_map_lookup_elem(reading_map_fd, &idx, values); > if (err) { > pr_err("bpf map lookup failed: idx=%u, event=%s, cgrp=%s\n", > @@ -271,13 +272,11 @@ static int bperf_cgrp__read(struct evsel *evsel) > goto out; > } > > - for (i = 0; i < nr_cpus; i++) { > - cpu = evlist->core.all_cpus->map[i].cpu; > - > + perf_cpu_map__for_each_cpu(cpu, i, evlist->core.all_cpu) {
evlist->core.all_cpus ?
Thanks, Namhyung
> counts = perf_counts(evsel->counts, i, 0); > - counts->val = values[cpu].counter; > - counts->ena = values[cpu].enabled; > - counts->run = values[cpu].running; > + counts->val = values[cpu.cpu].counter; > + counts->ena = values[cpu.cpu].enabled; > + counts->run = values[cpu.cpu].running; > } > } > > -- > 2.36.0.464.gb9c8b46e94-goog >
| |