Re: [PATCH] sched/schedutil: Fix deadlock between cpuset and cpu hotplug when using schedutil

From: Waiman Long
Date: Tue Jul 12 2022 - 23:03:09 EST


On 7/11/22 17:11, Steven Rostedt wrote:
On Mon, 11 Jul 2022 10:58:28 -1000
Tejun Heo <tj@xxxxxxxxxx> wrote:

I don't think lockdep would be able to track CPU1 -> CPU2 dependency here
unfortunately.

AFAIU:


CPU0 CPU1 CPU2

// attach task to a different
// cpuset cgroup via sysfs
__acquire(cgroup_threadgroup_rwsem)

// pring up CPU2 online
__acquire(cpu_hotplug_lock)
// wait for CPU2 to come online
Should there be some annotation here that tells lockdep that CPU1 is now
blocked on CPU2?

Then this case would be caught by lockdep.

-- Steve


// bringup cpu online
// call cpufreq_online() which tries to create sugov kthread
__acquire(cpu_hotplug_lock) copy_process()
cgroup_can_fork()
cgroup_css_set_fork()
__acquire(cgroup_threadgroup_rwsem)
// blocks forever // blocks forever // blocks forever

Actually, the dependency can probably be coded by calling lockdep_acquire_cpus_lock() in cpu2 (task 2) before acquiring cgroup_threadgroup_rwsem to indicate the dependency between CPU1 and CPU2 (task 1 and task 2). lockdep_release_cpus_lock() can then called after release the rwsem.

Cheers,
Longman