public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume
@ 2023-02-13 18:22 Armin Wolf
  2023-02-13 18:22 ` [PATCH 2/2] platform/x86: dell-ddv: Fix temperature scaling Armin Wolf
  2023-02-18 10:43 ` [PATCH 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume Hans de Goede
  0 siblings, 2 replies; 3+ messages in thread
From: Armin Wolf @ 2023-02-13 18:22 UTC (permalink / raw)
  To: hdegoede, markgross
  Cc: jdelvare, linux, platform-driver-x86, linux-hwmon, linux-kernel

If one or both sensor buffers could not be initialized, either
due to missing hardware support or due to some error during probing,
the resume handler will encounter undefined behaviour when
attempting to lock buffers then protected by an uninitialized or
destroyed mutex.
Fix this by introducing a "active" flag which is set during probe,
and only invalidate buffers which where flaged as "active".

Tested on a Dell Inspiron 3505.

Fixes: 3b7eeff93d29 ("platform/x86: dell-ddv: Add hwmon support")
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
---
 drivers/platform/x86/dell/dell-wmi-ddv.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c
index d547c9d09725..58f996b3b374 100644
--- a/drivers/platform/x86/dell/dell-wmi-ddv.c
+++ b/drivers/platform/x86/dell/dell-wmi-ddv.c
@@ -96,6 +96,7 @@ struct combined_chip_info {
 };

 struct dell_wmi_ddv_sensors {
+	bool active;
 	struct mutex lock;	/* protect caching */
 	unsigned long timestamp;
 	union acpi_object *obj;
@@ -530,6 +531,7 @@ static void dell_wmi_ddv_hwmon_cache_destroy(void *data)
 {
 	struct dell_wmi_ddv_sensors *sensors = data;

+	sensors->active = false;
 	mutex_destroy(&sensors->lock);
 	kfree(sensors->obj);
 }
@@ -549,6 +551,7 @@ static struct hwmon_channel_info *dell_wmi_ddv_channel_init(struct wmi_device *w
 		return ERR_PTR(ret);

 	mutex_init(&sensors->lock);
+	sensors->active = true;

 	ret = devm_add_action_or_reset(&wdev->dev, dell_wmi_ddv_hwmon_cache_destroy, sensors);
 	if (ret < 0)
@@ -852,9 +855,12 @@ static int dell_wmi_ddv_resume(struct device *dev)
 {
 	struct dell_wmi_ddv_data *data = dev_get_drvdata(dev);

-	/* Force re-reading of all sensors */
-	dell_wmi_ddv_hwmon_cache_invalidate(&data->fans);
-	dell_wmi_ddv_hwmon_cache_invalidate(&data->temps);
+	/* Force re-reading of all active sensors */
+	if (data->fans.active)
+		dell_wmi_ddv_hwmon_cache_invalidate(&data->fans);
+
+	if (data->temps.active)
+		dell_wmi_ddv_hwmon_cache_invalidate(&data->temps);

 	return 0;
 }
--
2.30.2


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-02-18 10:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-13 18:22 [PATCH 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume Armin Wolf
2023-02-13 18:22 ` [PATCH 2/2] platform/x86: dell-ddv: Fix temperature scaling Armin Wolf
2023-02-18 10:43 ` [PATCH 1/2] platform/x86: dell-ddv: Fix cache invalidation on resume Hans de Goede

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox