From 68f3fc9c64578f002265cb7b92e527af6286c262 Mon Sep 17 00:00:00 2001 From: Zhang Bo Date: Thu, 1 Jun 2017 14:21:58 +0800 Subject: [PATCH] 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 Signed-off-by: Todd Poynor --- drivers/cpufreq/cpufreq_interactive.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c index d6cac0e8e7a6..576be554d83d 100644 --- a/drivers/cpufreq/cpufreq_interactive.c +++ b/drivers/cpufreq/cpufreq_interactive.c @@ -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); }