[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <10548633.nUPlyArG6x@rjwysocki.net>
Date: Sat, 14 Sep 2024 12:32:45 +0200
From: "Rafael J. Wysocki" <rjw@...ysocki.net>
To: Linux PM <linux-pm@...r.kernel.org>
Cc: LKML <linux-kernel@...r.kernel.org>,
Daniel Lezcano <daniel.lezcano@...aro.org>,
Lukasz Luba <lukasz.luba@....com>, Zhang Rui <rui.zhang@...el.com>
Subject:
[RFC PATCH for 6.13 v1 06/20] thermal: core: Consolidate thermal zone locking
during initialization
From: Rafael J. Wysocki <rafael.j.wysocki@...el.com>
The part of thermal zone initialization carried out under
thermal_list_lock acquires the thermal zone lock and releases it
multiple times back-to-back which is not really necessary.
Instead of doing this, acquire the thermal zone lock once after
acquiring thermal_list_lock and release it along with that lock.
For this purpose, move all of the code in question to
thermal_zone_init_complete() introduced previously and provide an
"unloacked" variant of thermal_zone_cdev_bind() to be invoked from
there.
No intentional functional impact.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@...el.com>
---
drivers/thermal/thermal_core.c | 40 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 20 deletions(-)
Index: linux-pm/drivers/thermal/thermal_core.c
===================================================================
--- linux-pm.orig/drivers/thermal/thermal_core.c
+++ linux-pm/drivers/thermal/thermal_core.c
@@ -919,16 +919,14 @@ void print_bind_err_msg(struct thermal_z
cdev->type, thermal_zone_trip_id(tz, &td->trip), ret);
}
-static void thermal_zone_cdev_bind(struct thermal_zone_device *tz,
- struct thermal_cooling_device *cdev)
+static void __thermal_zone_cdev_bind(struct thermal_zone_device *tz,
+ struct thermal_cooling_device *cdev)
{
struct thermal_trip_desc *td;
if (!tz->ops.should_bind)
return;
- guard(thermal_zone)(tz);
-
for_each_trip_desc(tz, td) {
struct cooling_spec c = {
.upper = THERMAL_NO_LIMIT,
@@ -946,6 +944,14 @@ static void thermal_zone_cdev_bind(struc
}
}
+static void thermal_zone_cdev_bind(struct thermal_zone_device *tz,
+ struct thermal_cooling_device *cdev)
+{
+ guard(thermal_zone)(tz);
+
+ __thermal_zone_cdev_bind(tz, cdev);
+}
+
/**
* __thermal_cooling_device_register() - register a new thermal cooling device
* @np: a pointer to a device tree node.
@@ -1313,17 +1319,20 @@ int thermal_zone_get_crit_temp(struct th
}
EXPORT_SYMBOL_GPL(thermal_zone_get_crit_temp);
-static void thermal_zone_add_to_list(struct thermal_zone_device *tz)
+static void thermal_zone_init_complete(struct thermal_zone_device *tz)
{
- guard(thermal_zone)(tz);
+ struct thermal_cooling_device *cdev;
+
+ mutex_lock(&thermal_list_lock);
list_add_tail(&tz->node, &thermal_tz_list);
-}
-static void thermal_zone_init_complete(struct thermal_zone_device *tz)
-{
guard(thermal_zone)(tz);
+ /* Bind cooling devices for this zone. */
+ list_for_each_entry(cdev, &thermal_cdev_list, node)
+ __thermal_zone_cdev_bind(tz, cdev);
+
tz->state &= ~TZ_STATE_FLAG_INIT;
/*
* If system suspend or resume is in progress at this point, the
@@ -1334,6 +1343,8 @@ static void thermal_zone_init_complete(s
tz->state |= TZ_STATE_FLAG_SUSPENDED;
__thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
+
+ mutex_unlock(&thermal_list_lock);
}
/**
@@ -1370,7 +1381,6 @@ thermal_zone_device_register_with_trips(
unsigned int polling_delay)
{
const struct thermal_trip *trip = trips;
- struct thermal_cooling_device *cdev;
struct thermal_zone_device *tz;
struct thermal_trip_desc *td;
int id;
@@ -1496,18 +1506,8 @@ thermal_zone_device_register_with_trips(
goto unregister;
}
- mutex_lock(&thermal_list_lock);
-
- thermal_zone_add_to_list(tz);
-
- /* Bind cooling devices for this zone */
- list_for_each_entry(cdev, &thermal_cdev_list, node)
- thermal_zone_cdev_bind(tz, cdev);
-
thermal_zone_init_complete(tz);
- mutex_unlock(&thermal_list_lock);
-
thermal_notify_tz_create(tz);
thermal_debug_tz_add(tz);
Powered by blists - more mailing lists