thermal/governors: Group the thermal zone lock inside the throttle function
authorDaniel Lezcano <daniel.lezcano@linaro.org>
Fri, 5 Aug 2022 15:38:32 +0000 (17:38 +0200)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Wed, 17 Aug 2022 12:09:39 +0000 (14:09 +0200)
The thermal zone lock is taken in the different places in the
throttling path.

At the first glance it does not hurt to move them at the beginning and
the end of the 'throttle' function. That will allow a consolidation of
the lock in the next following changes.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20220805153834.2510142-3-daniel.lezcano@linaro.org
drivers/thermal/gov_bang_bang.c
drivers/thermal/gov_fair_share.c
drivers/thermal/gov_power_allocator.c
drivers/thermal/gov_step_wise.c

index 991a1c54296de0dd577016305d0514ce474e2c9e..f0bff2e0475b111ada84ffd2aa0b1dcaaf1cd0cc 100644 (file)
@@ -31,8 +31,6 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
                                trip, trip_temp, tz->temperature,
                                trip_hyst);
 
-       mutex_lock(&tz->lock);
-
        list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
                if (instance->trip != trip)
                        continue;
@@ -65,8 +63,6 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
                instance->cdev->updated = false; /* cdev needs update */
                mutex_unlock(&instance->cdev->lock);
        }
-
-       mutex_unlock(&tz->lock);
 }
 
 /**
@@ -100,10 +96,10 @@ static int bang_bang_control(struct thermal_zone_device *tz, int trip)
 {
        struct thermal_instance *instance;
 
-       thermal_zone_trip_update(tz, trip);
-
        mutex_lock(&tz->lock);
 
+       thermal_zone_trip_update(tz, trip);
+
        list_for_each_entry(instance, &tz->thermal_instances, tz_node)
                thermal_cdev_update(instance->cdev);
 
index 6a2abcfc648f7f9b08464603ff89a2afa704a09c..5d5ddd648cd26aa1cb55618232b0345dbe3bac42 100644 (file)
@@ -113,6 +113,7 @@ static int fair_share_throttle(struct thermal_zone_device *tz, int trip)
        }
 
        mutex_unlock(&tz->lock);
+
        return 0;
 }
 
index 1d505247096728f97cddb105384b0e95f21d4414..d3aca236e27467d729775c9a12e45f82502fef6a 100644 (file)
@@ -392,8 +392,6 @@ static int allocate_power(struct thermal_zone_device *tz,
        int i, num_actors, total_weight, ret = 0;
        int trip_max_desired_temperature = params->trip_max_desired_temperature;
 
-       mutex_lock(&tz->lock);
-
        num_actors = 0;
        total_weight = 0;
        list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
@@ -404,10 +402,8 @@ static int allocate_power(struct thermal_zone_device *tz,
                }
        }
 
-       if (!num_actors) {
-               ret = -ENODEV;
-               goto unlock;
-       }
+       if (!num_actors)
+               return -ENODEV;
 
        /*
         * We need to allocate five arrays of the same size:
@@ -421,10 +417,8 @@ static int allocate_power(struct thermal_zone_device *tz,
        BUILD_BUG_ON(sizeof(*req_power) != sizeof(*extra_actor_power));
        BUILD_BUG_ON(sizeof(*req_power) != sizeof(*weighted_req_power));
        req_power = kcalloc(num_actors * 5, sizeof(*req_power), GFP_KERNEL);
-       if (!req_power) {
-               ret = -ENOMEM;
-               goto unlock;
-       }
+       if (!req_power)
+               return -ENOMEM;
 
        max_power = &req_power[num_actors];
        granted_power = &req_power[2 * num_actors];
@@ -496,8 +490,6 @@ static int allocate_power(struct thermal_zone_device *tz,
                                      control_temp - tz->temperature);
 
        kfree(req_power);
-unlock:
-       mutex_unlock(&tz->lock);
 
        return ret;
 }
@@ -576,7 +568,6 @@ static void allow_maximum_power(struct thermal_zone_device *tz, bool update)
        struct power_allocator_params *params = tz->governor_data;
        u32 req_power;
 
-       mutex_lock(&tz->lock);
        list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
                struct thermal_cooling_device *cdev = instance->cdev;
 
@@ -598,7 +589,6 @@ static void allow_maximum_power(struct thermal_zone_device *tz, bool update)
 
                mutex_unlock(&instance->cdev->lock);
        }
-       mutex_unlock(&tz->lock);
 }
 
 /**
@@ -707,17 +697,19 @@ static void power_allocator_unbind(struct thermal_zone_device *tz)
 
 static int power_allocator_throttle(struct thermal_zone_device *tz, int trip)
 {
-       int ret;
+       int ret = 0;
        int switch_on_temp, control_temp;
        struct power_allocator_params *params = tz->governor_data;
        bool update;
 
+       mutex_lock(&tz->lock);
+
        /*
         * We get called for every trip point but we only need to do
         * our calculations once
         */
        if (trip != params->trip_max_desired_temperature)
-               return 0;
+               goto out;
 
        ret = tz->ops->get_trip_temp(tz, params->trip_switch_on,
                                     &switch_on_temp);
@@ -726,7 +718,7 @@ static int power_allocator_throttle(struct thermal_zone_device *tz, int trip)
                tz->passive = 0;
                reset_pid_controller(params);
                allow_maximum_power(tz, update);
-               return 0;
+               goto out;
        }
 
        tz->passive = 1;
@@ -737,10 +729,14 @@ static int power_allocator_throttle(struct thermal_zone_device *tz, int trip)
                dev_warn(&tz->device,
                         "Failed to get the maximum desired temperature: %d\n",
                         ret);
-               return ret;
+               goto out;
        }
 
-       return allocate_power(tz, control_temp);
+       ret = allocate_power(tz, control_temp);
+
+       mutex_unlock(&tz->lock);
+out:
+       return ret;
 }
 
 static struct thermal_governor thermal_gov_power_allocator = {
index 9729b46d0258aacfcd7506937e6059377e7f7d7e..597a0ebec7a4f2f7559ce6a6baa858d0c552a7fe 100644 (file)
@@ -117,8 +117,6 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
        dev_dbg(&tz->device, "Trip%d[type=%d,temp=%d]:trend=%d,throttle=%d\n",
                                trip, trip_type, trip_temp, trend, throttle);
 
-       mutex_lock(&tz->lock);
-
        list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
                if (instance->trip != trip)
                        continue;
@@ -145,8 +143,6 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip)
                instance->cdev->updated = false; /* cdev needs update */
                mutex_unlock(&instance->cdev->lock);
        }
-
-       mutex_unlock(&tz->lock);
 }
 
 /**
@@ -164,10 +160,10 @@ static int step_wise_throttle(struct thermal_zone_device *tz, int trip)
 {
        struct thermal_instance *instance;
 
-       thermal_zone_trip_update(tz, trip);
-
        mutex_lock(&tz->lock);
 
+       thermal_zone_trip_update(tz, trip);
+
        list_for_each_entry(instance, &tz->thermal_instances, tz_node)
                thermal_cdev_update(instance->cdev);