Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 755b7a41 authored by Todd Poynor's avatar Todd Poynor Committed by Amit Pundir
Browse files

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: default avatarFrancisco Franco <francisco.franco@cloudcar.com>
Signed-off-by: default avatarTodd Poynor <toddpoynor@google.com>
parent 4235053a
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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);
		}

		/*