UPSTREAM: sched: Fix balance_push() vs __sched_setscheduler()
The purpose of balance_push() is to act as a filter on task selection in the case of CPU hotplug, specifically when taking the CPU out. It does this by (ab)using the balance callback infrastructure, with the express purpose of keeping all the unlikely/odd cases in a single place. In order to serve its purpose, the balance_push_callback needs to be (exclusively) on the callback list at all times (noting that the callback always places itself back on the list the moment it runs, also noting that when the CPU goes down, regular balancing concerns are moot, so ignoring them is fine). And here-in lies the problem, __sched_setscheduler()'s use of splice_balance_callbacks() takes the callbacks off the list across a lock-break, making it possible for, an interleaving, __schedule() to see an empty list and not get filtered. Fixes: ae792702 ("sched: Optimize finish_lock_switch()") Reported-by:Jing-Ting Wu <jing-ting.wu@mediatek.com> Signed-off-by:
Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by:
Jing-Ting Wu <jing-ting.wu@mediatek.com> Link: https://lkml.kernel.org/r/20220519134706.GH2578@worktop.programming.kicks-ass.net Bug: 231530208 (cherry picked from commit 04193d59) Signed-off-by:
Jing-Ting Wu <Jing-Ting.Wu@mediatek.com> Signed-off-by:
Carlos Llamas <cmllamas@google.com> Change-Id: Iaf0a2920b74a043cf27125fbf16c22b59d14efdc
Loading
Please sign in to comment