summaryrefslogtreecommitdiff
path: root/tools/lib/python
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2026-10-27 08:03:53 -1000
committerTejun Heo <tj@kernel.org>2026-10-27 09:40:56 -1000
commitaf4ed5682e62556beb399b76f2f1274ae1aad9e2 (patch)
treeb7d5e16e5a0bff2dde4b037b9dc45f158cff7b05 /tools/lib/python
parentb7723dedac0e92e5a74e89cb800a0083c2ab9ee2 (diff)
downloadlinux-af4ed5682e62556beb399b76f2f1274ae1aad9e2.tar.gz
linux-af4ed5682e62556beb399b76f2f1274ae1aad9e2.zip
sched_ext: Reject scx_bpf_sub_grant/revoke() in tracing programs
A tracing program can call scx_bpf_sub_grant() and scx_bpf_sub_revoke() through scx_kfunc_ids_any, which is registered on the tracing kfunc hook. Before returning, both invoke ops.sub_caps_updated() of the sub-schedulers whose caps changed, so those ops run in the tracing program's context. No SCX op expects to run from an arbitrary tracing context. With an rq lock held, this leads to the same deadlock that b07a7450f6ef ("sched_ext: Reject rq-lock-taking kfuncs in tracing programs") fixed for direct calls: 1. A tp_btf/sched_switch program fires from __schedule() with the rq lock held. scx_locked_rq() only tracks rq locks held across SCX callbacks, so it returns NULL there. 2. The program calls scx_bpf_sub_grant() on a child, which invokes the child's ops.sub_caps_updated() before returning. 3. That op calls scx_bpf_cidperf_set() on this cpu, which sees no locked rq and takes the rq lock the cpu already holds. Add both kfuncs to scx_kfunc_ids_no_tracing and rewrite the set's comment to cover both reasons for membership: taking an rq lock and running SCX ops. Fixes: 5f2a9a4c2e6c ("sched_ext: Add coalescing sub_caps_updated() notifier for sub-schedulers") Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'tools/lib/python')
0 files changed, 0 insertions, 0 deletions