Commit 7e3d1784 authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo

libperf: Switch cpu to more accurate cpu_map_idx

Modify variable names and adopt perf_cpu_map__for_each_cpu() in
perf_evsel__open().

Renaming is done by looking for consistency in API usage.
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: John Garry <john.garry@huawei.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Clarke <pc@us.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Riccardo Mancini <rickyman7@gmail.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: Vineet Singh <vineet.singh@intel.com>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: zhengjun.xing@intel.com
Link: https://lore.kernel.org/r/20220105061351.120843-28-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 2ca0a371
...@@ -43,18 +43,22 @@ void perf_evsel__delete(struct perf_evsel *evsel) ...@@ -43,18 +43,22 @@ void perf_evsel__delete(struct perf_evsel *evsel)
free(evsel); free(evsel);
} }
#define FD(e, x, y) ((int *) xyarray__entry(e->fd, x, y)) #define FD(_evsel, _cpu_map_idx, _thread) \
#define MMAP(e, x, y) (e->mmap ? ((struct perf_mmap *) xyarray__entry(e->mmap, x, y)) : NULL) ((int *)xyarray__entry(_evsel->fd, _cpu_map_idx, _thread))
#define MMAP(_evsel, _cpu_map_idx, _thread) \
(_evsel->mmap ? ((struct perf_mmap *) xyarray__entry(_evsel->mmap, _cpu_map_idx, _thread)) \
: NULL)
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)
{ {
evsel->fd = xyarray__new(ncpus, nthreads, sizeof(int)); evsel->fd = xyarray__new(ncpus, nthreads, sizeof(int));
if (evsel->fd) { if (evsel->fd) {
int cpu, thread; int idx, thread;
for (cpu = 0; cpu < ncpus; cpu++) {
for (idx = 0; idx < ncpus; idx++) {
for (thread = 0; thread < nthreads; thread++) { for (thread = 0; thread < nthreads; thread++) {
int *fd = FD(evsel, cpu, thread); int *fd = FD(evsel, idx, thread);
if (fd) if (fd)
*fd = -1; *fd = -1;
...@@ -80,7 +84,7 @@ sys_perf_event_open(struct perf_event_attr *attr, ...@@ -80,7 +84,7 @@ sys_perf_event_open(struct perf_event_attr *attr,
return syscall(__NR_perf_event_open, attr, pid, cpu, group_fd, flags); return syscall(__NR_perf_event_open, attr, pid, cpu, group_fd, flags);
} }
static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread, int *group_fd) static int get_group_fd(struct perf_evsel *evsel, int cpu_map_idx, int thread, int *group_fd)
{ {
struct perf_evsel *leader = evsel->leader; struct perf_evsel *leader = evsel->leader;
int *fd; int *fd;
...@@ -97,7 +101,7 @@ static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread, int *grou ...@@ -97,7 +101,7 @@ static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread, int *grou
if (!leader->fd) if (!leader->fd)
return -ENOTCONN; return -ENOTCONN;
fd = FD(leader, cpu, thread); fd = FD(leader, cpu_map_idx, thread);
if (fd == NULL || *fd == -1) if (fd == NULL || *fd == -1)
return -EBADF; return -EBADF;
...@@ -109,7 +113,7 @@ static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread, int *grou ...@@ -109,7 +113,7 @@ static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread, int *grou
int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus, int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus,
struct perf_thread_map *threads) struct perf_thread_map *threads)
{ {
int cpu, thread, err = 0; int cpu, idx, thread, err = 0;
if (cpus == NULL) { if (cpus == NULL) {
static struct perf_cpu_map *empty_cpu_map; static struct perf_cpu_map *empty_cpu_map;
...@@ -139,21 +143,21 @@ int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus, ...@@ -139,21 +143,21 @@ int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus,
perf_evsel__alloc_fd(evsel, cpus->nr, threads->nr) < 0) perf_evsel__alloc_fd(evsel, cpus->nr, threads->nr) < 0)
return -ENOMEM; return -ENOMEM;
for (cpu = 0; cpu < cpus->nr; cpu++) { perf_cpu_map__for_each_cpu(cpu, idx, cpus) {
for (thread = 0; thread < threads->nr; thread++) { for (thread = 0; thread < threads->nr; thread++) {
int fd, group_fd, *evsel_fd; int fd, group_fd, *evsel_fd;
evsel_fd = FD(evsel, cpu, thread); evsel_fd = FD(evsel, idx, thread);
if (evsel_fd == NULL) if (evsel_fd == NULL)
return -EINVAL; return -EINVAL;
err = get_group_fd(evsel, cpu, thread, &group_fd); err = get_group_fd(evsel, idx, thread, &group_fd);
if (err < 0) if (err < 0)
return err; return err;
fd = sys_perf_event_open(&evsel->attr, fd = sys_perf_event_open(&evsel->attr,
threads->map[thread].pid, threads->map[thread].pid,
cpus->map[cpu], group_fd, 0); cpu, group_fd, 0);
if (fd < 0) if (fd < 0)
return -errno; return -errno;
...@@ -165,12 +169,12 @@ int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus, ...@@ -165,12 +169,12 @@ int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus,
return err; return err;
} }
static void perf_evsel__close_fd_cpu(struct perf_evsel *evsel, int cpu) static void perf_evsel__close_fd_cpu(struct perf_evsel *evsel, int cpu_map_idx)
{ {
int thread; int thread;
for (thread = 0; thread < xyarray__max_y(evsel->fd); ++thread) { for (thread = 0; thread < xyarray__max_y(evsel->fd); ++thread) {
int *fd = FD(evsel, cpu, thread); int *fd = FD(evsel, cpu_map_idx, thread);
if (fd && *fd >= 0) { if (fd && *fd >= 0) {
close(*fd); close(*fd);
...@@ -181,10 +185,8 @@ static void perf_evsel__close_fd_cpu(struct perf_evsel *evsel, int cpu) ...@@ -181,10 +185,8 @@ static void perf_evsel__close_fd_cpu(struct perf_evsel *evsel, int cpu)
void perf_evsel__close_fd(struct perf_evsel *evsel) void perf_evsel__close_fd(struct perf_evsel *evsel)
{ {
int cpu; for (int idx = 0; idx < xyarray__max_x(evsel->fd); idx++)
perf_evsel__close_fd_cpu(evsel, idx);
for (cpu = 0; cpu < xyarray__max_x(evsel->fd); cpu++)
perf_evsel__close_fd_cpu(evsel, cpu);
} }
void perf_evsel__free_fd(struct perf_evsel *evsel) void perf_evsel__free_fd(struct perf_evsel *evsel)
...@@ -202,29 +204,29 @@ void perf_evsel__close(struct perf_evsel *evsel) ...@@ -202,29 +204,29 @@ void perf_evsel__close(struct perf_evsel *evsel)
perf_evsel__free_fd(evsel); perf_evsel__free_fd(evsel);
} }
void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu) void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu_map_idx)
{ {
if (evsel->fd == NULL) if (evsel->fd == NULL)
return; return;
perf_evsel__close_fd_cpu(evsel, cpu); perf_evsel__close_fd_cpu(evsel, cpu_map_idx);
} }
void perf_evsel__munmap(struct perf_evsel *evsel) void perf_evsel__munmap(struct perf_evsel *evsel)
{ {
int cpu, thread; int idx, thread;
if (evsel->fd == NULL || evsel->mmap == NULL) if (evsel->fd == NULL || evsel->mmap == NULL)
return; return;
for (cpu = 0; cpu < xyarray__max_x(evsel->fd); cpu++) { for (idx = 0; idx < xyarray__max_x(evsel->fd); idx++) {
for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) { for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) {
int *fd = FD(evsel, cpu, thread); int *fd = FD(evsel, idx, thread);
if (fd == NULL || *fd < 0) if (fd == NULL || *fd < 0)
continue; continue;
perf_mmap__munmap(MMAP(evsel, cpu, thread)); perf_mmap__munmap(MMAP(evsel, idx, thread));
} }
} }
...@@ -234,7 +236,7 @@ void perf_evsel__munmap(struct perf_evsel *evsel) ...@@ -234,7 +236,7 @@ void perf_evsel__munmap(struct perf_evsel *evsel)
int perf_evsel__mmap(struct perf_evsel *evsel, int pages) int perf_evsel__mmap(struct perf_evsel *evsel, int pages)
{ {
int ret, cpu, thread; int ret, idx, thread;
struct perf_mmap_param mp = { struct perf_mmap_param mp = {
.prot = PROT_READ | PROT_WRITE, .prot = PROT_READ | PROT_WRITE,
.mask = (pages * page_size) - 1, .mask = (pages * page_size) - 1,
...@@ -246,18 +248,18 @@ int perf_evsel__mmap(struct perf_evsel *evsel, int pages) ...@@ -246,18 +248,18 @@ int perf_evsel__mmap(struct perf_evsel *evsel, int pages)
if (perf_evsel__alloc_mmap(evsel, xyarray__max_x(evsel->fd), xyarray__max_y(evsel->fd)) < 0) if (perf_evsel__alloc_mmap(evsel, xyarray__max_x(evsel->fd), xyarray__max_y(evsel->fd)) < 0)
return -ENOMEM; return -ENOMEM;
for (cpu = 0; cpu < xyarray__max_x(evsel->fd); cpu++) { for (idx = 0; idx < xyarray__max_x(evsel->fd); idx++) {
for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) { for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) {
int *fd = FD(evsel, cpu, thread); int *fd = FD(evsel, idx, thread);
struct perf_mmap *map; struct perf_mmap *map;
if (fd == NULL || *fd < 0) if (fd == NULL || *fd < 0)
continue; continue;
map = MMAP(evsel, cpu, thread); map = MMAP(evsel, idx, thread);
perf_mmap__init(map, NULL, false, NULL); perf_mmap__init(map, NULL, false, NULL);
ret = perf_mmap__mmap(map, &mp, *fd, cpu); ret = perf_mmap__mmap(map, &mp, *fd, idx);
if (ret) { if (ret) {
perf_evsel__munmap(evsel); perf_evsel__munmap(evsel);
return ret; return ret;
...@@ -268,14 +270,14 @@ int perf_evsel__mmap(struct perf_evsel *evsel, int pages) ...@@ -268,14 +270,14 @@ int perf_evsel__mmap(struct perf_evsel *evsel, int pages)
return 0; return 0;
} }
void *perf_evsel__mmap_base(struct perf_evsel *evsel, int cpu, int thread) void *perf_evsel__mmap_base(struct perf_evsel *evsel, int cpu_map_idx, int thread)
{ {
int *fd = FD(evsel, cpu, thread); int *fd = FD(evsel, cpu_map_idx, thread);
if (fd == NULL || *fd < 0 || MMAP(evsel, cpu, thread) == NULL) if (fd == NULL || *fd < 0 || MMAP(evsel, cpu_map_idx, thread) == NULL)
return NULL; return NULL;
return MMAP(evsel, cpu, thread)->base; return MMAP(evsel, cpu_map_idx, thread)->base;
} }
int perf_evsel__read_size(struct perf_evsel *evsel) int perf_evsel__read_size(struct perf_evsel *evsel)
...@@ -303,19 +305,19 @@ int perf_evsel__read_size(struct perf_evsel *evsel) ...@@ -303,19 +305,19 @@ int perf_evsel__read_size(struct perf_evsel *evsel)
return size; return size;
} }
int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread, int perf_evsel__read(struct perf_evsel *evsel, int cpu_map_idx, int thread,
struct perf_counts_values *count) struct perf_counts_values *count)
{ {
size_t size = perf_evsel__read_size(evsel); size_t size = perf_evsel__read_size(evsel);
int *fd = FD(evsel, cpu, thread); int *fd = FD(evsel, cpu_map_idx, thread);
memset(count, 0, sizeof(*count)); memset(count, 0, sizeof(*count));
if (fd == NULL || *fd < 0) if (fd == NULL || *fd < 0)
return -EINVAL; return -EINVAL;
if (MMAP(evsel, cpu, thread) && if (MMAP(evsel, cpu_map_idx, thread) &&
!perf_mmap__read_self(MMAP(evsel, cpu, thread), count)) !perf_mmap__read_self(MMAP(evsel, cpu_map_idx, thread), count))
return 0; return 0;
if (readn(*fd, count->values, size) <= 0) if (readn(*fd, count->values, size) <= 0)
...@@ -326,13 +328,13 @@ int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread, ...@@ -326,13 +328,13 @@ int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread,
static int perf_evsel__run_ioctl(struct perf_evsel *evsel, static int perf_evsel__run_ioctl(struct perf_evsel *evsel,
int ioc, void *arg, int ioc, void *arg,
int cpu) int cpu_map_idx)
{ {
int thread; int thread;
for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) { for (thread = 0; thread < xyarray__max_y(evsel->fd); thread++) {
int err; int err;
int *fd = FD(evsel, cpu, thread); int *fd = FD(evsel, cpu_map_idx, thread);
if (fd == NULL || *fd < 0) if (fd == NULL || *fd < 0)
return -1; return -1;
...@@ -346,9 +348,9 @@ static int perf_evsel__run_ioctl(struct perf_evsel *evsel, ...@@ -346,9 +348,9 @@ static int perf_evsel__run_ioctl(struct perf_evsel *evsel,
return 0; return 0;
} }
int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu) int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu_map_idx)
{ {
return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, cpu); return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, cpu_map_idx);
} }
int perf_evsel__enable(struct perf_evsel *evsel) int perf_evsel__enable(struct perf_evsel *evsel)
...@@ -361,9 +363,9 @@ int perf_evsel__enable(struct perf_evsel *evsel) ...@@ -361,9 +363,9 @@ int perf_evsel__enable(struct perf_evsel *evsel)
return err; return err;
} }
int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu) int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu_map_idx)
{ {
return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, NULL, cpu); return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, NULL, cpu_map_idx);
} }
int perf_evsel__disable(struct perf_evsel *evsel) int perf_evsel__disable(struct perf_evsel *evsel)
......
...@@ -28,16 +28,16 @@ LIBPERF_API void perf_evsel__delete(struct perf_evsel *evsel); ...@@ -28,16 +28,16 @@ LIBPERF_API void perf_evsel__delete(struct perf_evsel *evsel);
LIBPERF_API int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus, LIBPERF_API int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus,
struct perf_thread_map *threads); struct perf_thread_map *threads);
LIBPERF_API void perf_evsel__close(struct perf_evsel *evsel); LIBPERF_API void perf_evsel__close(struct perf_evsel *evsel);
LIBPERF_API void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu); LIBPERF_API void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu_map_idx);
LIBPERF_API int perf_evsel__mmap(struct perf_evsel *evsel, int pages); LIBPERF_API int perf_evsel__mmap(struct perf_evsel *evsel, int pages);
LIBPERF_API void perf_evsel__munmap(struct perf_evsel *evsel); LIBPERF_API void perf_evsel__munmap(struct perf_evsel *evsel);
LIBPERF_API void *perf_evsel__mmap_base(struct perf_evsel *evsel, int cpu, int thread); LIBPERF_API void *perf_evsel__mmap_base(struct perf_evsel *evsel, int cpu_map_idx, int thread);
LIBPERF_API int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread, LIBPERF_API int perf_evsel__read(struct perf_evsel *evsel, int cpu_map_idx, int thread,
struct perf_counts_values *count); struct perf_counts_values *count);
LIBPERF_API int perf_evsel__enable(struct perf_evsel *evsel); LIBPERF_API int perf_evsel__enable(struct perf_evsel *evsel);
LIBPERF_API int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu); LIBPERF_API int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu_map_idx);
LIBPERF_API int perf_evsel__disable(struct perf_evsel *evsel); LIBPERF_API int perf_evsel__disable(struct perf_evsel *evsel);
LIBPERF_API int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu); LIBPERF_API int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu_map_idx);
LIBPERF_API struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel); LIBPERF_API struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel);
LIBPERF_API struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel); LIBPERF_API struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel);
LIBPERF_API struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel); LIBPERF_API struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment