From: Francesco Lavra <francescolavra.fl@gmail.com>
To: Viresh Kumar <viresh.kumar@linaro.org>,
Rafael Wysocki <rjw@rjwysocki.net>
Cc: linaro-kernel@lists.linaro.org, linux-kernel@vger.kernel.org,
linux-pm@vger.kernel.org
Subject: Re: [PATCH V5 1/2] cpufreq: Handle sorted frequency tables more efficiently
Date: Mon, 27 Jun 2016 12:10:52 +0200 [thread overview]
Message-ID: <5770FBAC.3040901@gmail.com> (raw)
In-Reply-To: <594b312d352b55f44d5ebea954fdf784e966867e.1467001203.git.viresh.kumar@linaro.org>
Hi,
On 06/27/2016 06:29 AM, Viresh Kumar wrote:
> cpufreq drivers aren't required to provide a sorted frequency table
> today, and even the ones which provide a sorted table aren't handled
> efficiently by cpufreq core.
>
> This patch adds infrastructure to verify if the freq-table provided by
> the drivers is sorted or not, and use efficient helpers if they are
> sorted.
<snip>
> @@ -610,6 +617,227 @@ int cpufreq_boost_trigger_state(int state);
> int cpufreq_boost_enabled(void);
> int cpufreq_enable_boost_support(void);
> bool policy_has_boost_freq(struct cpufreq_policy *policy);
> +
> +/* Find lowest freq at or above target in a table in ascending order */
> +static inline int cpufreq_table_find_index_al(struct cpufreq_policy *policy,
> + unsigned int target_freq)
> +{
> + struct cpufreq_frequency_table *table = policy->freq_table;
> + unsigned int freq;
> + int i, best = -1;
> +
> + for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
> + freq = table[i].frequency;
> +
> + if (freq >= target_freq)
> + return i;
> +
> + best = i;
> + }
> +
> + return best;
> +}
> +
> +/* Find lowest freq at or above target in a table in descending order */
> +static inline int cpufreq_table_find_index_dl(struct cpufreq_policy *policy,
> + unsigned int target_freq)
> +{
> + struct cpufreq_frequency_table *table = policy->freq_table;
> + unsigned int freq;
> + int i, best = -1;
> +
> + for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
> + freq = table[i].frequency;
> +
> + if (freq == target_freq)
> + return i;
> +
> + if (freq > target_freq) {
> + best = i;
> + continue;
> + }
> +
> + /* No freq found below target_freq */
"below" should be "above"
> +/* Find closest freq to target in a table in ascending order */
> +static inline int cpufreq_table_find_index_ac(struct cpufreq_policy *policy,
> + unsigned int target_freq)
> +{
> + struct cpufreq_frequency_table *table = policy->freq_table;
> + unsigned int freq;
> + int i, best = -1;
> +
> + for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
> + freq = table[i].frequency;
> +
> + if (freq == target_freq)
> + return i;
> +
> + if (freq < target_freq) {
> + best = i;
> + continue;
> + }
> +
> + /* No freq found below target_freq */
> + if (best == -1)
> + return i;
> +
> + /* Choose the closest freq */
> + if (target_freq - table[best].frequency > freq - target_freq)
> + return i;
> +
> + return best;
> + }
> +
> + return best;
> +}
> +
> +/* Find closest freq to target in a table in descending order */
> +static inline int cpufreq_table_find_index_dc(struct cpufreq_policy *policy,
> + unsigned int target_freq)
> +{
> + struct cpufreq_frequency_table *table = policy->freq_table;
> + unsigned int freq;
> + int i, best = -1;
> +
> + for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
> + freq = table[i].frequency;
> +
> + if (freq == target_freq)
> + return i;
> +
> + if (freq > target_freq) {
> + best = i;
> + continue;
> + }
> +
> + /* No freq found below target_freq */
"below" should be "above"
> + if (best == -1)
> + return i;
> +
> + /* Choose the closest freq */
> + if (target_freq - table[best].frequency > freq - target_freq)
Here, table[best].frequency > target_freq, and freq < and target_freq,
so you should reverse the sign of both sides of the inequation:
if (table[best].frequency - target_freq > target_freq - freq)
> + return i;
> +
> + return best;
> + }
> +
> + return best;
> +}
Regards,
Francesco
next prev parent reply other threads:[~2016-06-27 10:11 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-27 4:29 [PATCH V5 0/2] cpufreq: Sorted policy->freq_table Viresh Kumar
2016-06-27 4:29 ` [PATCH V5 1/2] cpufreq: Handle sorted frequency tables more efficiently Viresh Kumar
2016-06-27 10:10 ` Francesco Lavra [this message]
2016-06-27 10:34 ` [PATCH V6 " Viresh Kumar
2016-07-07 13:29 ` Rafael J. Wysocki
2016-06-27 4:29 ` [PATCH V5 2/2] cpufreq: Reuse new freq-table helpers Viresh Kumar
2016-07-07 13:29 ` Rafael J. Wysocki
2016-07-07 15:36 ` [PATCH V5 0/2] cpufreq: Sorted policy->freq_table Viresh Kumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5770FBAC.3040901@gmail.com \
--to=francescolavra.fl@gmail.com \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=viresh.kumar@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.