Loading drivers/cpufreq/cpufreq_interactive.c +12 −5 Original line number Diff line number Diff line Loading @@ -52,7 +52,8 @@ struct cpufreq_interactive_cpuinfo { unsigned int floor_freq; unsigned int max_freq; u64 floor_validate_time; u64 hispeed_validate_time; u64 hispeed_validate_time; /* cluster hispeed_validate_time */ u64 local_hvtime; /* per-cpu hispeed_validate_time */ u64 max_freq_idle_start_time; struct rw_semaphore enable_sem; int governor_enabled; Loading Loading @@ -466,6 +467,8 @@ static void cpufreq_interactive_timer(unsigned long data) goto rearm; } pcpu->local_hvtime = now; if (cpufreq_frequency_table_target(pcpu->policy, pcpu->freq_table, new_freq, CPUFREQ_RELATION_L, &index)) { Loading Loading @@ -653,6 +656,7 @@ static int cpufreq_interactive_speedchange_task(void *data) unsigned int j; unsigned int max_freq = 0; struct cpufreq_interactive_cpuinfo *pjcpu; u64 hvt; pcpu = &per_cpu(cpuinfo, cpu); if (!down_read_trylock(&pcpu->enable_sem)) Loading @@ -665,19 +669,21 @@ static int cpufreq_interactive_speedchange_task(void *data) for_each_cpu(j, pcpu->policy->cpus) { pjcpu = &per_cpu(cpuinfo, j); if (pjcpu->target_freq > max_freq) if (pjcpu->target_freq > max_freq) { max_freq = pjcpu->target_freq; hvt = pjcpu->local_hvtime; } else if (pjcpu->target_freq == max_freq) { hvt = min(hvt, pjcpu->local_hvtime); } } if (max_freq != pcpu->policy->cur) { u64 now; __cpufreq_driver_target(pcpu->policy, max_freq, CPUFREQ_RELATION_H); now = ktime_to_us(ktime_get()); for_each_cpu(j, pcpu->policy->cpus) { pjcpu = &per_cpu(cpuinfo, j); pjcpu->hispeed_validate_time = now; pjcpu->hispeed_validate_time = hvt; } } trace_cpufreq_interactive_setspeed(cpu, Loading Loading @@ -1634,6 +1640,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, ktime_to_us(ktime_get()); pcpu->hispeed_validate_time = pcpu->floor_validate_time; pcpu->local_hvtime = pcpu->floor_validate_time; pcpu->max_freq = policy->max; down_write(&pcpu->enable_sem); del_timer_sync(&pcpu->cpu_timer); Loading Loading
drivers/cpufreq/cpufreq_interactive.c +12 −5 Original line number Diff line number Diff line Loading @@ -52,7 +52,8 @@ struct cpufreq_interactive_cpuinfo { unsigned int floor_freq; unsigned int max_freq; u64 floor_validate_time; u64 hispeed_validate_time; u64 hispeed_validate_time; /* cluster hispeed_validate_time */ u64 local_hvtime; /* per-cpu hispeed_validate_time */ u64 max_freq_idle_start_time; struct rw_semaphore enable_sem; int governor_enabled; Loading Loading @@ -466,6 +467,8 @@ static void cpufreq_interactive_timer(unsigned long data) goto rearm; } pcpu->local_hvtime = now; if (cpufreq_frequency_table_target(pcpu->policy, pcpu->freq_table, new_freq, CPUFREQ_RELATION_L, &index)) { Loading Loading @@ -653,6 +656,7 @@ static int cpufreq_interactive_speedchange_task(void *data) unsigned int j; unsigned int max_freq = 0; struct cpufreq_interactive_cpuinfo *pjcpu; u64 hvt; pcpu = &per_cpu(cpuinfo, cpu); if (!down_read_trylock(&pcpu->enable_sem)) Loading @@ -665,19 +669,21 @@ static int cpufreq_interactive_speedchange_task(void *data) for_each_cpu(j, pcpu->policy->cpus) { pjcpu = &per_cpu(cpuinfo, j); if (pjcpu->target_freq > max_freq) if (pjcpu->target_freq > max_freq) { max_freq = pjcpu->target_freq; hvt = pjcpu->local_hvtime; } else if (pjcpu->target_freq == max_freq) { hvt = min(hvt, pjcpu->local_hvtime); } } if (max_freq != pcpu->policy->cur) { u64 now; __cpufreq_driver_target(pcpu->policy, max_freq, CPUFREQ_RELATION_H); now = ktime_to_us(ktime_get()); for_each_cpu(j, pcpu->policy->cpus) { pjcpu = &per_cpu(cpuinfo, j); pjcpu->hispeed_validate_time = now; pjcpu->hispeed_validate_time = hvt; } } trace_cpufreq_interactive_setspeed(cpu, Loading Loading @@ -1634,6 +1640,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, ktime_to_us(ktime_get()); pcpu->hispeed_validate_time = pcpu->floor_validate_time; pcpu->local_hvtime = pcpu->floor_validate_time; pcpu->max_freq = policy->max; down_write(&pcpu->enable_sem); del_timer_sync(&pcpu->cpu_timer); Loading