Commit 686d1337 authored by Andrea Righi's avatar Andrea Righi Committed by Tejun Heo
Browse files

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: default avatarAndrea Righi <arighi@nvidia.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent 617a7701
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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