From: Mykyta Yatsenko <mykyta.yatsenko5@gmail.com>
To: bpf@vger.kernel.org, ast@kernel.org, andrii@kernel.org,
daniel@iogearbox.net, kernel-team@meta.com, eddyz87@gmail.com,
memxor@gmail.com, qmo@kernel.org,
linux-perf-users@vger.kernel.org, acme@kernel.org,
namhyung@kernel.org
Cc: Mykyta Yatsenko <yatsenko@meta.com>
Subject: [PATCH bpf-next v3 2/3] perf bpf_counter: Track valid BPF counter snapshots
Date: Tue, 08 Sep 2026 07:27:11 -0700 [thread overview]
Message-ID: <20260908-bpftool_cyles_per_run-v3-2-60e86f325c35@meta.com> (raw)
In-Reply-To: <20260908-bpftool_cyles_per_run-v3-0-60e86f325c35@meta.com>
From: Mykyta Yatsenko <yatsenko@meta.com>
The perf profiler uses a zero counter value to reject an invalid entry
snapshot. However, zero is valid when the PMU has not scheduled the event.
To reproduce the issue, fill the PMU with other events and profile a
long-running BPF program for iTLB misses. In this test, the entry read
returned 0.
Use an armed flag to track successful entry reads. Reset the flag before
each new read. The fexit path clears the flag when it consumes the
snapshot.
Fixes: fa853c4b839e ("perf stat: Enable counting events for BPF programs")
Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
---
tools/perf/util/bpf_skel/bpf_prog_profiler.bpf.c | 26 ++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/tools/perf/util/bpf_skel/bpf_prog_profiler.bpf.c b/tools/perf/util/bpf_skel/bpf_prog_profiler.bpf.c
index 97037d3b3d9f..7bc0db26e005 100644
--- a/tools/perf/util/bpf_skel/bpf_prog_profiler.bpf.c
+++ b/tools/perf/util/bpf_skel/bpf_prog_profiler.bpf.c
@@ -4,6 +4,11 @@
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
+struct profile_reading {
+ struct bpf_perf_event_value value;
+ bool armed;
+};
+
/* map of perf event fds, num_cpu * num_metric entries */
struct {
__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
@@ -15,7 +20,7 @@ struct {
struct {
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
__uint(key_size, sizeof(__u32));
- __uint(value_size, sizeof(struct bpf_perf_event_value));
+ __uint(value_size, sizeof(struct profile_reading));
__uint(max_entries, 1);
} fentry_readings SEC(".maps");
@@ -33,7 +38,7 @@ SEC("fentry/XXX")
int BPF_PROG(fentry_XXX)
{
__u32 key = bpf_get_smp_processor_id();
- struct bpf_perf_event_value *ptr;
+ struct profile_reading *ptr;
__u32 zero = 0;
long err;
@@ -42,9 +47,12 @@ int BPF_PROG(fentry_XXX)
if (!ptr)
return 0;
- err = bpf_perf_event_read_value(&events, key, ptr, sizeof(*ptr));
+ ptr->armed = false;
+ err = bpf_perf_event_read_value(&events, key, &ptr->value,
+ sizeof(ptr->value));
if (err)
return 0;
+ ptr->armed = true;
return 0;
}
@@ -52,17 +60,19 @@ int BPF_PROG(fentry_XXX)
static inline void
fexit_update_maps(struct bpf_perf_event_value *after)
{
- struct bpf_perf_event_value *before, diff;
+ struct profile_reading *before;
+ struct bpf_perf_event_value diff;
__u32 zero = 0;
before = bpf_map_lookup_elem(&fentry_readings, &zero);
/* only account samples with a valid fentry_reading */
- if (before && before->counter) {
+ if (before && before->armed) {
struct bpf_perf_event_value *accum;
- diff.counter = after->counter - before->counter;
- diff.enabled = after->enabled - before->enabled;
- diff.running = after->running - before->running;
+ before->armed = false;
+ diff.counter = after->counter - before->value.counter;
+ diff.enabled = after->enabled - before->value.enabled;
+ diff.running = after->running - before->value.running;
accum = bpf_map_lookup_elem(&accum_readings, &zero);
if (accum) {
--
2.53.0-Meta
next prev parent reply other threads:[~2026-09-08 14:27 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-08 14:27 [PATCH bpf-next v3 0/3] bpftool: Improve perf counter reporting Mykyta Yatsenko
2026-09-08 14:27 ` [PATCH bpf-next v3 1/3] bpftool: Track perf counter snapshot state Mykyta Yatsenko
2026-09-08 14:35 ` sashiko-bot
2026-09-08 22:08 ` Quentin Monnet
2026-09-08 23:56 ` Andrii Nakryiko
2026-09-09 9:19 ` Mykyta Yatsenko
2026-09-11 23:57 ` Andrii Nakryiko
2026-09-08 14:27 ` Mykyta Yatsenko [this message]
2026-09-08 14:39 ` [PATCH bpf-next v3 2/3] perf bpf_counter: Track valid BPF counter snapshots sashiko-bot
2026-09-08 14:27 ` [PATCH bpf-next v3 3/3] bpftool: Scale counters and report cycles per run Mykyta Yatsenko
2026-09-08 14:42 ` sashiko-bot
2026-09-08 16:21 ` bot+bpf-ci
2026-09-08 17:37 ` Mykyta Yatsenko
2026-09-08 22:08 ` Quentin Monnet
2026-09-09 0:02 ` Andrii Nakryiko
2026-09-09 9:49 ` Mykyta Yatsenko
2026-09-12 0:01 ` Andrii Nakryiko
2026-09-08 18:01 ` [PATCH bpf-next v3 0/3] bpftool: Improve perf counter reporting Ihor Solodrai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260908-bpftool_cyles_per_run-v3-2-60e86f325c35@meta.com \
--to=mykyta.yatsenko5@gmail.com \
--cc=acme@kernel.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=kernel-team@meta.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=memxor@gmail.com \
--cc=namhyung@kernel.org \
--cc=qmo@kernel.org \
--cc=yatsenko@meta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox