thermal: core: Separate code running under thermal_list_lock
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 10 Oct 2024 22:09:18 +0000 (00:09 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 23 Oct 2024 09:56:33 +0000 (11:56 +0200)
To prepare for a subsequent change that will switch over the thermal
core to using a mutex guard for thermal_list_lock management, move the
code running under thermal_list_lock during the initialization and
unregistration of cooling devices into separate functions.

While at it, drop some comments that do not add value.

No intentional functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/10572828.nUPlyArG6x@rjwysocki.net
Reviewed-by: Lukasz Luba <lukasz.luba@arm.com>
drivers/thermal/thermal_core.c

index b8cd84a8c86cf0dab440d360186ec24b9bdee243..08c227ac3d5360c7792db72934027ab0fac02c02 100644 (file)
@@ -967,6 +967,20 @@ static void thermal_zone_cdev_bind(struct thermal_zone_device *tz,
                __thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 }
 
+static void thermal_cooling_device_init_complete(struct thermal_cooling_device *cdev)
+{
+       struct thermal_zone_device *tz;
+
+       mutex_lock(&thermal_list_lock);
+
+       list_add(&cdev->node, &thermal_cdev_list);
+
+       list_for_each_entry(tz, &thermal_tz_list, node)
+               thermal_zone_cdev_bind(tz, cdev);
+
+       mutex_unlock(&thermal_list_lock);
+}
+
 /**
  * __thermal_cooling_device_register() - register a new thermal cooling device
  * @np:                a pointer to a device tree node.
@@ -989,7 +1003,6 @@ __thermal_cooling_device_register(struct device_node *np,
                                  const struct thermal_cooling_device_ops *ops)
 {
        struct thermal_cooling_device *cdev;
-       struct thermal_zone_device *pos;
        unsigned long current_state;
        int id, ret;
 
@@ -1056,16 +1069,7 @@ __thermal_cooling_device_register(struct device_node *np,
        if (current_state <= cdev->max_state)
                thermal_debug_cdev_add(cdev, current_state);
 
-       /* Add 'this' new cdev to the global cdev list */
-       mutex_lock(&thermal_list_lock);
-
-       list_add(&cdev->node, &thermal_cdev_list);
-
-       /* Update binding information for 'this' new cdev */
-       list_for_each_entry(pos, &thermal_tz_list, node)
-               thermal_zone_cdev_bind(pos, cdev);
-
-       mutex_unlock(&thermal_list_lock);
+       thermal_cooling_device_init_complete(cdev);
 
        return cdev;
 
@@ -1276,38 +1280,42 @@ static void thermal_zone_cdev_unbind(struct thermal_zone_device *tz,
        __thermal_zone_cdev_unbind(tz, cdev);
 }
 
-/**
- * thermal_cooling_device_unregister - removes a thermal cooling device
- * @cdev:      the thermal cooling device to remove.
- *
- * thermal_cooling_device_unregister() must be called when a registered
- * thermal cooling device is no longer needed.
- */
-void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
+static bool thermal_cooling_device_exit(struct thermal_cooling_device *cdev)
 {
        struct thermal_zone_device *tz;
-
-       if (!cdev)
-               return;
-
-       thermal_debug_cdev_remove(cdev);
+       bool ret = true;
 
        mutex_lock(&thermal_list_lock);
 
        if (!thermal_cooling_device_present(cdev)) {
-               mutex_unlock(&thermal_list_lock);
-               return;
+               ret = false;
+               goto unlock;
        }
 
        list_del(&cdev->node);
 
-       /* Unbind all thermal zones associated with 'this' cdev */
        list_for_each_entry(tz, &thermal_tz_list, node)
                thermal_zone_cdev_unbind(tz, cdev);
 
+unlock:
        mutex_unlock(&thermal_list_lock);
 
-       device_unregister(&cdev->device);
+       return ret;
+}
+
+/**
+ * thermal_cooling_device_unregister() - removes a thermal cooling device
+ * @cdev: Thermal cooling device to remove.
+ */
+void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
+{
+       if (!cdev)
+               return;
+
+       thermal_debug_cdev_remove(cdev);
+
+       if (thermal_cooling_device_exit(cdev))
+               device_unregister(&cdev->device);
 }
 EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister);