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
freqs.new = rate / 1000;
freqs.old = rk30_getspeed(0);
- get_online_cpus();
for_each_online_cpu(freqs.cpu) {
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
}
for_each_online_cpu(freqs.cpu) {
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
}
- put_online_cpus();
return ret;
}