thermal: core: Fix list sorting in __thermal_zone_device_update()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 8 Jul 2024 15:16:00 +0000 (17:16 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 8 Jul 2024 15:24:22 +0000 (17:24 +0200)
The order in which lists are sorted in __thermal_zone_device_update()
is reverse with respect to what it should be due to a mistake in
thermal_trip_notify_cmp().

Fix it and observe that it is not necessary to sort the lists in
different orders.  They can both be sorted in ascending order if
way_down_list is walked in reverse order which allows the code to
be slightly more straightforward (and less prone to silly mistakes).

Fixes: 7454f2c42cce ("thermal: core: Sort trip point crossing notifications by temperature")
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/12481676.O9o76ZdvQC@rjwysocki.net
drivers/thermal/thermal_core.c

index 46418e30b4a6002a661cf9956a1f1a97ea72ed43..ecc748d15eb7ce07479be603a9ce4df9745926b7 100644 (file)
@@ -484,16 +484,14 @@ static void thermal_trip_crossed(struct thermal_zone_device *tz,
        thermal_governor_trip_crossed(governor, tz, trip, crossed_up);
 }
 
-static int thermal_trip_notify_cmp(void *ascending, const struct list_head *a,
+static int thermal_trip_notify_cmp(void *not_used, const struct list_head *a,
                                   const struct list_head *b)
 {
        struct thermal_trip_desc *tda = container_of(a, struct thermal_trip_desc,
                                                     notify_list_node);
        struct thermal_trip_desc *tdb = container_of(b, struct thermal_trip_desc,
                                                     notify_list_node);
-       int ret = tdb->notify_temp - tda->notify_temp;
-
-       return ascending ? ret : -ret;
+       return tda->notify_temp - tdb->notify_temp;
 }
 
 void __thermal_zone_device_update(struct thermal_zone_device *tz,
@@ -522,12 +520,12 @@ void __thermal_zone_device_update(struct thermal_zone_device *tz,
        for_each_trip_desc(tz, td)
                handle_thermal_trip(tz, td, &way_up_list, &way_down_list);
 
-       list_sort(&way_up_list, &way_up_list, thermal_trip_notify_cmp);
+       list_sort(NULL, &way_up_list, thermal_trip_notify_cmp);
        list_for_each_entry(td, &way_up_list, notify_list_node)
                thermal_trip_crossed(tz, &td->trip, governor, true);
 
        list_sort(NULL, &way_down_list, thermal_trip_notify_cmp);
-       list_for_each_entry(td, &way_down_list, notify_list_node)
+       list_for_each_entry_reverse(td, &way_down_list, notify_list_node)
                thermal_trip_crossed(tz, &td->trip, governor, false);
 
        if (governor->manage)