drivers/base/power/power.h | 7 ++ drivers/base/power/wakeup.c | 71 ++++++++++- tools/testing/selftests/bpf/config | 3 +- .../selftests/bpf/prog_tests/wakeup_source.c | 118 ++++++++++++++++++ .../selftests/bpf/progs/test_wakeup_source.c | 92 ++++++++++++++ .../selftests/bpf/progs/wakeup_source.h | 22 ++++ .../selftests/bpf/progs/wakeup_source_fail.c | 76 +++++++++++ 7 files changed, 386 insertions(+), 3 deletions(-) create mode 100644 tools/testing/selftests/bpf/prog_tests/wakeup_source.c create mode 100644 tools/testing/selftests/bpf/progs/test_wakeup_source.c create mode 100644 tools/testing/selftests/bpf/progs/wakeup_source.h create mode 100644 tools/testing/selftests/bpf/progs/wakeup_source_fail.c
This patchset adds requisite kfuncs for BPF programs to safely traverse wakeup_sources, and puts a config flag around the sysfs interface. Currently, a traversal of wakeup sources require going through /sys/class/wakeup/* or /d/wakeup_sources/*. The repeated syscalls to query sysfs is inefficient, as there can be hundreds of wakeup_sources, with each wakeup source also having multiple attributes. debugfs is unstable and insecure. Adding kfuncs to lock/unlock wakeup sources allows BPF program to safely traverse the wakeup sources list, and a kfunc to get head of wakeup sources list is needed to start traversing the list. On a quiescent Pixel 6 traversing 150 wakeup_sources, I am seeing ~34x speedup (sampled 75 times in table below). For a device under load, the speedup is greater. +-------+----+----------+----------+ | | n | AVG (ms) | STD (ms) | +-------+----+----------+----------+ | sysfs | 75 | 44.9 | 12.6 | +-------+----+----------+----------+ | BPF | 75 | 1.3 | 0.7 | +-------+----+----------+----------+ The initial attempts for BPF traversal of wakeup_sources was with BPF iterators [1]. However, BPF already allows for traversing of a simple list with bpf_for(), and this current patchset has the added benefit of being ~2-3x more performant than BPF iterators. [1]: https://lore.kernel.org/all/20260225210820.177674-1-wusamuel@google.com/ Changes in v4: - Removed `.owner = THIS_MODULE` for btf_kfunc_id_set per Greg - Add a graceful exit in selftest if bpf_wakeup_sources_get_head() is not present due to kernel configs without CONFIG_PM_SLEEP (e.g. s390) - Relaxed substr match in wakeup_source_unlock_null() selftest - v3 link: https://lore.kernel.org/all/20260331153413.2469218-1-wusamuel@google.com/ Changes in v3: - Changed return type of bpf_wakeup_sources_get_head() to `void *` per Alexei - Added failure test for direct dereference of wakeup source head - Use bpf_core_cast() instead of macros in BPF program per Kumar - v2 link: https://lore.kernel.org/all/20260326112521.2827500-1-wusamuel@google.com/ Changes in v2: - Dropped CONFIG_PM_WAKEUP_STATS_SYSFS patch for future patchset - Added declarations for kfuncs to .h to fix sparse and checkpatch warnings - Added kfunc to get address of wakeup_source's head - Added example bpf prog selftest for traversal of wakeup sources per Kumar - Added *_fail.c selftest per Kumar - More concise commit message in patch 1/2 - v1 link: https://lore.kernel.org/all/20260320160055.4114055-1-wusamuel@google.com/ Samuel Wu (2): PM: wakeup: Add kfuncs to traverse over wakeup_sources selftests/bpf: Add tests for wakeup_sources kfuncs drivers/base/power/power.h | 7 ++ drivers/base/power/wakeup.c | 71 ++++++++++- tools/testing/selftests/bpf/config | 3 +- .../selftests/bpf/prog_tests/wakeup_source.c | 118 ++++++++++++++++++ .../selftests/bpf/progs/test_wakeup_source.c | 92 ++++++++++++++ .../selftests/bpf/progs/wakeup_source.h | 22 ++++ .../selftests/bpf/progs/wakeup_source_fail.c | 76 +++++++++++ 7 files changed, 386 insertions(+), 3 deletions(-) create mode 100644 tools/testing/selftests/bpf/prog_tests/wakeup_source.c create mode 100644 tools/testing/selftests/bpf/progs/test_wakeup_source.c create mode 100644 tools/testing/selftests/bpf/progs/wakeup_source.h create mode 100644 tools/testing/selftests/bpf/progs/wakeup_source_fail.c -- 2.54.0.563.g4f69b47b94-goog
On Mon, 11 May 2026 at 19:50, Samuel Wu <wusamuel@google.com> wrote: > > This patchset adds requisite kfuncs for BPF programs to safely traverse > wakeup_sources, and puts a config flag around the sysfs interface. > > Currently, a traversal of wakeup sources require going through > /sys/class/wakeup/* or /d/wakeup_sources/*. The repeated syscalls to query > sysfs is inefficient, as there can be hundreds of wakeup_sources, with each > wakeup source also having multiple attributes. debugfs is unstable and > insecure. > > Adding kfuncs to lock/unlock wakeup sources allows BPF program to safely > traverse the wakeup sources list, and a kfunc to get head of wakeup > sources list is needed to start traversing the list. > > On a quiescent Pixel 6 traversing 150 wakeup_sources, I am seeing ~34x > speedup (sampled 75 times in table below). For a device under load, the > speedup is greater. > +-------+----+----------+----------+ > | | n | AVG (ms) | STD (ms) | > +-------+----+----------+----------+ > | sysfs | 75 | 44.9 | 12.6 | > +-------+----+----------+----------+ > | BPF | 75 | 1.3 | 0.7 | > +-------+----+----------+----------+ > > The initial attempts for BPF traversal of wakeup_sources was with BPF > iterators [1]. However, BPF already allows for traversing of a simple list > with bpf_for(), and this current patchset has the added benefit of being > ~2-3x more performant than BPF iterators. This looks good to me, you can add for the set: Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> > > [...]
On Mon, May 11, 2026 at 1:44 PM Kumar Kartikeya Dwivedi <memxor@gmail.com> wrote: > > On Mon, 11 May 2026 at 19:50, Samuel Wu <wusamuel@google.com> wrote: > > > > This patchset adds requisite kfuncs for BPF programs to safely traverse > > wakeup_sources, and puts a config flag around the sysfs interface. > > > > Currently, a traversal of wakeup sources require going through > > /sys/class/wakeup/* or /d/wakeup_sources/*. The repeated syscalls to query > > sysfs is inefficient, as there can be hundreds of wakeup_sources, with each > > wakeup source also having multiple attributes. debugfs is unstable and > > insecure. > > > > Adding kfuncs to lock/unlock wakeup sources allows BPF program to safely > > traverse the wakeup sources list, and a kfunc to get head of wakeup > > sources list is needed to start traversing the list. > > > > On a quiescent Pixel 6 traversing 150 wakeup_sources, I am seeing ~34x > > speedup (sampled 75 times in table below). For a device under load, the > > speedup is greater. > > +-------+----+----------+----------+ > > | | n | AVG (ms) | STD (ms) | > > +-------+----+----------+----------+ > > | sysfs | 75 | 44.9 | 12.6 | > > +-------+----+----------+----------+ > > | BPF | 75 | 1.3 | 0.7 | > > +-------+----+----------+----------+ > > > > The initial attempts for BPF traversal of wakeup_sources was with BPF > > iterators [1]. However, BPF already allows for traversing of a simple list > > with bpf_for(), and this current patchset has the added benefit of being > > ~2-3x more performant than BPF iterators. > > This looks good to me, you can add for the set: > Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Rafael, how do you want to route it? If you ack it we can take it into bpf-next. I'd think patch 1 shouldn't conflict with other 'wakeup' changes.
On Wed, May 13, 2026 at 2:51 AM Alexei Starovoitov <alexei.starovoitov@gmail.com> wrote: > > On Mon, May 11, 2026 at 1:44 PM Kumar Kartikeya Dwivedi > <memxor@gmail.com> wrote: > > > > On Mon, 11 May 2026 at 19:50, Samuel Wu <wusamuel@google.com> wrote: > > > > > > This patchset adds requisite kfuncs for BPF programs to safely traverse > > > wakeup_sources, and puts a config flag around the sysfs interface. > > > > > > Currently, a traversal of wakeup sources require going through > > > /sys/class/wakeup/* or /d/wakeup_sources/*. The repeated syscalls to query > > > sysfs is inefficient, as there can be hundreds of wakeup_sources, with each > > > wakeup source also having multiple attributes. debugfs is unstable and > > > insecure. > > > > > > Adding kfuncs to lock/unlock wakeup sources allows BPF program to safely > > > traverse the wakeup sources list, and a kfunc to get head of wakeup > > > sources list is needed to start traversing the list. > > > > > > On a quiescent Pixel 6 traversing 150 wakeup_sources, I am seeing ~34x > > > speedup (sampled 75 times in table below). For a device under load, the > > > speedup is greater. > > > +-------+----+----------+----------+ > > > | | n | AVG (ms) | STD (ms) | > > > +-------+----+----------+----------+ > > > | sysfs | 75 | 44.9 | 12.6 | > > > +-------+----+----------+----------+ > > > | BPF | 75 | 1.3 | 0.7 | > > > +-------+----+----------+----------+ > > > > > > The initial attempts for BPF traversal of wakeup_sources was with BPF > > > iterators [1]. However, BPF already allows for traversing of a simple list > > > with bpf_for(), and this current patchset has the added benefit of being > > > ~2-3x more performant than BPF iterators. > > > > This looks good to me, you can add for the set: > > Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> > > Rafael, > how do you want to route it? > > If you ack it we can take it into bpf-next. I guess if someone really wants this, I have no particular reason to object, so please feel free to add Acked-by: Rafael J. Wysocki (Intel) <rafael@kernel.org> to the first patch. > I'd think patch 1 shouldn't conflict with other 'wakeup' changes. Sure, there are none ATM anyway. Thanks!
On Wed, May 13, 2026 at 12:52 PM Rafael J. Wysocki <rafael@kernel.org> wrote: > > On Wed, May 13, 2026 at 2:51 AM Alexei Starovoitov > <alexei.starovoitov@gmail.com> wrote: > > > > On Mon, May 11, 2026 at 1:44 PM Kumar Kartikeya Dwivedi > > <memxor@gmail.com> wrote: > > > > > > On Mon, 11 May 2026 at 19:50, Samuel Wu <wusamuel@google.com> wrote: > > > > > > > > This patchset adds requisite kfuncs for BPF programs to safely traverse > > > > wakeup_sources, and puts a config flag around the sysfs interface. > > > > > > > > Currently, a traversal of wakeup sources require going through > > > > /sys/class/wakeup/* or /d/wakeup_sources/*. The repeated syscalls to query > > > > sysfs is inefficient, as there can be hundreds of wakeup_sources, with each > > > > wakeup source also having multiple attributes. debugfs is unstable and > > > > insecure. > > > > > > > > Adding kfuncs to lock/unlock wakeup sources allows BPF program to safely > > > > traverse the wakeup sources list, and a kfunc to get head of wakeup > > > > sources list is needed to start traversing the list. > > > > > > > > On a quiescent Pixel 6 traversing 150 wakeup_sources, I am seeing ~34x > > > > speedup (sampled 75 times in table below). For a device under load, the > > > > speedup is greater. > > > > +-------+----+----------+----------+ > > > > | | n | AVG (ms) | STD (ms) | > > > > +-------+----+----------+----------+ > > > > | sysfs | 75 | 44.9 | 12.6 | > > > > +-------+----+----------+----------+ > > > > | BPF | 75 | 1.3 | 0.7 | > > > > +-------+----+----------+----------+ > > > > > > > > The initial attempts for BPF traversal of wakeup_sources was with BPF > > > > iterators [1]. However, BPF already allows for traversing of a simple list > > > > with bpf_for(), and this current patchset has the added benefit of being > > > > ~2-3x more performant than BPF iterators. > > > > > > This looks good to me, you can add for the set: > > > Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> > > > > Rafael, > > how do you want to route it? > > > > If you ack it we can take it into bpf-next. > > I guess if someone really wants this, I have no particular reason to > object, so please feel free to add > > Acked-by: Rafael J. Wysocki (Intel) <rafael@kernel.org> > > to the first patch. > > > I'd think patch 1 shouldn't conflict with other 'wakeup' changes. > > Sure, there are none ATM anyway. Thanks! Greg, are you ok with it too? I hear your api concerns, but imo it's a nice improvement. And bpf is not a stable interface despite some sceptics saying otherwise. Just see how much sched-ext api surface has changed. So if pm:wakeup folks need to tweak it later they're certainly free to do it. Of course, it's better to keep things backward compact and deprecate gradually. All options in developer's hands.
On Wed, May 13, 2026 at 02:03:39PM -0700, Alexei Starovoitov wrote: > On Wed, May 13, 2026 at 12:52 PM Rafael J. Wysocki <rafael@kernel.org> wrote: > > > > On Wed, May 13, 2026 at 2:51 AM Alexei Starovoitov > > <alexei.starovoitov@gmail.com> wrote: > > > > > > On Mon, May 11, 2026 at 1:44 PM Kumar Kartikeya Dwivedi > > > <memxor@gmail.com> wrote: > > > > > > > > On Mon, 11 May 2026 at 19:50, Samuel Wu <wusamuel@google.com> wrote: > > > > > > > > > > This patchset adds requisite kfuncs for BPF programs to safely traverse > > > > > wakeup_sources, and puts a config flag around the sysfs interface. > > > > > > > > > > Currently, a traversal of wakeup sources require going through > > > > > /sys/class/wakeup/* or /d/wakeup_sources/*. The repeated syscalls to query > > > > > sysfs is inefficient, as there can be hundreds of wakeup_sources, with each > > > > > wakeup source also having multiple attributes. debugfs is unstable and > > > > > insecure. > > > > > > > > > > Adding kfuncs to lock/unlock wakeup sources allows BPF program to safely > > > > > traverse the wakeup sources list, and a kfunc to get head of wakeup > > > > > sources list is needed to start traversing the list. > > > > > > > > > > On a quiescent Pixel 6 traversing 150 wakeup_sources, I am seeing ~34x > > > > > speedup (sampled 75 times in table below). For a device under load, the > > > > > speedup is greater. > > > > > +-------+----+----------+----------+ > > > > > | | n | AVG (ms) | STD (ms) | > > > > > +-------+----+----------+----------+ > > > > > | sysfs | 75 | 44.9 | 12.6 | > > > > > +-------+----+----------+----------+ > > > > > | BPF | 75 | 1.3 | 0.7 | > > > > > +-------+----+----------+----------+ > > > > > > > > > > The initial attempts for BPF traversal of wakeup_sources was with BPF > > > > > iterators [1]. However, BPF already allows for traversing of a simple list > > > > > with bpf_for(), and this current patchset has the added benefit of being > > > > > ~2-3x more performant than BPF iterators. > > > > > > > > This looks good to me, you can add for the set: > > > > Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> > > > > > > Rafael, > > > how do you want to route it? > > > > > > If you ack it we can take it into bpf-next. > > > > I guess if someone really wants this, I have no particular reason to > > object, so please feel free to add > > > > Acked-by: Rafael J. Wysocki (Intel) <rafael@kernel.org> > > > > to the first patch. > > > > > I'd think patch 1 shouldn't conflict with other 'wakeup' changes. > > > > Sure, there are none ATM anyway. > > Thanks! > > Greg, > are you ok with it too? > I hear your api concerns, but imo it's a nice improvement. > And bpf is not a stable interface despite some sceptics saying otherwise. > Just see how much sched-ext api surface has changed. > > So if pm:wakeup folks need to tweak it later they're certainly > free to do it. Of course, it's better to keep things backward compact > and deprecate gradually. All options in developer's hands. I still feel it's really odd to be wanting to iterate over a zillion sysfs files all at once, but sure, if this fixes the problem for this user, might as well take it... Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
© 2016 - 2026 Red Hat, Inc.