[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAEf4BzZv9kCAmX0Fo4kR8qh9mu5NB-wLDmNAK_R=VzcxL7VPpQ@mail.gmail.com>
Date: Fri, 9 Jan 2026 15:37:02 -0800
From: Andrii Nakryiko <andrii.nakryiko@...il.com>
To: Samuel Wu <wusamuel@...gle.com>
Cc: Alexei Starovoitov <ast@...nel.org>, Daniel Borkmann <daniel@...earbox.net>,
Andrii Nakryiko <andrii@...nel.org>, Martin KaFai Lau <martin.lau@...ux.dev>,
Eduard Zingerman <eddyz87@...il.com>, Song Liu <song@...nel.org>,
Yonghong Song <yonghong.song@...ux.dev>, John Fastabend <john.fastabend@...il.com>,
KP Singh <kpsingh@...nel.org>, Stanislav Fomichev <sdf@...ichev.me>, Hao Luo <haoluo@...gle.com>,
Jiri Olsa <jolsa@...nel.org>, Shuah Khan <shuah@...nel.org>, kernel-team@...roid.com,
linux-kernel@...r.kernel.org, bpf@...r.kernel.org,
linux-kselftest@...r.kernel.org
Subject: Re: [PATCH bpf-next v2 0/4] Add wakeup_source iterators
On Thu, Jan 8, 2026 at 2:56 PM Samuel Wu <wusamuel@...gle.com> wrote:
>
> This patch series introduces BPF iterators for wakeup_source, enabling
> BPF programs to efficiently traverse a device's wakeup sources.
>
> Currently, inspecting wakeup sources typically involves reading interfaces
> like /sys/class/wakeup/* or debugfs. The repeated syscalls to query the
> sysfs nodes is inefficient, as there can be hundreds of wakeup_sources, and
> each wakeup source have multiple stats, with one sysfs node per stat.
> debugfs is unstable and insecure.
>
> This series implements two types of iterators:
> 1. Standard BPF Iterator: Allows creating a BPF link to iterate over
> wakeup sources
> 2. Open-coded Iterator: Enables the use of wakeup_source iterators directly
> within BPF programs
>
> Both iterators utilize pre-existing APIs wakeup_sources_walk_* to traverse
> over the SRCU that backs the list of wakeup_sources.
One reason to add either open-coded iterator or iterator program is
when you need to work with some kernel object (i.e., if there is some
additional API that takes that object and somehow manipulates it) or
if traversal logic is involved in terms of synchronization primitives
necessary.
In your case neither concern seems to apply. Looking at
wakeup_sources_walk_* helpers, it's just a simple linked list
traversal and struct wakeup_source has plenty of plain data fields of
interest, if I understand correctly. You probably are not intending to
allow locking it or manipulate wakeirq, is that right?
So I'd say you should do this using bpf_for() generic loop and
bpf_core_cast() helper. The only problem is that wakeup_sources global
variable is static, so it's not that easy to get its memory address
(to start iteration). Maybe look into working around that first?
pw-bot: cr
>
> Changes in v2:
> - Guard BPF Makefile with CONFIG_PM_SLEEP to fix build errors
> - Update copyright from 2025 to 2026
> - v1 link: https://lore.kernel.org/all/20251204025003.3162056-1-wusamuel@google.com/
>
> Samuel Wu (4):
> bpf: Add wakeup_source iterator
> bpf: Open coded BPF for wakeup_sources
> selftests/bpf: Add tests for wakeup_sources
> selftests/bpf: Open coded BPF wakeup_sources test
>
> kernel/bpf/Makefile | 3 +
> kernel/bpf/helpers.c | 3 +
> kernel/bpf/wakeup_source_iter.c | 137 ++++++++
> .../testing/selftests/bpf/bpf_experimental.h | 5 +
> tools/testing/selftests/bpf/config | 1 +
> .../bpf/prog_tests/wakeup_source_iter.c | 323 ++++++++++++++++++
> .../selftests/bpf/progs/wakeup_source_iter.c | 117 +++++++
> 7 files changed, 589 insertions(+)
> create mode 100644 kernel/bpf/wakeup_source_iter.c
> create mode 100644 tools/testing/selftests/bpf/prog_tests/wakeup_source_iter.c
> create mode 100644 tools/testing/selftests/bpf/progs/wakeup_source_iter.c
>
> --
> 2.52.0.457.g6b5491de43-goog
>
Powered by blists - more mailing lists