diff options
author | Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> | 2006-06-21 18:18:34 -0400 |
---|---|---|
committer | Dave Jones <davej@redhat.com> | 2006-06-21 18:30:26 -0400 |
commit | 4ec223d02f4d5f5a3129edc0e3d22550d6ac8a32 (patch) | |
tree | 753cec643fa59ccda64a95fa5436956e481c1137 /kernel/ptrace.c | |
parent | 9ed059e1551bf36092215b965838502ac21f42e4 (diff) |
[CPUFREQ] Fix ondemand vs suspend deadlock
Rootcaused the bug to a deadlock in cpufreq and ondemand. Due to non-existent
ordering between cpu_hotplug lock and dbs_mutex. Basically a race condition
between cpu_down() and do_dbs_timer().
cpu_down() flow:
* cpu_down() call for CPU 1
* Takes hot plug lock
* Calls pre down notifier
* cpufreq notifier handler calls cpufreq_driver_target() which takes
cpu_hotplug lock again. OK as cpu_hotplug lock is recursive in same
process context
* CPU 1 goes down
* Calls post down notifier
* cpufreq notifier handler calls ondemand event stop which takes dbs_mutex
So, cpu_hotplug lock is taken before dbs_mutex in this flow.
do_dbs_timer is triggerred by a periodic timer event.
It first takes dbs_mutex and then takes cpu_hotplug lock in
cpufreq_driver_target().
Note the reverse order here compared to above. So, if this timer event happens
at right moment during cpu_down, system will deadlok.
Attached patch fixes the issue for both ondemand and conservative.
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Dave Jones <davej@redhat.com>
Diffstat (limited to 'kernel/ptrace.c')
0 files changed, 0 insertions, 0 deletions