ANDROID: cpufreq: system panic when switch interactive governor frequently

When try to suspend and resume and playback video or audio at the same time,
Power HAL will switch governor between conservative and interactive.

Before cpufreq switch to conservative governor, it will stop interactive
governor(in function: cpufreq_interactive_stop) and set "icpu->ipolicy = NULL;".
If the cpufreq_interactive_speedchange_task doesn't exit and run at the
same time, it try to get "policy = icpu->ipolicy->policy;". It will cause
system panic. Need to check pointer validatation before read.

Change-Id: I608969370738130c44b1816f073423d509a3bcd7
Signed-off-by: Zhang Bo <bo.zhang@nxp.com>
Signed-off-by: Todd Poynor <toddpoynor@google.com>
This commit is contained in:
Zhang Bo
2017-06-01 14:21:58 +08:00
committed by Todd Poynor
parent 3d89857e62
commit 68f3fc9c64

View File

@@ -570,13 +570,15 @@ again:
for_each_cpu(cpu, &tmp_mask) {
struct interactive_cpu *icpu = &per_cpu(interactive_cpu, cpu);
struct cpufreq_policy *policy = icpu->ipolicy->policy;
struct cpufreq_policy *policy;
if (unlikely(!down_read_trylock(&icpu->enable_sem)))
continue;
if (likely(icpu->ipolicy))
if (likely(icpu->ipolicy)) {
policy = icpu->ipolicy->policy;
cpufreq_interactive_adjust_cpu(cpu, policy);
}
up_read(&icpu->enable_sem);
}