[tip: sched/core] PM: EM: Switch to rcu_dereference_all() in wakeup path
From: tip-bot2 for Dietmar Eggemann
Date: Wed Mar 18 2026 - 04:15:37 EST
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 8ca12326f592f7554acf2788ecb1c5c954dcf31c
Gitweb: https://git.kernel.org/tip/8ca12326f592f7554acf2788ecb1c5c954dcf31c
Author: Dietmar Eggemann <dietmar.eggemann@xxxxxxx>
AuthorDate: Mon, 16 Mar 2026 00:36:22 +01:00
Committer: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
CommitterDate: Wed, 18 Mar 2026 09:06:49 +01:00
PM: EM: Switch to rcu_dereference_all() in wakeup path
em_cpu_energy() is part of the EAS (Fair) task wakeup path. Now that
rcu_read_{,un}lock() have been removed from find_energy_efficient_cpu()
switch to rcu_dereference_all() and check for rcu_read_lock_any_held()
in em_cpu_energy() as well.
In EAS (Fair) task wakeup path is a preempt/IRQ disabled region, so
rcu_read_{,un}lock() can be removed.
Signed-off-by: Dietmar Eggemann <dietmar.eggemann@xxxxxxx>
Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
Reviewed-by: K Prateek Nayak <kprateek.nayak@xxxxxxx>
Link: https://patch.msgid.link/5b1228b7-5949-4a45-9f62-e8ce936de694@xxxxxxx
---
include/linux/energy_model.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/linux/energy_model.h b/include/linux/energy_model.h
index e7497f8..c909a8b 100644
--- a/include/linux/energy_model.h
+++ b/include/linux/energy_model.h
@@ -248,7 +248,7 @@ static inline unsigned long em_cpu_energy(struct em_perf_domain *pd,
struct em_perf_state *ps;
int i;
- WARN_ONCE(!rcu_read_lock_held(), "EM: rcu read lock needed\n");
+ lockdep_assert(rcu_read_lock_any_held());
if (!sum_util)
return 0;
@@ -267,7 +267,7 @@ static inline unsigned long em_cpu_energy(struct em_perf_domain *pd,
* Find the lowest performance state of the Energy Model above the
* requested performance.
*/
- em_table = rcu_dereference(pd->em_table);
+ em_table = rcu_dereference_all(pd->em_table);
i = em_pd_get_efficient_state(em_table->state, pd, max_util);
ps = &em_table->state[i];