kernel/cgroup/rstat.c | 2 -- 1 file changed, 2 deletions(-)
BPF programs do not disable preemption, they only disable migration.
Therefore, when running the cgroup_hierarchical_stats selftest, a
warning [1] is generated.
The css_rstat_updated() function is lockless and reentrant, so checking
for disabled preemption is unnecessary (please correct me if I'm wrong).
[1]:
~/tools/testing/selftests/bpf$
test_progs -a cgroup_hierarchical_stats
...
------------[ cut here ]------------
WARNING: CPU: 0 PID: 382 at kernel/cgroup/rstat.c:84
Modules linked in:
RIP: 0010:css_rstat_updated+0x9d/0x160
...
PKRU: 55555554
Call Trace:
<TASK>
bpf_prog_16a1c2d081688506_counter+0x143/0x14e
bpf_trampoline_6442524909+0x4b/0xb7
cgroup_attach_task+0x5/0x330
? __cgroup_procs_write+0x1d7/0x2f0
cgroup_procs_write+0x17/0x30
cgroup_file_write+0xa6/0x2d0
kernfs_fop_write_iter+0x188/0x240
vfs_write+0x2da/0x5a0
ksys_write+0x77/0x100
__x64_sys_write+0x19/0x30
x64_sys_call+0x79/0x26a0
do_syscall_64+0x89/0x790
? irqentry_exit+0x77/0xb0
? __this_cpu_preempt_check+0x13/0x20
? lockdep_hardirqs_on+0xce/0x170
? irqentry_exit_to_user_mode+0xf2/0x290
? irqentry_exit+0x77/0xb0
? clear_bhb_loop+0x50/0xa0
? clear_bhb_loop+0x50/0xa0
entry_SYSCALL_64_after_hwframe+0x76/0x7e
---[ end trace 0000000000000000 ]---
Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
---
kernel/cgroup/rstat.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c
index a198e40c799b..fe0d22280cbd 100644
--- a/kernel/cgroup/rstat.c
+++ b/kernel/cgroup/rstat.c
@@ -81,8 +81,6 @@ __bpf_kfunc void css_rstat_updated(struct cgroup_subsys_state *css, int cpu)
if (!css_uses_rstat(css))
return;
- lockdep_assert_preemption_disabled();
-
/*
* For archs withnot nmi safe cmpxchg or percpu ops support, ignore
* the requests from nmi context.
--
2.43.0
Hello, On Wed, Nov 19, 2025 at 07:14:01PM +0800, Jiayuan Chen wrote: > BPF programs do not disable preemption, they only disable migration. > Therefore, when running the cgroup_hierarchical_stats selftest, a > warning [1] is generated. > > The css_rstat_updated() function is lockless and reentrant, so checking > for disabled preemption is unnecessary (please correct me if I'm wrong). While it won't crash the kernel to schedule while running the function, there are timing considerations here. If the thread which wins the lnode competition gets scheduled out, there can be significant unexpected delays for others that lost against it. Maybe just update the caller to disable preemption? Thanks. -- tejun
November 19, 2025 at 23:59, "Tejun Heo" <tj@kernel.org mailto:tj@kernel.org?to=%22Tejun%20Heo%22%20%3Ctj%40kernel.org%3E > wrote:
>
> Hello,
>
> On Wed, Nov 19, 2025 at 07:14:01PM +0800, Jiayuan Chen wrote:
>
> >
> > BPF programs do not disable preemption, they only disable migration.
> > Therefore, when running the cgroup_hierarchical_stats selftest, a
> > warning [1] is generated.
> >
> > The css_rstat_updated() function is lockless and reentrant, so checking
> > for disabled preemption is unnecessary (please correct me if I'm wrong).
> >
> While it won't crash the kernel to schedule while running the function,
> there are timing considerations here. If the thread which wins the lnode
> competition gets scheduled out, there can be significant unexpected delays
> for others that lost against it. Maybe just update the caller to disable
> preemption?
>
> Thanks.
>
> --
> tejun
>
Since css_rstat_updated() can be called from BPF where preemption is not
disabled by its framework, we can simply add preempt_disable()/preempt_enable()
around the call, like this:
void css_rstat_updated()
{
preempt_disable();
__css_rstat_updated();
preempt_enable();
}
© 2016 - 2025 Red Hat, Inc.