From: Guenter Roeck <linux@roeck-us.net>
To: "Pali Rohár" <pali.rohar@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Steven Honeyman <stevenhoneyman@gmail.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] i8k: Fix temperature bug handling in i8k_get_temp()
Date: Sat, 29 Nov 2014 16:12:07 -0800 [thread overview]
Message-ID: <20141130001207.GA26101@roeck-us.net> (raw)
In-Reply-To: <1416322614-10308-1-git-send-email-pali.rohar@gmail.com>
On Tue, Nov 18, 2014 at 03:56:54PM +0100, Pali Rohár wrote:
> Static array prev[] was incorrectly initialized. It should be initialized to
> some "invalid" temperature value (above I8K_MAX_TEMP).
>
> Next, function should store "invalid" value to prev[] (above I8K_MAX_TEMP),
> not valid (= I8K_MAX_TEMP) because whole temperature bug handling will not
> work.
>
> And last part, to not break existing detection of temperature sensors, register
> them also if i8k report too high temperature (above I8K_MAX_TEMP). This is
> needed because some sensors are sometimes turned off (e.g sensor on GPU which
> can be turned off/on) and in this case SMM report too high value.
>
> To prevent reporting "invalid" values to userspace, return -EINVAL. In this case
> sensors which are currently turned off (e.g optimus/powerexpress/enduro gpu)
> are reported as "N/A" by lm-sensors package.
>
> Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
> ---
> drivers/char/i8k.c | 16 ++++++++++------
> 1 file changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c
> index 7272b08..e34a019 100644
> --- a/drivers/char/i8k.c
> +++ b/drivers/char/i8k.c
> @@ -298,7 +298,7 @@ static int i8k_get_temp(int sensor)
> int temp;
>
> #ifdef I8K_TEMPERATURE_BUG
> - static int prev[4];
> + static int prev[4] = { I8K_MAX_TEMP+1, I8K_MAX_TEMP+1, I8K_MAX_TEMP+1, I8K_MAX_TEMP+1 };
This results in a checkpatch warning. Please split, and add a space before
and after '+'. Actually, I would suggest to use something something like
#define I8K_INVALID_TEMP (I8K_MAX_TEMP + 1)
and to use it instead of hard-coding "I8K_MAX_TEMP + 1" in the code.
> #endif
> regs.ebx = sensor & 0xff;
> rc = i8k_smm(®s);
> @@ -317,10 +317,12 @@ static int i8k_get_temp(int sensor)
> */
> if (temp > I8K_MAX_TEMP) {
> temp = prev[sensor];
> - prev[sensor] = I8K_MAX_TEMP;
> + prev[sensor] = I8K_MAX_TEMP+1;
> } else {
> prev[sensor] = temp;
> }
> + if (temp > I8K_MAX_TEMP)
> + return -ERANGE;
> #endif
>
> return temp;
> @@ -499,6 +501,8 @@ static ssize_t i8k_hwmon_show_temp(struct device *dev,
> int temp;
>
> temp = i8k_get_temp(index);
> + if (temp == -ERANGE)
> + return -EINVAL;
> if (temp < 0)
> return temp;
> return sprintf(buf, "%d\n", temp * 1000);
> @@ -610,17 +614,17 @@ static int __init i8k_init_hwmon(void)
>
> /* CPU temperature attributes, if temperature reading is OK */
> err = i8k_get_temp(0);
> - if (err >= 0)
> + if (err >= 0 || err == -ERANGE)
> i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP1;
> /* check for additional temperature sensors */
> err = i8k_get_temp(1);
> - if (err >= 0)
> + if (err >= 0 || err == -ERANGE)
> i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP2;
> err = i8k_get_temp(2);
> - if (err >= 0)
> + if (err >= 0 || err == -ERANGE)
> i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP3;
> err = i8k_get_temp(3);
> - if (err >= 0)
> + if (err >= 0 || err == -ERANGE)
> i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4;
>
> /* Left fan attributes, if left fan is present */
> --
> 1.7.9.5
>
next prev parent reply other threads:[~2014-11-30 0:12 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-19 14:46 [PATCH] i8k: Ignore temperature sensors which report invalid values Pali Rohár
2014-10-19 15:13 ` Guenter Roeck
2014-10-20 16:46 ` Pali Rohár
2014-10-21 4:27 ` Guenter Roeck
2014-10-22 12:29 ` Pali Rohár
2014-10-22 16:19 ` Guenter Roeck
2014-10-22 16:35 ` Pali Rohár
2014-10-22 17:10 ` Guenter Roeck
2014-10-23 10:37 ` Pali Rohár
2014-10-23 16:45 ` Guenter Roeck
2014-11-17 8:35 ` Pali Rohár
2014-11-18 5:56 ` Guenter Roeck
2014-11-18 14:46 ` Pali Rohár
2014-11-18 14:56 ` [PATCH] i8k: Fix temperature bug handling in i8k_get_temp() Pali Rohár
2014-11-30 0:12 ` Guenter Roeck [this message]
2014-11-30 14:44 ` Pali Rohár
2014-11-30 9:00 ` Guenter Roeck
2014-11-30 14:48 ` Pali Rohár
2014-11-30 15:56 ` Guenter Roeck
2014-11-30 16:00 ` Pali Rohár
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=20141130001207.GA26101@roeck-us.net \
--to=linux@roeck-us.net \
--cc=arnd@arndb.de \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pali.rohar@gmail.com \
--cc=stevenhoneyman@gmail.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.