Message ID | 51265BC6.8030601@semaphore.gr (mailing list archive) |
---|---|
State | Rejected, archived |
Headers | show |
On 21 February 2013 23:09, Stratos Karafotis <stratosk@semaphore.gr> wrote: > Thanks again. Following V3 with your suggestion. > > Regards, > Stratos > > -----------------------8<-------------------------------------------- > Instead of checking only the absolute value of CPU load_freq to increase > frequency, we detect forthcoming CPU load rise and increase frequency > earlier. > > Every sampling rate, we calculate the gradient of load_freq. If it is > too steep we assume that the load most probably will go over > up_threshold in next iteration(s) and we increase frequency immediately. > > New tuners are introduced: > - early_demand: to enable this functionality (disabled by default). > - grad_up_threshold: over this gradient of load we will increase > frequency immediately. > > Signed-off-by: Stratos Karafotis <stratosk@semaphore.gr> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, Feb 22, 2013 at 7:26 AM, Viresh Kumar <viresh.kumar@linaro.org> wrote: > On 21 February 2013 23:09, Stratos Karafotis <stratosk@semaphore.gr> wrote: >> Instead of checking only the absolute value of CPU load_freq to increase >> frequency, we detect forthcoming CPU load rise and increase frequency >> earlier. >> >> Every sampling rate, we calculate the gradient of load_freq. If it is >> too steep we assume that the load most probably will go over >> up_threshold in next iteration(s) and we increase frequency immediately. >> >> New tuners are introduced: >> - early_demand: to enable this functionality (disabled by default). >> - grad_up_threshold: over this gradient of load we will increase >> frequency immediately. >> >> Signed-off-by: Stratos Karafotis <stratosk@semaphore.gr> > > Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Rafael, I applied it here with my Ack over my patches, for getting a run by "kbuild test robot". http://git.linaro.org/gitweb?p=people/vireshk/linux.git;a=shortlog;h=refs/heads/cpufreq-for-3.10 -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Friday, February 22, 2013 11:27:09 AM Viresh Kumar wrote: > On Fri, Feb 22, 2013 at 7:26 AM, Viresh Kumar <viresh.kumar@linaro.org> wrote: > > On 21 February 2013 23:09, Stratos Karafotis <stratosk@semaphore.gr> wrote: > > >> Instead of checking only the absolute value of CPU load_freq to increase > >> frequency, we detect forthcoming CPU load rise and increase frequency > >> earlier. > >> > >> Every sampling rate, we calculate the gradient of load_freq. If it is > >> too steep we assume that the load most probably will go over > >> up_threshold in next iteration(s) and we increase frequency immediately. > >> > >> New tuners are introduced: > >> - early_demand: to enable this functionality (disabled by default). > >> - grad_up_threshold: over this gradient of load we will increase > >> frequency immediately. > >> > >> Signed-off-by: Stratos Karafotis <stratosk@semaphore.gr> > > > > Acked-by: Viresh Kumar <viresh.kumar@linaro.org> > > Rafael, > > I applied it here with my Ack over my patches, for getting a run by > "kbuild test robot". > > http://git.linaro.org/gitweb?p=people/vireshk/linux.git;a=shortlog;h=refs/heads/cpufreq-for-3.10 Thanks, but I'm still not entirely sure about the have_multiple_policies stuff (yes, I saw your arguments) and the v3.10 merge window is still two months away. IOW, please slow down a bit. Thanks, Rafael
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c index 7722505..e737aa9 100644 --- a/drivers/cpufreq/cpufreq_governor.c +++ b/drivers/cpufreq/cpufreq_governor.c @@ -322,6 +322,7 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy, } else { od_dbs_info->rate_mult = 1; od_dbs_info->sample_type = OD_NORMAL_SAMPLE; + od_dbs_info->prev_load_freq = 0; od_ops->powersave_bias_init_cpu(cpu); } diff --git a/drivers/cpufreq/cpufreq_governor.h b/drivers/cpufreq/cpufreq_governor.h index 6301790..3a703b9 100644 --- a/drivers/cpufreq/cpufreq_governor.h +++ b/drivers/cpufreq/cpufreq_governor.h @@ -96,6 +96,7 @@ struct od_cpu_dbs_info_s { unsigned int freq_hi_jiffies; unsigned int rate_mult; unsigned int sample_type:1; + unsigned int prev_load_freq; }; struct cs_cpu_dbs_info_s { @@ -114,6 +115,8 @@ struct od_dbs_tuners { unsigned int adj_up_threshold; unsigned int powersave_bias; unsigned int io_is_busy; + unsigned int grad_up_threshold; + unsigned int early_demand; }; struct cs_dbs_tuners { diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index c5fd794..fa4b21e 100644 --- a/drivers/cpufreq/cpufreq_ondemand.c +++ b/drivers/cpufreq/cpufreq_ondemand.c @@ -31,6 +31,7 @@ #define DEF_FREQUENCY_DOWN_DIFFERENTIAL (10) #define DEF_FREQUENCY_UP_THRESHOLD (80) #define DEF_SAMPLING_DOWN_FACTOR (1) +#define DEF_GRAD_UP_THRESHOLD (50) #define MAX_SAMPLING_DOWN_FACTOR (100000) #define MICRO_FREQUENCY_DOWN_DIFFERENTIAL (3) #define MICRO_FREQUENCY_UP_THRESHOLD (95) @@ -168,11 +169,26 @@ static void od_check_cpu(int cpu, unsigned int load_freq) struct cpufreq_policy *policy = dbs_info->cdbs.cur_policy; struct dbs_data *dbs_data = policy->governor_data; struct od_dbs_tuners *od_tuners = dbs_data->tuners; + int boost_freq = 0; dbs_info->freq_lo = 0; + /* + * Calculate the gradient of load_freq. If it is too steep we assume + * that the load will go over up_threshold in next iteration(s) and + * we increase the frequency immediately + */ + if (od_tuners->early_demand) { + if (load_freq > dbs_info->prev_load_freq && + (load_freq - dbs_info->prev_load_freq > + od_tuners->grad_up_threshold * policy->cur)) + boost_freq = 1; + + dbs_info->prev_load_freq = load_freq; + } + /* Check for frequency increase */ - if (load_freq > od_tuners->up_threshold * policy->cur) { + if (boost_freq || (load_freq > od_tuners->up_threshold * policy->cur)) { /* If switching to max speed, apply sampling_down_factor */ if (policy->cur < policy->max) dbs_info->rate_mult = @@ -445,12 +461,47 @@ static ssize_t store_powersave_bias(struct cpufreq_policy *policy, return count; } +static ssize_t store_grad_up_threshold(struct cpufreq_policy *policy, + const char *buf, size_t count) +{ + struct dbs_data *dbs_data = policy->governor_data; + struct od_dbs_tuners *od_tuners = dbs_data->tuners; + unsigned int input; + int ret; + ret = sscanf(buf, "%u", &input); + + if (ret != 1 || input > MAX_FREQUENCY_UP_THRESHOLD || + input < MIN_FREQUENCY_UP_THRESHOLD) { + return -EINVAL; + } + + od_tuners->grad_up_threshold = input; + return count; +} + +static ssize_t store_early_demand(struct cpufreq_policy *policy, + const char *buf, size_t count) +{ + struct dbs_data *dbs_data = policy->governor_data; + struct od_dbs_tuners *od_tuners = dbs_data->tuners; + unsigned int input; + int ret; + + ret = sscanf(buf, "%u", &input); + if (ret != 1) + return -EINVAL; + od_tuners->early_demand = !!input; + return count; +} + show_one(od, sampling_rate, sampling_rate); show_one(od, io_is_busy, io_is_busy); show_one(od, up_threshold, up_threshold); show_one(od, sampling_down_factor, sampling_down_factor); show_one(od, ignore_nice, ignore_nice); show_one(od, powersave_bias, powersave_bias); +show_one(od, grad_up_threshold, grad_up_threshold); +show_one(od, early_demand, early_demand); declare_show_sampling_rate_min(); cpufreq_freq_attr_rw(sampling_rate); @@ -459,6 +510,8 @@ cpufreq_freq_attr_rw(up_threshold); cpufreq_freq_attr_rw(sampling_down_factor); cpufreq_freq_attr_rw(ignore_nice); cpufreq_freq_attr_rw(powersave_bias); +cpufreq_freq_attr_rw(grad_up_threshold); +cpufreq_freq_attr_rw(early_demand); cpufreq_freq_attr_ro(sampling_rate_min); static struct attribute *dbs_attributes[] = { @@ -469,6 +522,8 @@ static struct attribute *dbs_attributes[] = { &ignore_nice.attr, &powersave_bias.attr, &io_is_busy.attr, + &grad_up_threshold.attr, + &early_demand.attr, NULL }; @@ -516,9 +571,11 @@ static int od_init(struct dbs_data *dbs_data) } tuners->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR; + tuners->grad_up_threshold = DEF_GRAD_UP_THRESHOLD; tuners->ignore_nice = 0; tuners->powersave_bias = 0; tuners->io_is_busy = should_io_be_busy(); + tuners->early_demand = 0; dbs_data->tuners = tuners; mutex_init(&dbs_data->mutex);