From nobody Mon Oct 6 05:01:22 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 768FF2EA172; Fri, 25 Jul 2025 10:08:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753438122; cv=none; b=kdJpFcbd3+bKvhGaJLGXAyiEV/VwkUe1itxrmPKn4eDb4os40UaMmHlHYZ94oU1GEoPZnu5sZbo+6NBljc2DgwWJFoQOLfJAl1fgOlXnmnKIujSGh9aqKOjQLfHs3lB4AMd5JTG4cFrL/N1Cx1x0JrmPdy2DP6owL2m5l5RJK+A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753438122; c=relaxed/simple; bh=K4Y/xektt9LHbwI/1jiSOKd8+Loae6R9dN1QrrSROJw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J+zS3IqMx47j/9rr+togmoEH5HCK5ahsFv4wG+E3ToYgRpra2M4R/Rx7gQ4SQRhGVXCrpBRnSzgBIwy8u+GJrjtCZtCeTGBNS9FHTsq9PtYqsLh5sUudmJp6Efxf/Yp6nVrVjUlmkvzH5YXObTl/tloPvLXWRCB1Q60ViIQwcpY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 607CD176C; Fri, 25 Jul 2025 03:08:33 -0700 (PDT) Received: from e132581.arm.com (e132581.arm.com [10.1.196.87]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2A5A03F5A1; Fri, 25 Jul 2025 03:08:36 -0700 (PDT) From: Leo Yan Date: Fri, 25 Jul 2025 11:08:13 +0100 Subject: [PATCH RESEND v3 3/6] perf: auxtrace: Control AUX pause and resume with BPF Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250725-perf_aux_pause_resume_bpf_rebase-v3-3-ae21deb49d1a@arm.com> References: <20250725-perf_aux_pause_resume_bpf_rebase-v3-0-ae21deb49d1a@arm.com> In-Reply-To: <20250725-perf_aux_pause_resume_bpf_rebase-v3-0-ae21deb49d1a@arm.com> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Jiri Olsa , Ian Rogers , Adrian Hunter , KP Singh , Matt Bobrowski , Song Liu , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Yonghong Song , John Fastabend , Stanislav Fomichev , Hao Luo , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , James Clark , Suzuki K Poulose , Mike Leach Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Leo Yan X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1753438103; l=4551; i=leo.yan@arm.com; s=20250604; h=from:subject:message-id; bh=K4Y/xektt9LHbwI/1jiSOKd8+Loae6R9dN1QrrSROJw=; b=aYdcRV9DBtw+pg2xDzg4xKfXyk8aJt2UVq4VzEQC3YCBH6X5hLf+gBQoZFbcx0GYqM2OjJFJG 2zZc54ScmNbBuNUkIgySohx4AfViGRUcw9uuK9OIItefdaUH+qe9BuH X-Developer-Key: i=leo.yan@arm.com; a=ed25519; pk=k4BaDbvkCXzBFA7Nw184KHGP5thju8lKqJYIrOWxDhI= Introduce a BPF program to trigger AUX pause and resume. Once a attached tracepoint is hit, the BPF program calls the bpf_perf_event_aux_pause() kfunc for controlling AUX trace. Signed-off-by: Leo Yan --- tools/perf/Makefile.perf | 1 + tools/perf/util/bpf_skel/auxtrace_pause.bpf.c | 156 ++++++++++++++++++++++= ++++ 2 files changed, 157 insertions(+) diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index d4c7031b01a77f4a42326e4c9a88d8a352143178..8fdd24ba4c25ff4a69925a8e0c8= 5bc78dd4fda47 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -1179,6 +1179,7 @@ SKELETONS +=3D $(SKEL_OUT)/kwork_trace.skel.h $(SKEL_= OUT)/sample_filter.skel.h SKELETONS +=3D $(SKEL_OUT)/kwork_top.skel.h $(SKEL_OUT)/syscall_summary.sk= el.h SKELETONS +=3D $(SKEL_OUT)/bench_uprobe.skel.h SKELETONS +=3D $(SKEL_OUT)/augmented_raw_syscalls.skel.h +SKELETONS +=3D $(SKEL_OUT)/auxtrace_pause.skel.h =20 $(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBS= UBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT): $(Q)$(MKDIR) -p $@ diff --git a/tools/perf/util/bpf_skel/auxtrace_pause.bpf.c b/tools/perf/uti= l/bpf_skel/auxtrace_pause.bpf.c new file mode 100644 index 0000000000000000000000000000000000000000..37f8e1d096a3098415f64690146= 52dea948044d2 --- /dev/null +++ b/tools/perf/util/bpf_skel/auxtrace_pause.bpf.c @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +// Copyright 2025 Arm Limited +#include "vmlinux.h" +#include +#include + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(key_size, sizeof(__u32)); + __uint(value_size, sizeof(__u8)); + __uint(max_entries, 1); +} cpu_filter SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(key_size, sizeof(__u32)); + __uint(value_size, sizeof(__u8)); + __uint(max_entries, 1); +} task_filter SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(key_size, sizeof(__u32)); + __uint(value_size, sizeof(int)); + __uint(max_entries, 1); +} events SEC(".maps"); + +int enabled =3D 0; + +const volatile int has_cpu =3D 0; +const volatile int has_task =3D 0; +const volatile int per_thread =3D 0; + +int bpf_perf_event_aux_pause(void *map, u64 flags, bool pause) __ksym; + +static int event_aux_pause(void) +{ + __u64 flag; + __u32 cpu =3D bpf_get_smp_processor_id(); + + if (!enabled) + return 0; + + if (has_cpu) { + __u8 *ok; + + ok =3D bpf_map_lookup_elem(&cpu_filter, &cpu); + if (!ok) + return 0; + } + + if (has_task) { + __u32 pid =3D bpf_get_current_pid_tgid() & 0xffffffff; + __u8 *ok; + + ok =3D bpf_map_lookup_elem(&task_filter, &pid); + if (!ok) + return 0; + } + + flag =3D per_thread ? 0 : BPF_F_CURRENT_CPU; + bpf_perf_event_aux_pause(&events, flag, true); + return 0; +} + +static int event_aux_resume(void) +{ + __u64 flag; + __u32 cpu =3D bpf_get_smp_processor_id(); + + if (!enabled) + return 0; + + if (has_cpu) { + __u8 *ok; + + ok =3D bpf_map_lookup_elem(&cpu_filter, &cpu); + if (!ok) + return 0; + } + + if (has_task) { + __u32 pid =3D bpf_get_current_pid_tgid() & 0xffffffff; + __u8 *ok; + + ok =3D bpf_map_lookup_elem(&task_filter, &pid); + if (!ok) + return 0; + } + + flag =3D per_thread ? 0 : BPF_F_CURRENT_CPU; + bpf_perf_event_aux_pause(&events, flag, false); + return 0; +} + +SEC("kprobe/func_pause") +int BPF_PROG(kprobe_event_pause) +{ + return event_aux_pause(); +} + +SEC("kprobe/func_resume") +int BPF_PROG(kprobe_event_resume) +{ + return event_aux_resume(); +} + +SEC("kretprobe/func_pause") +int BPF_PROG(kretprobe_event_pause) +{ + return event_aux_pause(); +} + +SEC("kretprobe/func_resume") +int BPF_PROG(kretprobe_event_resume) +{ + return event_aux_resume(); +} + +SEC("uprobe/func_pause") +int BPF_PROG(uprobe_event_pause) +{ + return event_aux_pause(); +} + +SEC("uprobe/func_resume") +int BPF_PROG(uprobe_event_resume) +{ + return event_aux_resume(); +} + +SEC("uretprobe/func_pause") +int BPF_PROG(uretprobe_event_pause) +{ + return event_aux_pause(); +} + +SEC("uretprobe/func_resume") +int BPF_PROG(uretprobe_event_resume) +{ + return event_aux_resume(); +} + +SEC("tp/func_pause") +int BPF_PROG(tp_event_pause) +{ + return event_aux_pause(); +} + +SEC("tp/func_resume") +int BPF_PROG(tp_event_resume) +{ + return event_aux_resume(); +} + +char LICENSE[] SEC("license") =3D "Dual BSD/GPL"; --=20 2.34.1