Revert "cpufreq: interactive: resched timer if max freq raised"
Puneet Saxena [Thu, 22 Aug 2013 13:00:13 +0000 (18:00 +0530)]
Browser P0 Benchmarks such as Sunspider, Panning
are regressed drastically by switching to new interactive
governor.
The score didn’t meet with the score achieved via older governor
though tweaked new governor knobs extremely.
Hence reverting new governor and bugfixes on it.

This reverts commit ba483d38dd783c45118cf66dcd9a23008d68571c.

Bug 1352880

Change-Id: I92500a1d7bfd88867eda1fd4cada51dcf9eb103a
Signed-off-by: Puneet Saxena <puneets@nvidia.com>
Reviewed-on: http://git-master/r/264900
Reviewed-by: Riham Haidar <rhaidar@nvidia.com>
Tested-by: Riham Haidar <rhaidar@nvidia.com>

drivers/cpufreq/cpufreq_interactive.c

index b15d53c..8fa1d43 100644 (file)
@@ -189,32 +189,6 @@ static void cpufreq_interactive_timer_resched(
        spin_unlock_irqrestore(&pcpu->load_lock, flags);
 }
 
-/* The caller shall take enable_sem write semaphore to avoid any timer race.
- * The cpu_timer and cpu_slack_timer must be deactivated when calling this
- * function.
- */
-static void cpufreq_interactive_timer_start(int cpu)
-{
-       struct cpufreq_interactive_cpuinfo *pcpu = &per_cpu(cpuinfo, cpu);
-       unsigned long expires = jiffies + usecs_to_jiffies(timer_rate);
-       unsigned long flags;
-
-       pcpu->cpu_timer.expires = expires;
-       add_timer_on(&pcpu->cpu_timer, cpu);
-       if (timer_slack_val >= 0 && pcpu->target_freq > pcpu->policy->min) {
-               expires += usecs_to_jiffies(timer_slack_val);
-               pcpu->cpu_slack_timer.expires = expires;
-               add_timer_on(&pcpu->cpu_slack_timer, cpu);
-       }
-
-       spin_lock_irqsave(&pcpu->load_lock, flags);
-       pcpu->time_in_idle =
-               get_cpu_idle_time(cpu, &pcpu->time_in_idle_timestamp);
-       pcpu->cputime_speedadj = 0;
-       pcpu->cputime_speedadj_timestamp = pcpu->time_in_idle_timestamp;
-       spin_unlock_irqrestore(&pcpu->load_lock, flags);
-}
-
 static unsigned int freq_to_above_hispeed_delay(unsigned int freq)
 {
        int i;
@@ -1089,6 +1063,8 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
                        hispeed_freq = policy->max;
 
                for_each_cpu(j, policy->cpus) {
+                       unsigned long expires;
+
                        pcpu = &per_cpu(cpuinfo, j);
                        pcpu->policy = policy;
                        pcpu->target_freq = policy->cur;
@@ -1099,7 +1075,14 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
                        pcpu->hispeed_validate_time =
                                pcpu->floor_validate_time;
                        down_write(&pcpu->enable_sem);
-                       cpufreq_interactive_timer_start(j);
+                       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);
                }
@@ -1158,33 +1141,6 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
                else if (policy->min > policy->cur)
                        __cpufreq_driver_target(policy,
                                        policy->min, CPUFREQ_RELATION_L);
-               for_each_cpu(j, policy->cpus) {
-                       pcpu = &per_cpu(cpuinfo, j);
-
-                       /* hold write semaphore to avoid race */
-                       down_write(&pcpu->enable_sem);
-                       if (pcpu->governor_enabled == 0) {
-                               up_write(&pcpu->enable_sem);
-                               continue;
-                       }
-
-                       /* update target_freq firstly */
-                       if (policy->max < pcpu->target_freq)
-                               pcpu->target_freq = policy->max;
-                       else if (policy->min > pcpu->target_freq)
-                               pcpu->target_freq = policy->min;
-
-                       /* Reschedule timer.
-                        * 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.
-                        */
-                       del_timer_sync(&pcpu->cpu_timer);
-                       del_timer_sync(&pcpu->cpu_slack_timer);
-                       cpufreq_interactive_timer_start(j);
-                       up_write(&pcpu->enable_sem);
-               }
                break;
        }
        return 0;