drivers/thermal/thermal_core.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)
From: Rafael J. Wysocki <rafael.j.wysocki@intel.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@intel.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);
© 2016 - 2024 Red Hat, Inc.