]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/cpufreq/cpufreq_ondemand.c
cpufreq: governors: Avoid unnecessary per cpu timer interrupts
[karo-tx-linux.git] / drivers / cpufreq / cpufreq_ondemand.c
index c90d345c636aecf0a8257cfbb82514dbe5d05936..459f9ee39c74101fdae9291fed66d121ec41fa23 100644 (file)
@@ -216,7 +216,6 @@ static void od_check_cpu(int cpu, unsigned int load_freq)
 
 static void od_dbs_timer(struct work_struct *work)
 {
-       struct delayed_work *dw = to_delayed_work(work);
        struct od_cpu_dbs_info_s *dbs_info =
                container_of(work, struct od_cpu_dbs_info_s, cdbs.work.work);
        unsigned int cpu = dbs_info->cdbs.cur_policy->cpu;
@@ -225,10 +224,13 @@ static void od_dbs_timer(struct work_struct *work)
        struct dbs_data *dbs_data = dbs_info->cdbs.cur_policy->governor_data;
        struct od_dbs_tuners *od_tuners = dbs_data->tuners;
        int delay = 0, sample_type = core_dbs_info->sample_type;
+       bool modify_all = true;
 
        mutex_lock(&core_dbs_info->cdbs.timer_mutex);
-       if (!need_load_eval(&core_dbs_info->cdbs, od_tuners->sampling_rate))
+       if (!need_load_eval(&core_dbs_info->cdbs, od_tuners->sampling_rate)) {
+               modify_all = false;
                goto max_delay;
+       }
 
        /* Common NORMAL_SAMPLE setup */
        core_dbs_info->sample_type = OD_NORMAL_SAMPLE;
@@ -250,7 +252,7 @@ max_delay:
                delay = delay_for_sampling_rate(od_tuners->sampling_rate
                                * core_dbs_info->rate_mult);
 
-       schedule_delayed_work_on(smp_processor_id(), dw, delay);
+       gov_queue_work(dbs_data, dbs_info->cdbs.cur_policy, delay, modify_all);
        mutex_unlock(&core_dbs_info->cdbs.timer_mutex);
 }
 
@@ -310,8 +312,8 @@ static void update_sampling_rate(struct dbs_data *dbs_data,
                        cancel_delayed_work_sync(&dbs_info->cdbs.work);
                        mutex_lock(&dbs_info->cdbs.timer_mutex);
 
-                       schedule_delayed_work_on(cpu, &dbs_info->cdbs.work,
-                                       usecs_to_jiffies(new_rate));
+                       gov_queue_work(dbs_data, dbs_info->cdbs.cur_policy,
+                                       usecs_to_jiffies(new_rate), true);
 
                }
                mutex_unlock(&dbs_info->cdbs.timer_mutex);