2010-11-05 03:05:26

by Youquan Song

[permalink] [raw]
Subject: [PATCH] cpufreq: Fix ondemand governor powersave_bias execution time misuse

Ondemand governor use powersave_bias tunable to do aggressive power save by
decrease CPU average frequency. The average frequency achieve by adjust low and
high frequency's execution time proportion during one sample time interval.

Current kernel, only the high frequency executes in time proportion, but the low
frequency wrongly execute in one whole sample time interval when powersave_bias
is set.

The patch fix it by set low frequency execution time to it deserved.

Signed-off-by: Youquan Song <[email protected]>
---

diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index c631f27..01d84fa 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -666,6 +666,8 @@ static void do_dbs_timer(struct work_struct *work)
} else {
__cpufreq_driver_target(dbs_info->cur_policy,
dbs_info->freq_lo, CPUFREQ_RELATION_H);
+ if (dbs_info->sample_type == DBS_SUB_SAMPLE)
+ delay = dbs_info->freq_lo_jiffies;
}
queue_delayed_work_on(cpu, kondemand_wq, &dbs_info->work, delay);
mutex_unlock(&dbs_info->timer_mutex);


2010-11-05 11:49:08

by Arjan van de Ven

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix ondemand governor powersave_bias execution time misuse

On 11/5/2010 11:19 AM, Youquan Song wrote:
> Ondemand governor use powersave_bias tunable to do aggressive power save by
> decrease CPU average frequency. The average frequency achieve by adjust low and
> high frequency's execution time proportion during one sample time interval.
>
> Current kernel, only the high frequency executes in time proportion, but the low
> frequency wrongly execute in one whole sample time interval when powersave_bias
> is set.
>
> The patch fix it by set low frequency execution time to it deserved.
>
> Signed-off-by: Youquan Song<[email protected]>
> ---


while your patch looks correct, I think the whole feature is wonky and
likely ought to be removed...........

2010-11-08 02:31:40

by Youquan Song

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix ondemand governor powersave_bias execution time misuse

> On 11/5/2010 11:19 AM, Youquan Song wrote:
>> Ondemand governor use powersave_bias tunable to do aggressive power save by
>> decrease CPU average frequency. The average frequency achieve by adjust low and
>> high frequency's execution time proportion during one sample time interval.
>>
>> Current kernel, only the high frequency executes in time proportion, but the low
>> frequency wrongly execute in one whole sample time interval when powersave_bias
>> is set.
>>
>> The patch fix it by set low frequency execution time to it deserved.
>>
>> Signed-off-by: Youquan Song<[email protected]>
>> ---
>
>
> while your patch looks correct, I think the whole feature is wonky and
> likely ought to be removed...........

powersave_bias should be a useful feature, which give user an
opportunity to set the CPU to work at wider average frequency accord to real
workload requirement, not just CPU frequency specific at P0,P1,...Pn.
At the same time, it meets end user power comsumpation requirement in
some degree.
Unfortunately, it does not work for a long time.

Thanks
-Youquan

2010-11-08 04:32:45

by Arjan van de Ven

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix ondemand governor powersave_bias execution time misuse

On 11/8/2010 6:45 AM, Youquan Song wrote:
>> On 11/5/2010 11:19 AM, Youquan Song wrote:
>>> Ondemand governor use powersave_bias tunable to do aggressive power save by
>>> decrease CPU average frequency. The average frequency achieve by adjust low and
>>> high frequency's execution time proportion during one sample time interval.
>>>
>>> Current kernel, only the high frequency executes in time proportion, but the low
>>> frequency wrongly execute in one whole sample time interval when powersave_bias
>>> is set.
>>>
>>> The patch fix it by set low frequency execution time to it deserved.
>>>
>>> Signed-off-by: Youquan Song<[email protected]>
>>> ---
>>
>> while your patch looks correct, I think the whole feature is wonky and
>> likely ought to be removed...........
> powersave_bias should be a useful feature, which give user an
> opportunity to set the CPU to work at wider average frequency accord to real
> workload requirement, not just CPU frequency specific at P0,P1,...Pn.
> At the same time, it meets end user power comsumpation requirement in
> some degree.
> Unfortunately, it does not work for a long time.

in all measurements I've done... the intermediate states (between P1 and
Pn) seem to not be power efficient.....

