Loading drivers/cpufreq/cpufreq_interactive.c +10 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ struct cpufreq_interactive_cpuinfo { u64 local_hvtime; /* per-cpu hispeed_validate_time */ u64 max_freq_idle_start_time; struct rw_semaphore enable_sem; bool reject_notification; int governor_enabled; struct cpufreq_interactive_tunables *cached_tunables; int first_cpu; Loading Loading @@ -754,6 +755,9 @@ static int load_change_callback(struct notifier_block *nb, unsigned long val, if (speedchange_task == current) return 0; if (pcpu->reject_notification) return 0; if (!down_read_trylock(&pcpu->enable_sem)) return 0; if (!pcpu->governor_enabled) { Loading Loading @@ -1650,6 +1654,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, pcpu->floor_validate_time; pcpu->local_hvtime = pcpu->floor_validate_time; pcpu->max_freq = policy->max; pcpu->reject_notification = true; down_write(&pcpu->enable_sem); del_timer_sync(&pcpu->cpu_timer); del_timer_sync(&pcpu->cpu_slack_timer); Loading @@ -1657,6 +1662,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, cpufreq_interactive_timer_start(tunables, j); pcpu->governor_enabled = 1; up_write(&pcpu->enable_sem); pcpu->reject_notification = false; } mutex_unlock(&gov_lock); Loading @@ -1666,12 +1672,14 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, mutex_lock(&gov_lock); for_each_cpu(j, policy->cpus) { pcpu = &per_cpu(cpuinfo, j); pcpu->reject_notification = true; down_write(&pcpu->enable_sem); pcpu->governor_enabled = 0; pcpu->target_freq = 0; del_timer_sync(&pcpu->cpu_timer); del_timer_sync(&pcpu->cpu_slack_timer); up_write(&pcpu->enable_sem); pcpu->reject_notification = false; } mutex_unlock(&gov_lock); Loading Loading @@ -1710,11 +1718,13 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, */ if (policy->max > pcpu->max_freq) { pcpu->reject_notification = true; down_write(&pcpu->enable_sem); del_timer_sync(&pcpu->cpu_timer); del_timer_sync(&pcpu->cpu_slack_timer); cpufreq_interactive_timer_resched(j); up_write(&pcpu->enable_sem); pcpu->reject_notification = false; } pcpu->max_freq = policy->max; Loading Loading
drivers/cpufreq/cpufreq_interactive.c +10 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ struct cpufreq_interactive_cpuinfo { u64 local_hvtime; /* per-cpu hispeed_validate_time */ u64 max_freq_idle_start_time; struct rw_semaphore enable_sem; bool reject_notification; int governor_enabled; struct cpufreq_interactive_tunables *cached_tunables; int first_cpu; Loading Loading @@ -754,6 +755,9 @@ static int load_change_callback(struct notifier_block *nb, unsigned long val, if (speedchange_task == current) return 0; if (pcpu->reject_notification) return 0; if (!down_read_trylock(&pcpu->enable_sem)) return 0; if (!pcpu->governor_enabled) { Loading Loading @@ -1650,6 +1654,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, pcpu->floor_validate_time; pcpu->local_hvtime = pcpu->floor_validate_time; pcpu->max_freq = policy->max; pcpu->reject_notification = true; down_write(&pcpu->enable_sem); del_timer_sync(&pcpu->cpu_timer); del_timer_sync(&pcpu->cpu_slack_timer); Loading @@ -1657,6 +1662,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, cpufreq_interactive_timer_start(tunables, j); pcpu->governor_enabled = 1; up_write(&pcpu->enable_sem); pcpu->reject_notification = false; } mutex_unlock(&gov_lock); Loading @@ -1666,12 +1672,14 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, mutex_lock(&gov_lock); for_each_cpu(j, policy->cpus) { pcpu = &per_cpu(cpuinfo, j); pcpu->reject_notification = true; down_write(&pcpu->enable_sem); pcpu->governor_enabled = 0; pcpu->target_freq = 0; del_timer_sync(&pcpu->cpu_timer); del_timer_sync(&pcpu->cpu_slack_timer); up_write(&pcpu->enable_sem); pcpu->reject_notification = false; } mutex_unlock(&gov_lock); Loading Loading @@ -1710,11 +1718,13 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, */ if (policy->max > pcpu->max_freq) { pcpu->reject_notification = true; down_write(&pcpu->enable_sem); del_timer_sync(&pcpu->cpu_timer); del_timer_sync(&pcpu->cpu_slack_timer); cpufreq_interactive_timer_resched(j); up_write(&pcpu->enable_sem); pcpu->reject_notification = false; } pcpu->max_freq = policy->max; Loading