On Tue, Sep 01, 2020 at 02:35:52PM +0200, Ulf Hansson wrote:
On Tue, 1 Sep 2020 at 12:42, peterz@infradead.org wrote:
That said; I pushed the rcu_idle_enter() about as deep as it goes into generic code in commit 1098582a0f6c ("sched,idle,rcu: Push rcu_idle deeper into the idle path")
Aha, that commit should fix this problem, I think. Looks like that commit was sent as a fix and included in the recent v5.9-rc3.
AFAICT psci_enter_domain_idle_state() is still buggered. All that pm_runtime_*() stuff is using locks.
Look at this:
psci_enter_domain_idle_state() pm_runtime_put_sync_suspend() __pm_runtime_suspend() spin_lock_irqsave(&dev->power.lock, flags);
That's a definite fail after we've done rcu_idle_enter().
I suppose the next step is pushing it into individual driver when needed, something like the below perhaps. I realize the coupled idle state stuff is more complicated that most, but it's also not an area I've looked at in detail, so perhaps I've just made a bigger mess, but it ought to give you enough to get going I think.
These aren't coupled states. Instead, in cpuidle-psci, we are using PM domains through genpd and runtime PM to manage "shared idle states" between CPUs.
Similar problem I'm thinking, 'complicated' stuff.