cpufreq: interactive: fix race on timer restart on governor start
Starting the governor, or restarting on a hotplugged-in CPU, can race with the timer start in idle, triggering a BUG on timer already pending. Start the timer before setting the enable flag, and use enable_sem to protect the sequence (and ensure correct order of the update to the enable flag). Delete any existing timer for safety. Change-Id: Ife77cf9fe099e8fd8543224cbf148c6722c2ffb0 Reported-by: Francisco Franco <francisco.franco@cloudcar.com> Signed-off-by: Todd Poynor <toddpoynor@google.com>
This commit is contained in:
parent
583695f13b
commit
1dc7486fd8
1 changed files with 3 additions and 3 deletions
|
@ -919,17 +919,17 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
|
|||
ktime_to_us(ktime_get());
|
||||
pcpu->hispeed_validate_time =
|
||||
pcpu->floor_validate_time;
|
||||
pcpu->governor_enabled = 1;
|
||||
smp_wmb();
|
||||
down_write(&pcpu->enable_sem);
|
||||
expires = jiffies + usecs_to_jiffies(timer_rate);
|
||||
pcpu->cpu_timer.expires = expires;
|
||||
add_timer_on(&pcpu->cpu_timer, j);
|
||||
|
||||
if (timer_slack_val >= 0) {
|
||||
expires += usecs_to_jiffies(timer_slack_val);
|
||||
pcpu->cpu_slack_timer.expires = expires;
|
||||
add_timer_on(&pcpu->cpu_slack_timer, j);
|
||||
}
|
||||
pcpu->governor_enabled = 1;
|
||||
up_write(&pcpu->enable_sem);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Reference in a new issue