|
@@ -61,6 +61,8 @@ static DEFINE_SPINLOCK(cpufreq_driver_lock);
|
|
|
* are concerned with are online after they get the lock.
|
|
|
* - Governor routines that can be called in cpufreq hotplug path should not
|
|
|
* take this sem as top level hotplug notifier handler takes this.
|
|
|
+ * - Lock should not be held across
|
|
|
+ * __cpufreq_governor(data, CPUFREQ_GOV_STOP);
|
|
|
*/
|
|
|
static DEFINE_PER_CPU(int, policy_cpu);
|
|
|
static DEFINE_PER_CPU(struct rw_semaphore, cpu_policy_rwsem);
|
|
@@ -1707,8 +1709,17 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data,
|
|
|
dprintk("governor switch\n");
|
|
|
|
|
|
/* end old governor */
|
|
|
- if (data->governor)
|
|
|
+ if (data->governor) {
|
|
|
+ /*
|
|
|
+ * Need to release the rwsem around governor
|
|
|
+ * stop due to lock dependency between
|
|
|
+ * cancel_delayed_work_sync and the read lock
|
|
|
+ * taken in the delayed work handler.
|
|
|
+ */
|
|
|
+ unlock_policy_rwsem_write(data->cpu);
|
|
|
__cpufreq_governor(data, CPUFREQ_GOV_STOP);
|
|
|
+ lock_policy_rwsem_write(data->cpu);
|
|
|
+ }
|
|
|
|
|
|
/* start new governor */
|
|
|
data->governor = policy->governor;
|