cpufreq: interactive: Rearm governor timer at max freq
[firefly-linux-kernel-4.4.55.git] / drivers / cpufreq / cpufreq_interactive.c
index 52c551d584770118423e85dd0fe9a4cd5a56edf1..a20ab2e635bf04a9a8d0f7a982f1df84492269c0 100644 (file)
@@ -47,7 +47,6 @@ struct cpufreq_interactive_cpuinfo {
        spinlock_t target_freq_lock; /*protects target freq */
        unsigned int target_freq;
        unsigned int floor_freq;
-       unsigned int max_freq;
        u64 pol_floor_val_time; /* policy floor_validate_time */
        u64 loc_floor_val_time; /* per-cpu floor_validate_time */
        u64 pol_hispeed_val_time; /* policy hispeed_validate_time */
@@ -444,7 +443,7 @@ static void cpufreq_interactive_timer(unsigned long data)
                        data, cpu_load, pcpu->target_freq,
                        pcpu->policy->cur, new_freq);
                spin_unlock_irqrestore(&pcpu->target_freq_lock, flags);
-               goto rearm_if_notmax;
+               goto rearm;
        }
 
        trace_cpufreq_interactive_target(data, cpu_load, pcpu->target_freq,
@@ -457,14 +456,6 @@ static void cpufreq_interactive_timer(unsigned long data)
        spin_unlock_irqrestore(&speedchange_cpumask_lock, flags);
        wake_up_process(speedchange_task);
 
-rearm_if_notmax:
-       /*
-        * Already set max speed and don't see a need to change that,
-        * wait until next idle to re-evaluate, don't need timer.
-        */
-       if (pcpu->target_freq == pcpu->policy->max)
-               goto exit;
-
 rearm:
        if (!timer_pending(&pcpu->cpu_timer))
                cpufreq_interactive_timer_resched(pcpu);
@@ -474,37 +465,6 @@ exit:
        return;
 }
 
-static void cpufreq_interactive_idle_start(void)
-{
-       struct cpufreq_interactive_cpuinfo *pcpu =
-               &per_cpu(cpuinfo, smp_processor_id());
-       int pending;
-
-       if (!down_read_trylock(&pcpu->enable_sem))
-               return;
-       if (!pcpu->governor_enabled) {
-               up_read(&pcpu->enable_sem);
-               return;
-       }
-
-       pending = timer_pending(&pcpu->cpu_timer);
-
-       if (pcpu->target_freq != pcpu->policy->min) {
-               /*
-                * Entering idle while not at lowest speed.  On some
-                * platforms this can hold the other CPU(s) at that speed
-                * even though the CPU is idle. Set a timer to re-evaluate
-                * speed so this idle CPU doesn't hold the other CPUs above
-                * min indefinitely.  This should probably be a quirk of
-                * the CPUFreq driver.
-                */
-               if (!pending)
-                       cpufreq_interactive_timer_resched(pcpu);
-       }
-
-       up_read(&pcpu->enable_sem);
-}
-
 static void cpufreq_interactive_idle_end(void)
 {
        struct cpufreq_interactive_cpuinfo *pcpu =
@@ -1129,14 +1089,8 @@ static int cpufreq_interactive_idle_notifier(struct notifier_block *nb,
                                             unsigned long val,
                                             void *data)
 {
-       switch (val) {
-       case IDLE_START:
-               cpufreq_interactive_idle_start();
-               break;
-       case IDLE_END:
+       if (val == IDLE_END)
                cpufreq_interactive_idle_end();
-               break;
-       }
 
        return 0;
 }
@@ -1258,7 +1212,6 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
                        pcpu->loc_floor_val_time = pcpu->pol_floor_val_time;
                        pcpu->pol_hispeed_val_time = pcpu->pol_floor_val_time;
                        pcpu->loc_hispeed_val_time = pcpu->pol_floor_val_time;
-                       pcpu->max_freq = policy->max;
                        down_write(&pcpu->enable_sem);
                        del_timer_sync(&pcpu->cpu_timer);
                        del_timer_sync(&pcpu->cpu_slack_timer);
@@ -1308,23 +1261,6 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
 
                        spin_unlock_irqrestore(&pcpu->target_freq_lock, flags);
                        up_read(&pcpu->enable_sem);
-
-                       /* Reschedule timer only if policy->max is raised.
-                        * Delete the timers, else the timer callback may
-                        * return without re-arm the timer when failed
-                        * acquire the semaphore. This race may cause timer
-                        * stopped unexpectedly.
-                        */
-
-                       if (policy->max > pcpu->max_freq) {
-                               down_write(&pcpu->enable_sem);
-                               del_timer_sync(&pcpu->cpu_timer);
-                               del_timer_sync(&pcpu->cpu_slack_timer);
-                               cpufreq_interactive_timer_start(tunables, j);
-                               up_write(&pcpu->enable_sem);
-                       }
-
-                       pcpu->max_freq = policy->max;
                }
                break;
        }