mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
sched_ext: idle: Validate locking correctness in scx_bpf_select_cpu_and()
Validate locking correctness when accessing p->nr_cpus_allowed and p->cpus_ptr inside scx_bpf_select_cpu_and(): if the rq lock is held, access is safe; otherwise, require that p->pi_lock is held. This allows to catch potential unsafe calls to scx_bpf_select_cpu_and(). Signed-off-by: Andrea Righi <arighi@nvidia.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
617a77018f
commit
686d133723
|
|
@ -935,6 +935,7 @@ __bpf_kfunc s32 scx_bpf_select_cpu_dfl(struct task_struct *p, s32 prev_cpu,
|
|||
__bpf_kfunc s32 scx_bpf_select_cpu_and(struct task_struct *p, s32 prev_cpu, u64 wake_flags,
|
||||
const struct cpumask *cpus_allowed, u64 flags)
|
||||
{
|
||||
struct rq *rq;
|
||||
s32 cpu;
|
||||
|
||||
if (!kf_cpu_valid(prev_cpu, NULL))
|
||||
|
|
@ -946,6 +947,15 @@ __bpf_kfunc s32 scx_bpf_select_cpu_and(struct task_struct *p, s32 prev_cpu, u64
|
|||
if (!scx_kf_allowed(SCX_KF_SELECT_CPU | SCX_KF_ENQUEUE))
|
||||
return -EPERM;
|
||||
|
||||
/*
|
||||
* Validate locking correctness to access p->cpus_ptr and
|
||||
* p->nr_cpus_allowed: if we're holding an rq lock, we're safe;
|
||||
* otherwise, assert that p->pi_lock is held.
|
||||
*/
|
||||
rq = scx_locked_rq();
|
||||
if (!rq)
|
||||
lockdep_assert_held(&p->pi_lock);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
* This may also be called from ops.enqueue(), so we need to handle
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user