On 10/30, Viresh Kumar wrote:
dev_opp_list_lock is used everywhere to protect device and OPP lists, but dev_pm_opp_set_sharing_cpus() is missed somehow. And instead we used rcu-lock, which wouldn't help here as we are adding a new list_dev.
This also fixes a problem where we have called kzalloc(..., GFP_KERNEL) from within rcu-lock, which isn't allowed as kzalloc can sleep when called with GFP_KERNEL.
Care to share the splat here?
diff --git a/drivers/base/power/opp/cpu.c b/drivers/base/power/opp/cpu.c index 7654c5606307..91f15b2e25ee 100644 --- a/drivers/base/power/opp/cpu.c +++ b/drivers/base/power/opp/cpu.c @@ -124,12 +124,12 @@ int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, cpumask_var_t cpumask) struct device *dev; int cpu, ret = 0;
- rcu_read_lock();
- mutex_lock(&dev_opp_list_lock);
dev_opp = _find_device_opp(cpu_dev);
So does _find_device_opp() need to be called with rcu_read_lock() held or not? The comment above the function makes it sound like we need RCU, but we don't do that here anymore.