lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <56FE26EB.7090608@linux.intel.com>
Date:	Fri, 1 Apr 2016 09:44:43 +0200
From:	Philippe Longepe <philippe.longepe@...ux.intel.com>
To:	"Rafael J. Wysocki" <rjw@...ysocki.net>,
	Linux PM list <linux-pm@...r.kernel.org>,
	Srinivas Pandruvada <srinivas.pandruvada@...ux.intel.com>
Cc:	Linux Kernel Mailing List <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH] intel_pstate: Avoid pointless FRAC_BITS shifts under
 div_fp()

I proposed also to simplify the intel_pstate_calc_busy function:

     core_pct = int_tofp(sample->aperf) * int_tofp(100);
     core_pct = div64_u64(core_pct, int_tofp(sample->mperf));

is equivalent to:

     core_pct = sample->aperf * int_tofp(100);
     core_pct = div64_u64(core_pct, sample->mperf);

Regards,
Philippe,

On 31/03/2016 15:46, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@...el.com>
>
> There are multiple places in intel_pstate where int_tofp() is applied
> to both arguments of div_fp(), but this is pointless, because int_tofp()
> simply shifts its argument to the left by FRAC_BITS which mathematically
> is equivalent to multuplication by 2^FRAC_BITS, so if this is done
> to both arguments of a division, the extra factors will cancel each
> other during that operation anyway.
>
> Drop the pointless int_tofp() applied to div_fp() arguments throughout
> the driver.
>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@...el.com>
> ---
>   drivers/cpufreq/intel_pstate.c |   27 +++++++++++----------------
>   1 file changed, 11 insertions(+), 16 deletions(-)
>
> Index: linux-pm/drivers/cpufreq/intel_pstate.c
> ===================================================================
> --- linux-pm.orig/drivers/cpufreq/intel_pstate.c
> +++ linux-pm/drivers/cpufreq/intel_pstate.c
> @@ -206,17 +206,17 @@ static inline void pid_reset(struct _pid
>   
>   static inline void pid_p_gain_set(struct _pid *pid, int percent)
>   {
> -	pid->p_gain = div_fp(int_tofp(percent), int_tofp(100));
> +	pid->p_gain = div_fp(percent, 100);
>   }
>   
>   static inline void pid_i_gain_set(struct _pid *pid, int percent)
>   {
> -	pid->i_gain = div_fp(int_tofp(percent), int_tofp(100));
> +	pid->i_gain = div_fp(percent, 100);
>   }
>   
>   static inline void pid_d_gain_set(struct _pid *pid, int percent)
>   {
> -	pid->d_gain = div_fp(int_tofp(percent), int_tofp(100));
> +	pid->d_gain = div_fp(percent, 100);
>   }
>   
>   static signed int pid_calc(struct _pid *pid, int32_t busy)
> @@ -394,7 +394,7 @@ static ssize_t show_turbo_pct(struct kob
>   
>   	total = cpu->pstate.turbo_pstate - cpu->pstate.min_pstate + 1;
>   	no_turbo = cpu->pstate.max_pstate - cpu->pstate.min_pstate + 1;
> -	turbo_fp = div_fp(int_tofp(no_turbo), int_tofp(total));
> +	turbo_fp = div_fp(no_turbo, total);
>   	turbo_pct = 100 - fp_toint(mul_fp(turbo_fp, int_tofp(100)));
>   	return sprintf(buf, "%u\n", turbo_pct);
>   }
> @@ -465,8 +465,7 @@ static ssize_t store_max_perf_pct(struct
>   				   limits->max_perf_pct);
>   	limits->max_perf_pct = max(limits->min_perf_pct,
>   				   limits->max_perf_pct);
> -	limits->max_perf = div_fp(int_tofp(limits->max_perf_pct),
> -				  int_tofp(100));
> +	limits->max_perf = div_fp(limits->max_perf_pct, 100);
>   
>   	if (hwp_active)
>   		intel_pstate_hwp_set_online_cpus();
> @@ -490,8 +489,7 @@ static ssize_t store_min_perf_pct(struct
>   				   limits->min_perf_pct);
>   	limits->min_perf_pct = min(limits->max_perf_pct,
>   				   limits->min_perf_pct);
> -	limits->min_perf = div_fp(int_tofp(limits->min_perf_pct),
> -				  int_tofp(100));
> +	limits->min_perf = div_fp(limits->min_perf_pct, 100);
>   
>   	if (hwp_active)
>   		intel_pstate_hwp_set_online_cpus();
> @@ -973,8 +971,8 @@ static inline int32_t get_target_pstate_
>   	 * specified pstate.
>   	 */
>   	core_busy = cpu->sample.core_pct_busy;
> -	max_pstate = int_tofp(cpu->pstate.max_pstate_physical);
> -	current_pstate = int_tofp(cpu->pstate.current_pstate);
> +	max_pstate = cpu->pstate.max_pstate_physical;
> +	current_pstate = cpu->pstate.current_pstate;
>   	core_busy = mul_fp(core_busy, div_fp(max_pstate, current_pstate));
>   
>   	/*
> @@ -986,8 +984,7 @@ static inline int32_t get_target_pstate_
>   	duration_ns = cpu->sample.time - cpu->last_sample_time;
>   	if ((s64)duration_ns > pid_params.sample_rate_ns * 3
>   	    && cpu->last_sample_time > 0) {
> -		sample_ratio = div_fp(int_tofp(pid_params.sample_rate_ns),
> -				      int_tofp(duration_ns));
> +		sample_ratio = div_fp(pid_params.sample_rate_ns, duration_ns);
>   		core_busy = mul_fp(core_busy, sample_ratio);
>   	}
>   
> @@ -1167,10 +1164,8 @@ static int intel_pstate_set_policy(struc
>   	/* Make sure min_perf_pct <= max_perf_pct */
>   	limits->min_perf_pct = min(limits->max_perf_pct, limits->min_perf_pct);
>   
> -	limits->min_perf = div_fp(int_tofp(limits->min_perf_pct),
> -				  int_tofp(100));
> -	limits->max_perf = div_fp(int_tofp(limits->max_perf_pct),
> -				  int_tofp(100));
> +	limits->min_perf = div_fp(limits->min_perf_pct, 100);
> +	limits->max_perf = div_fp(limits->max_perf_pct, 100);
>   
>    out:
>   	intel_pstate_set_update_util_hook(policy->cpu);
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
> the body of a message to majordomo@...r.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