* [bpf-next v3] bpftool: profile online CPUs instead of possible
@ 2023-02-02 13:17 tong
2023-02-03 1:46 ` John Fastabend
2023-02-03 7:10 ` patchwork-bot+netdevbpf
0 siblings, 2 replies; 3+ messages in thread
From: tong @ 2023-02-02 13:17 UTC (permalink / raw)
To: bpf, quentin, daniel
Cc: Tonghao Zhang, Alexei Starovoitov, Andrii Nakryiko,
Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa
From: Tonghao Zhang <tong@infragraf.org>
The number of online cpu may be not equal to possible cpu.
"bpftool prog profile" can not create pmu event on possible
but on online cpu.
$ dmidecode -s system-product-name
PowerEdge R620
$ cat /sys/devices/system/cpu/possible
0-47
$ cat /sys/devices/system/cpu/online
0-31
Disable cpu dynamically:
$ echo 0 > /sys/devices/system/cpu/cpuX/online
If one cpu is offline, perf_event_open will return ENODEV.
To fix this issue:
* check value returned and skip offline cpu.
* close pmu_fd immediately on error path, avoid fd leaking.
Fixes: 47c09d6a9f67 ("bpftool: Introduce "prog profile" command")
Signed-off-by: Tonghao Zhang <tong@infragraf.org>
Cc: Quentin Monnet <quentin@isovalent.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Martin KaFai Lau <martin.lau@linux.dev>
Cc: Song Liu <song@kernel.org>
Cc: Yonghong Song <yhs@fb.com>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: KP Singh <kpsingh@kernel.org>
Cc: Stanislav Fomichev <sdf@google.com>
Cc: Hao Luo <haoluo@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
---
v1:
https://patchwork.kernel.org/project/netdevbpf/patch/20230117044902.98938-1-tong@infragraf.org/
https://patchwork.kernel.org/project/netdevbpf/patch/20230117044902.98938-2-tong@infragraf.org/
v2:
fix pmu_fd leaking
add fix tag
---
tools/bpf/bpftool/prog.c | 38 ++++++++++++++++++++++++++++++--------
1 file changed, 30 insertions(+), 8 deletions(-)
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index cfc9fdc1e863..e87738dbffc1 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -2233,10 +2233,38 @@ static void profile_close_perf_events(struct profiler_bpf *obj)
profile_perf_event_cnt = 0;
}
+static int profile_open_perf_event(int mid, int cpu, int map_fd)
+{
+ int pmu_fd;
+
+ pmu_fd = syscall(__NR_perf_event_open, &metrics[mid].attr,
+ -1 /*pid*/, cpu, -1 /*group_fd*/, 0);
+ if (pmu_fd < 0) {
+ if (errno == ENODEV) {
+ p_info("cpu %d may be offline, skip %s profiling.",
+ cpu, metrics[mid].name);
+ profile_perf_event_cnt++;
+ return 0;
+ }
+ return -1;
+ }
+
+ if (bpf_map_update_elem(map_fd,
+ &profile_perf_event_cnt,
+ &pmu_fd, BPF_ANY) ||
+ ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0)) {
+ close(pmu_fd);
+ return -1;
+ }
+
+ profile_perf_events[profile_perf_event_cnt++] = pmu_fd;
+ return 0;
+}
+
static int profile_open_perf_events(struct profiler_bpf *obj)
{
unsigned int cpu, m;
- int map_fd, pmu_fd;
+ int map_fd;
profile_perf_events = calloc(
sizeof(int), obj->rodata->num_cpu * obj->rodata->num_metric);
@@ -2255,17 +2283,11 @@ static int profile_open_perf_events(struct profiler_bpf *obj)
if (!metrics[m].selected)
continue;
for (cpu = 0; cpu < obj->rodata->num_cpu; cpu++) {
- pmu_fd = syscall(__NR_perf_event_open, &metrics[m].attr,
- -1/*pid*/, cpu, -1/*group_fd*/, 0);
- if (pmu_fd < 0 ||
- bpf_map_update_elem(map_fd, &profile_perf_event_cnt,
- &pmu_fd, BPF_ANY) ||
- ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0)) {
+ if (profile_open_perf_event(m, cpu, map_fd)) {
p_err("failed to create event %s on cpu %d",
metrics[m].name, cpu);
return -1;
}
- profile_perf_events[profile_perf_event_cnt++] = pmu_fd;
}
}
return 0;
--
2.27.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* RE: [bpf-next v3] bpftool: profile online CPUs instead of possible
2023-02-02 13:17 [bpf-next v3] bpftool: profile online CPUs instead of possible tong
@ 2023-02-03 1:46 ` John Fastabend
2023-02-03 7:10 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: John Fastabend @ 2023-02-03 1:46 UTC (permalink / raw)
To: tong, bpf, quentin, daniel
Cc: Tonghao Zhang, Alexei Starovoitov, Andrii Nakryiko,
Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa
tong@ wrote:
> From: Tonghao Zhang <tong@infragraf.org>
>
> The number of online cpu may be not equal to possible cpu.
> "bpftool prog profile" can not create pmu event on possible
> but on online cpu.
>
> $ dmidecode -s system-product-name
> PowerEdge R620
> $ cat /sys/devices/system/cpu/possible
> 0-47
> $ cat /sys/devices/system/cpu/online
> 0-31
>
> Disable cpu dynamically:
> $ echo 0 > /sys/devices/system/cpu/cpuX/online
>
> If one cpu is offline, perf_event_open will return ENODEV.
> To fix this issue:
> * check value returned and skip offline cpu.
> * close pmu_fd immediately on error path, avoid fd leaking.
>
> Fixes: 47c09d6a9f67 ("bpftool: Introduce "prog profile" command")
> Signed-off-by: Tonghao Zhang <tong@infragraf.org>
Acked-by: John Fastabend <john.fastabend@gmail.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [bpf-next v3] bpftool: profile online CPUs instead of possible
2023-02-02 13:17 [bpf-next v3] bpftool: profile online CPUs instead of possible tong
2023-02-03 1:46 ` John Fastabend
@ 2023-02-03 7:10 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-02-03 7:10 UTC (permalink / raw)
To: Tonghao Zhang
Cc: bpf, quentin, daniel, ast, andrii, martin.lau, song, yhs,
john.fastabend, kpsingh, sdf, haoluo, jolsa
Hello:
This patch was applied to bpf/bpf-next.git (master)
by Martin KaFai Lau <martin.lau@kernel.org>:
On Thu, 2 Feb 2023 21:17:01 +0800 you wrote:
> From: Tonghao Zhang <tong@infragraf.org>
>
> The number of online cpu may be not equal to possible cpu.
> "bpftool prog profile" can not create pmu event on possible
> but on online cpu.
>
> $ dmidecode -s system-product-name
> PowerEdge R620
> $ cat /sys/devices/system/cpu/possible
> 0-47
> $ cat /sys/devices/system/cpu/online
> 0-31
>
> [...]
Here is the summary with links:
- [bpf-next,v3] bpftool: profile online CPUs instead of possible
https://git.kernel.org/bpf/bpf-next/c/377c16fa3f3c
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-02-03 7:10 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-02 13:17 [bpf-next v3] bpftool: profile online CPUs instead of possible tong
2023-02-03 1:46 ` John Fastabend
2023-02-03 7:10 ` patchwork-bot+netdevbpf
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.