2011-03-02 01:07:58

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix ondemand governor powersave_bias execution time misuse

On Fri, 5 Nov 2010 11:19:51 -0400
Youquan Song <[email protected]> wrote:

> Ondemand governor use powersave_bias tunable to do aggressive power save by
> decrease CPU average frequency. The average frequency achieve by adjust low and
> high frequency's execution time proportion during one sample time interval.
>
> Current kernel, only the high frequency executes in time proportion, but the low
> frequency wrongly execute in one whole sample time interval when powersave_bias
> is set.
>
> The patch fix it by set low frequency execution time to it deserved.
>
> Signed-off-by: Youquan Song <[email protected]>
> ---
>
> diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
> index c631f27..01d84fa 100644
> --- a/drivers/cpufreq/cpufreq_ondemand.c
> +++ b/drivers/cpufreq/cpufreq_ondemand.c
> @@ -666,6 +666,8 @@ static void do_dbs_timer(struct work_struct *work)
> } else {
> __cpufreq_driver_target(dbs_info->cur_policy,
> dbs_info->freq_lo, CPUFREQ_RELATION_H);
> + if (dbs_info->sample_type == DBS_SUB_SAMPLE)
> + delay = dbs_info->freq_lo_jiffies;
> }
> queue_delayed_work_on(cpu, kondemand_wq, &dbs_info->work, delay);
> mutex_unlock(&dbs_info->timer_mutex);

Where are we with this patch? Still needed in curent mainline?

Thnks.

2011-03-02 05:44:13

by Youquan Song

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix ondemand governor powersave_bias execution time misuse


> Where are we with this patch? Still needed in curent mainline?
Do need it by current mainline. Without the patch, the ondemand
power_bias feature is broken and does not work at all.
Please take it.

Thanks
-Youquan

2011-03-02 16:01:14

by Dave Jones

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: Fix ondemand governor powersave_bias execution time misuse

On Wed, Mar 02, 2011 at 01:58:02PM -0500, Youquan Song wrote:
>
> > Where are we with this patch? Still needed in curent mainline?
> Do need it by current mainline. Without the patch, the ondemand
> power_bias feature is broken and does not work at all.
> Please take it.

This patch from Vincent Guittot is also pending, which seems to achieve
the same thing ?


commit 1f5a2969af7e0d040876c7ff25308c840eef18d4
Author: Vincent Guittot <[email protected]>
Date: Mon Feb 7 17:14:25 2011 +0100

[CPUFREQ] calculate delay after dbs_check_cpu

calculate ondemand delay after dbs_check_cpu call because it can
modify rate_mult value

use freq_lo_jiffies value for the sub sample period of powersave_bias mode

Signed-off-by: Vincent Guittot <[email protected]>
Signed-off-by: Dave Jones <[email protected]>

diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index c631f27..b4e1f98 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -644,12 +644,7 @@ static void do_dbs_timer(struct work_struct *work)
unsigned int cpu = dbs_info->cpu;
int sample_type = dbs_info->sample_type;

- /* We want all CPUs to do sampling nearly on same jiffy */
- int delay = usecs_to_jiffies(dbs_tuners_ins.sampling_rate
- * dbs_info->rate_mult);
-
- if (num_online_cpus() > 1)
- delay -= jiffies % delay;
+ int delay;

mutex_lock(&dbs_info->timer_mutex);

@@ -662,10 +657,20 @@ static void do_dbs_timer(struct work_struct *work)
/* Setup timer for SUB_SAMPLE */
dbs_info->sample_type = DBS_SUB_SAMPLE;
delay = dbs_info->freq_hi_jiffies;
+ } else {
+ /* We want all CPUs to do sampling nearly on
+ * same jiffy
+ */
+ delay = usecs_to_jiffies(dbs_tuners_ins.sampling_rate
+ * dbs_info->rate_mult);
+
+ if (num_online_cpus() > 1)
+ delay -= jiffies % delay;
}
} else {
__cpufreq_driver_target(dbs_info->cur_policy,
dbs_info->freq_lo, CPUFREQ_RELATION_H);
+ delay = dbs_info->freq_lo_jiffies;
}
queue_delayed_work_on(cpu, kondemand_wq, &dbs_info->work, delay);
mutex_unlock(&dbs_info->timer_mutex);