diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq_ondemand.c')
| -rw-r--r-- | drivers/cpufreq/cpufreq_ondemand.c | 5 | 
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index 338f428a15b..e741c339df7 100644 --- a/drivers/cpufreq/cpufreq_ondemand.c +++ b/drivers/cpufreq/cpufreq_ondemand.c @@ -98,6 +98,9 @@ static unsigned int dbs_enable;	/* number of CPUs using this policy */   * (like __cpufreq_driver_target()) is being called with dbs_mutex taken, then   * cpu_hotplug lock should be taken before that. Note that cpu_hotplug lock   * is recursive for the same process. -Venki + * DEADLOCK ALERT! (2) : do_dbs_timer() must not take the dbs_mutex, because it + * would deadlock with cancel_delayed_work_sync(), which is needed for proper + * raceless workqueue teardown.   */  static DEFINE_MUTEX(dbs_mutex); @@ -562,7 +565,7 @@ static inline void dbs_timer_init(struct cpu_dbs_info_s *dbs_info)  static inline void dbs_timer_exit(struct cpu_dbs_info_s *dbs_info)  {  	dbs_info->enable = 0; -	cancel_delayed_work(&dbs_info->work); +	cancel_delayed_work_sync(&dbs_info->work);  }  static int cpufreq_governor_dbs(struct cpufreq_policy *policy,  |