public inbox for linux-hwmon@vger.kernel.org
 help / color / mirror / Atom feed
From: "Pali Rohár" <pali.rohar@gmail.com>
To: "Jean Delvare" <jdelvare@suse.com>,
	"Guenter Roeck" <linux@roeck-us.net>,
	"Jan C Peters" <jcpeters89@gmail.com>,
	"Thorsten Leemhuis" <fedora@leemhuis.info>,
	"David Santamaría Rogado" <howl.nsp@gmail.com>,
	"Peter Saunderson" <peteasa@gmail.com>,
	"Tolga Cakir" <cevelnet@gmail.com>,
	"Austin S. Hemmelgarn" <ahferroin7@gmail.com>,
	Mario_Limonciello@dell.com,
	"Gabriele Mazzotta" <gabriele.mzt@gmail.com>,
	"Michał Kępień" <kernel@kempniu.pl>,
	"Dakota Whipple" <dakotajaywhipple@gmail.com>,
	"Leon Yu" <leon@leonyu.net>
Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Pali Rohár" <pali.rohar@gmail.com>
Subject: [PATCH 4/6] hwmon: (dell-smm) Cache fan_type() calls and change fan detection
Date: Sat, 18 Jun 2016 00:54:47 +0200	[thread overview]
Message-ID: <1466204089-17030-5-git-send-email-pali.rohar@gmail.com> (raw)
In-Reply-To: <1466204089-17030-1-git-send-email-pali.rohar@gmail.com>

On more Dell machines (e.g. Dell Precision M3800) fan_type() call is too
expensive (CPU is too long in SMM mode) and cause kernel to hang. This is
bug in Dell SMM or BIOS.

This patch caches type for each fan (as it should not change) and changes
the way how fan presense is detected. First it try function fan_status()
as was before commit f989e55452c7 ("i8k: Add support for fan labels"). And
if that fails fallback to fan_type(). *_status() functions can fail in case
fan is not currently accessible (e.g. present on GPU which is currently
turned off).

Reported-by: Tolga Cakir <cevelnet@gmail.com>
Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=112021
Cc: stable@vger.kernel.org # v4.0+, will need backport
---
 drivers/hwmon/dell-smm-hwmon.c |   25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c
index 4bbc587..2ac87d5 100644
--- a/drivers/hwmon/dell-smm-hwmon.c
+++ b/drivers/hwmon/dell-smm-hwmon.c
@@ -238,7 +238,7 @@ static int i8k_get_fan_speed(int fan)
 /*
  * Read the fan type.
  */
-static int i8k_get_fan_type(int fan)
+static int _i8k_get_fan_type(int fan)
 {
 	struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, };
 
@@ -249,6 +249,17 @@ static int i8k_get_fan_type(int fan)
 	return i8k_smm(&regs) ? : regs.eax & 0xff;
 }
 
+static int i8k_get_fan_type(int fan)
+{
+	/* I8K_SMM_GET_FAN_TYPE SMM call is expensive, so cache values */
+	static int types[2] = { INT_MIN, INT_MIN };
+
+	if (types[fan] == INT_MIN)
+		types[fan] = _i8k_get_fan_type(fan);
+
+	return types[fan];
+}
+
 /*
  * Read the fan nominal rpm for specific fan speed.
  */
@@ -782,13 +793,17 @@ static int __init i8k_init_hwmon(void)
 	if (err >= 0)
 		i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4;
 
-	/* First fan attributes, if fan type is OK */
-	err = i8k_get_fan_type(0);
+	/* First fan attributes, if fan status or type is OK */
+	err = i8k_get_fan_status(0);
+	if (err < 0)
+		err = i8k_get_fan_type(0);
 	if (err >= 0)
 		i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1;
 
-	/* Second fan attributes, if fan type is OK */
-	err = i8k_get_fan_type(1);
+	/* Second fan attributes, if fan status or type is OK */
+	err = i8k_get_fan_status(1);
+	if (err < 0)
+		err = i8k_get_fan_type(1);
 	if (err >= 0)
 		i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2;
 
-- 
1.7.9.5


  parent reply	other threads:[~2016-06-17 22:55 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-17 22:54 [PATCH 0/6] dell-smm-hwmon fixes Pali Rohár
2016-06-17 22:54 ` [PATCH 1/6] hwmon: (dell-smm) Fail in ioctl I8K_BIOS_VERSION when bios version is not a number Pali Rohár
2016-06-18 20:00   ` Guenter Roeck
2016-06-17 22:54 ` [PATCH 2/6] hwmon: (dell-smm) Restrict fan control and serial number to CAP_SYS_ADMIN by default Pali Rohár
2016-06-18 20:00   ` Guenter Roeck
2016-06-17 22:54 ` [PATCH 3/6] hwmon: (dell-smm) Disallow fan_type() calls on broken machines Pali Rohár
2016-06-18 20:08   ` Guenter Roeck
2016-06-18 22:46     ` Pali Rohár
2016-06-17 22:54 ` Pali Rohár [this message]
2016-06-19  0:01   ` [PATCH 4/6] hwmon: (dell-smm) Cache fan_type() calls and change fan detection Tolga Cakir
2016-06-17 22:54 ` [PATCH 5/6] hwmon: (dell-smm) Detect fan with index=2 Pali Rohár
2016-06-19  0:02   ` Tolga Cakir
2016-06-17 22:54 ` [PATCH 6/6] hwmon: (dell-smm) In debug mode log duration of SMM calls Pali Rohár
2016-06-18 12:21 ` [PATCH 0/6] dell-smm-hwmon fixes Pali Rohár
2016-06-18 15:13 ` Guenter Roeck
2016-06-18 15:26   ` Pali Rohár
2016-06-18 16:54     ` Guenter Roeck
2016-06-18 22:39       ` Pali Rohár
2016-06-20  9:12         ` Pali Rohár
2016-06-20 13:24           ` Guenter Roeck
2016-06-23 12:16             ` Pali Rohár
2016-06-23 13:51               ` Guenter Roeck
     [not found]       ` <CA+vQ2zCoGhLT2PUUhcuggJ3oE9Z6vfUW=Z1wgm8Ozz3XdnQoxA@mail.gmail.com>
2016-06-18 22:44         ` Pali Rohár
2016-06-22  8:02 ` Michał Kępień

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=1466204089-17030-5-git-send-email-pali.rohar@gmail.com \
    --to=pali.rohar@gmail.com \
    --cc=Mario_Limonciello@dell.com \
    --cc=ahferroin7@gmail.com \
    --cc=cevelnet@gmail.com \
    --cc=dakotajaywhipple@gmail.com \
    --cc=fedora@leemhuis.info \
    --cc=gabriele.mzt@gmail.com \
    --cc=howl.nsp@gmail.com \
    --cc=jcpeters89@gmail.com \
    --cc=jdelvare@suse.com \
    --cc=kernel@kempniu.pl \
    --cc=leon@leonyu.net \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=peteasa@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox