On Thu, 2017-07-27 at 13:23:37 UTC, Michael Ellerman wrote: > In smp_cpus_done() we need to call smp_ops->setup_cpu() for the boot > CPU, which means it has to run *on* the boot CPU. > > In the past we ensured it ran on the boot CPU by changing the CPU > affinity mask of current directly. That was removed in commit > 6d11b87d55eb ("powerpc/smp: Replace open coded task affinity logic"), > and replaced with a work queue call. > > Unfortunately using a work queue leads to a lockdep warning, now that > the CPU hotplug lock is a regular semaphore: > > ====================================================== > WARNING: possible circular locking dependency detected > ... > kworker/0:1/971 is trying to acquire lock: > (cpu_hotplug_lock.rw_sem){++++++}, at: [<c000000000100974>] > apply_workqueue_attrs+0x34/0xa0 > > but task is already holding lock: > ((&wfc.work)){+.+.+.}, at: [<c0000000000fdb2c>] > process_one_work+0x25c/0x800 > ... > CPU0 CPU1 > ---- ---- > lock((&wfc.work)); > lock(cpu_hotplug_lock.rw_sem); > lock((&wfc.work)); > lock(cpu_hotplug_lock.rw_sem); > > Although the deadlock can't happen in practice, because > smp_cpus_done() only runs in early boot before CPU hotplug is allowed, > lockdep can't tell that. > > Luckily in commit 8fb12156b8db ("init: Pin init task to the boot CPU, > initially") tglx changed the generic code to pin init to the boot CPU > to begin with. The unpinning of init from the boot CPU happens in > sched_init_smp(), which is called after smp_cpus_done(). > > So smp_cpus_done() is always called on the boot CPU, which means we > don't need the work queue call at all - and the lockdep warning goes > away. > > Signed-off-by: Michael Ellerman <m...@ellerman.id.au>
Applied to powerpc fixes. https://git.kernel.org/powerpc/c/7b7622bb95eb587cbaa79608e47b83 cheers