[RFC PATCH for 6.13 v1 06/20] thermal: core: Consolidate thermal zone locking during initialization

From: Rafael J. Wysocki
Date: Sat Sep 14 2024 - 07:09:19 EST


From: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>

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@xxxxxxxxx>
---
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);