Re: The conservative governor ignores all but the last CPU when taking decisions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dominik,

Le 25/03/2010 18:44, Dominik Brodowski a écrit :
> From: Dominik Brodowski <linux@xxxxxxxxxxxxxxxxxxxx>
> Date: Thu, 25 Mar 2010 18:13:20 +0100
> Subject: [PATCH] cpufreq: use average load in conservative governor
> 
> Instead of using the load of the last CPU in a package, use the
> average of all CPUs in a package.

Don't we want to check the max load rather than the average, for a user
running a single threaded job wants the CPU to jump to max speed?

> 
> Reported-by: Jean-Christian Goussard <jeanchristian.goussard@xxxxxx>
> Signed-off-by: Dominik Brodowski <linux@xxxxxxxxxxxxxxxxxxxx>
> 
> diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
> index 599a40b..e0be6bd 100644
> --- a/drivers/cpufreq/cpufreq_conservative.c
> +++ b/drivers/cpufreq/cpufreq_conservative.c
> @@ -444,6 +444,7 @@ static struct attribute_group dbs_attr_group_old = {
>  static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
>  {
>  	unsigned int load = 0;
> +	unsigned int max_load = 0;
>  	unsigned int freq_target;
>  
>  	struct cpufreq_policy *policy;
> @@ -500,8 +501,9 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
>  		if (unlikely(!wall_time || wall_time < idle_time))
>  			continue;
>  
> -		load = 100 * (wall_time - idle_time) / wall_time;
> +		load += 100 * (wall_time - idle_time) / wall_time;
>  	}
> +	load = load / cpumask_weight(policy->cpus);
>  
>  	/*
>  	 * break out if we 'cannot' reduce the speed as the user might
> @@ -511,7 +513,7 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
>  		return;
>  
>  	/* Check for frequency increase */
> -	if (load > dbs_tuners_ins.up_threshold) {
> +	if (max_load > dbs_tuners_ins.up_threshold) {

max_load is still 0 here.
"load" now holds the average load but as I said, I think the max load should
be used:
-		load = 100 * (wall_time - idle_time) / wall_time;
+		if (load > max_load)
+			max_load = load;
	}

>  		this_dbs_info->down_skip = 0;
>  
>  		/* if we are already at full speed then break out early */
> @@ -538,7 +540,7 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
>  	 * can support the current CPU usage without triggering the up
>  	 * policy. To be safe, we focus 10 points under the threshold.
>  	 */
> -	if (load < (dbs_tuners_ins.down_threshold - 10)) {
> +	if (max_load < (dbs_tuners_ins.down_threshold - 10)) {
>  		freq_target = (dbs_tuners_ins.freq_step * policy->max) / 100;
>  
>  		this_dbs_info->requested_freq -= freq_target;
> 

Jean-Christian

--
To unsubscribe from this list: send the line "unsubscribe cpufreq" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Devel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Forum]     [Linux SCSI]

  Powered by Linux