rk30: cpufreq: prevent deadlock by disable call get_online_cpus
author黄涛 <huangtao@rock-chips.com>
Thu, 12 Jul 2012 01:31:21 +0000 (09:31 +0800)
committer黄涛 <huangtao@rock-chips.com>
Thu, 12 Jul 2012 01:49:51 +0000 (09:49 +0800)
The deadlock happens when:
rk30_cpufreq_temp_limit_work_func:
 cpufreq_driver_target
  lock_policy_rwsem_write
  mutex_lock(&cpufreq_mutex)

cpufreq_interactive_up_task:
 mutex_lock(&cpufreq_mutex)
 mutex_lock(&cpu_hotplug.lock)

_cpu_down:
 mutex_lock(&cpu_hotplug.lock)
 lock_policy_rwsem_write

arch/arm/mach-rk30/cpufreq.c

index f7a1c87c21b7213d42e81dc8962d9bc5d76a05da..d7d05d2c82fe6cd41999588ca39ed9fd67015896 100755 (executable)
@@ -548,7 +548,6 @@ int cpufreq_scale_rate_for_dvfs(struct clk *clk, unsigned long rate, dvfs_set_ra
        freqs.new = rate / 1000;
        freqs.old = rk30_getspeed(0);
 
-       get_online_cpus();
        for_each_online_cpu(freqs.cpu) {
                cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
        }
@@ -571,7 +570,6 @@ int cpufreq_scale_rate_for_dvfs(struct clk *clk, unsigned long rate, dvfs_set_ra
        for_each_online_cpu(freqs.cpu) {
                cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
        }
-       put_online_cpus();
        return ret;
 
 }