All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eduardo Valentin <eduardo.valentin@ti.com>
To: Andrew Bresticker <abrestic@chromium.org>
Cc: Zhang Rui <rui.zhang@intel.com>,
	linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
	eduardo.valentin@ti.com
Subject: Re: [PATCH] thermal: fix frequency table lookup bugs
Date: Tue, 9 Apr 2013 10:55:17 -0400	[thread overview]
Message-ID: <51642BD5.4030803@ti.com> (raw)
In-Reply-To: <1365465287-24530-1-git-send-email-abrestic@chromium.org>

Hi Andrew,

On 08-04-2013 19:54, Andrew Bresticker wrote:
> The loops which are used to perform lookups in CPU frequency tables in
> cpu_cooling and the Exynos thermal driver do not update the loop counter
> if they encounter an invalid table entry, leading to an infinite loop in
> that case.
>
> Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
> ---
>   drivers/thermal/cpu_cooling.c    | 19 ++++++++++---------
>   drivers/thermal/exynos_thermal.c |  8 ++++----
>   2 files changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
> index 836828e..e6db441 100644
> --- a/drivers/thermal/cpu_cooling.c
> +++ b/drivers/thermal/cpu_cooling.c
> @@ -124,14 +124,14 @@ static int is_cpufreq_valid(int cpu)
>   static unsigned int get_cpu_frequency(unsigned int cpu, unsigned long level)
>   {
>   	int ret = 0, i = 0;
> -	unsigned long level_index;
> +	unsigned long level_index = 0;
>   	bool descend = false;
>   	struct cpufreq_frequency_table *table =
>   					cpufreq_frequency_get_table(cpu);
>   	if (!table)
>   		return ret;
>
> -	while (table[i].frequency != CPUFREQ_TABLE_END) {
> +	for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
>   		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
>   			continue;
Wouldn't be easier to just increase the index i before doing a continue?

>
> @@ -143,24 +143,25 @@ static unsigned int get_cpu_frequency(unsigned int cpu, unsigned long level)
>   		}
>
>   		/*return if level matched and table in descending order*/
> -		if (descend && i == level)
> +		if (descend && level_index == level)
>   			return table[i].frequency;

What this has to do with the patch description? Besides why would you be 
comparing level against 0 all the time (you have initialized level_index 
to 0 at this point).

> -		i++;
> +		level_index++;

level_index wont be updated in case of INVALID entry.

>   	}
>   	i--;
> +	level_index--;
>
> -	if (level > i || descend)
> +	if (level > level_index || descend)
>   		return ret;
> -	level_index = i - level;
> +	level = level_index - level;
>
>   	/*Scan the table in reverse order and match the level*/
> -	while (i >= 0) {
> +	for (; i >= 0; i--) {
>   		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
>   			continue;
>   		/*return if level matched*/
> -		if (i == level_index)
> +		if (level_index == level)
>   			return table[i].frequency;
> -		i--;
> +		level_index--;
>   	}

I believe you do more than what you have described in your intention 
under you patch description

Can you please split your patch into smaller changes?
>   	return ret;
>   }
> diff --git a/drivers/thermal/exynos_thermal.c b/drivers/thermal/exynos_thermal.c
> index d5e6267..524b2a0 100644
> --- a/drivers/thermal/exynos_thermal.c
> +++ b/drivers/thermal/exynos_thermal.c
> @@ -237,7 +237,7 @@ static int exynos_get_crit_temp(struct thermal_zone_device *thermal,
>
>   static int exynos_get_frequency_level(unsigned int cpu, unsigned int freq)
>   {
> -	int i = 0, ret = -EINVAL;
> +	int i, level = 0, ret = -EINVAL;
>   	struct cpufreq_frequency_table *table = NULL;
>   #ifdef CONFIG_CPU_FREQ
>   	table = cpufreq_frequency_get_table(cpu);
> @@ -245,12 +245,12 @@ static int exynos_get_frequency_level(unsigned int cpu, unsigned int freq)
>   	if (!table)
>   		return ret;
>
> -	while (table[i].frequency != CPUFREQ_TABLE_END) {
> +	for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
>   		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
>   			continue;
>   		if (table[i].frequency == freq)
> -			return i;
> -		i++;
> +			return level;
> +		level++;

Can you please send a separate patch on this driver instead?



>   	}
>   	return ret;
>   }
>


WARNING: multiple messages have this Message-ID (diff)
From: Eduardo Valentin <eduardo.valentin@ti.com>
To: Andrew Bresticker <abrestic@chromium.org>
Cc: Zhang Rui <rui.zhang@intel.com>, <linux-pm@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <eduardo.valentin@ti.com>
Subject: Re: [PATCH] thermal: fix frequency table lookup bugs
Date: Tue, 9 Apr 2013 10:55:17 -0400	[thread overview]
Message-ID: <51642BD5.4030803@ti.com> (raw)
In-Reply-To: <1365465287-24530-1-git-send-email-abrestic@chromium.org>

Hi Andrew,

On 08-04-2013 19:54, Andrew Bresticker wrote:
> The loops which are used to perform lookups in CPU frequency tables in
> cpu_cooling and the Exynos thermal driver do not update the loop counter
> if they encounter an invalid table entry, leading to an infinite loop in
> that case.
>
> Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
> ---
>   drivers/thermal/cpu_cooling.c    | 19 ++++++++++---------
>   drivers/thermal/exynos_thermal.c |  8 ++++----
>   2 files changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
> index 836828e..e6db441 100644
> --- a/drivers/thermal/cpu_cooling.c
> +++ b/drivers/thermal/cpu_cooling.c
> @@ -124,14 +124,14 @@ static int is_cpufreq_valid(int cpu)
>   static unsigned int get_cpu_frequency(unsigned int cpu, unsigned long level)
>   {
>   	int ret = 0, i = 0;
> -	unsigned long level_index;
> +	unsigned long level_index = 0;
>   	bool descend = false;
>   	struct cpufreq_frequency_table *table =
>   					cpufreq_frequency_get_table(cpu);
>   	if (!table)
>   		return ret;
>
> -	while (table[i].frequency != CPUFREQ_TABLE_END) {
> +	for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
>   		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
>   			continue;
Wouldn't be easier to just increase the index i before doing a continue?

>
> @@ -143,24 +143,25 @@ static unsigned int get_cpu_frequency(unsigned int cpu, unsigned long level)
>   		}
>
>   		/*return if level matched and table in descending order*/
> -		if (descend && i == level)
> +		if (descend && level_index == level)
>   			return table[i].frequency;

What this has to do with the patch description? Besides why would you be 
comparing level against 0 all the time (you have initialized level_index 
to 0 at this point).

> -		i++;
> +		level_index++;

level_index wont be updated in case of INVALID entry.

>   	}
>   	i--;
> +	level_index--;
>
> -	if (level > i || descend)
> +	if (level > level_index || descend)
>   		return ret;
> -	level_index = i - level;
> +	level = level_index - level;
>
>   	/*Scan the table in reverse order and match the level*/
> -	while (i >= 0) {
> +	for (; i >= 0; i--) {
>   		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
>   			continue;
>   		/*return if level matched*/
> -		if (i == level_index)
> +		if (level_index == level)
>   			return table[i].frequency;
> -		i--;
> +		level_index--;
>   	}

I believe you do more than what you have described in your intention 
under you patch description

Can you please split your patch into smaller changes?
>   	return ret;
>   }
> diff --git a/drivers/thermal/exynos_thermal.c b/drivers/thermal/exynos_thermal.c
> index d5e6267..524b2a0 100644
> --- a/drivers/thermal/exynos_thermal.c
> +++ b/drivers/thermal/exynos_thermal.c
> @@ -237,7 +237,7 @@ static int exynos_get_crit_temp(struct thermal_zone_device *thermal,
>
>   static int exynos_get_frequency_level(unsigned int cpu, unsigned int freq)
>   {
> -	int i = 0, ret = -EINVAL;
> +	int i, level = 0, ret = -EINVAL;
>   	struct cpufreq_frequency_table *table = NULL;
>   #ifdef CONFIG_CPU_FREQ
>   	table = cpufreq_frequency_get_table(cpu);
> @@ -245,12 +245,12 @@ static int exynos_get_frequency_level(unsigned int cpu, unsigned int freq)
>   	if (!table)
>   		return ret;
>
> -	while (table[i].frequency != CPUFREQ_TABLE_END) {
> +	for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
>   		if (table[i].frequency == CPUFREQ_ENTRY_INVALID)
>   			continue;
>   		if (table[i].frequency == freq)
> -			return i;
> -		i++;
> +			return level;
> +		level++;

Can you please send a separate patch on this driver instead?



>   	}
>   	return ret;
>   }
>


  reply	other threads:[~2013-04-09 14:55 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-08 23:54 [PATCH] thermal: fix frequency table lookup bugs Andrew Bresticker
2013-04-09 14:55 ` Eduardo Valentin [this message]
2013-04-09 14:55   ` Eduardo Valentin
2013-04-09 17:02   ` Andrew Bresticker
2013-04-09 17:21     ` Eduardo Valentin
2013-04-09 17:21       ` Eduardo Valentin
2013-04-09 18:27       ` Andrew Bresticker
2013-04-09 18:33         ` Eduardo Valentin
2013-04-09 18:33           ` Eduardo Valentin

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=51642BD5.4030803@ti.com \
    --to=eduardo.valentin@ti.com \
    --cc=abrestic@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rui.zhang@intel.com \
    /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.