]> www.infradead.org Git - nvme.git/commitdiff
thermal: trip: Avoid skipping trips in thermal_zone_set_trips()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 30 Jul 2024 14:41:18 +0000 (16:41 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 31 Jul 2024 10:30:58 +0000 (12:30 +0200)
Say there are 3 trip points A, B, C sorted in ascending temperature
order with no hysteresis.  If the zone temerature is exactly equal to
B, thermal_zone_set_trips() will set the boundaries to A and C and the
hardware will not catch any crossing of B (either way) until either A
or C is crossed and the boundaries are changed.

To avoid that, use non-strict inequalities when comparing the trip
threshold to the zone temperature in thermal_zone_set_trips().

In the example above, it will cause both boundaries to be set to B,
which is desirable because an interrupt will trigger when the zone
temperature becomes different from B regardless of which way it goes.
That will allow a new interval to be set depending on the direction of
the zone temperature change.

Fixes: 893bae92237d ("thermal: trip: Make thermal_zone_set_trips() use trip thresholds")
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/12509184.O9o76ZdvQC@rjwysocki.net
drivers/thermal/thermal_trip.c

index c0b679b846b3b90fd10738fd3c84226bb31f1f5a..06a0554ddc389156ccd51bbbc988bebaa47c0046 100644 (file)
@@ -88,10 +88,10 @@ void thermal_zone_set_trips(struct thermal_zone_device *tz)
                return;
 
        for_each_trip_desc(tz, td) {
-               if (td->threshold < tz->temperature && td->threshold > low)
+               if (td->threshold <= tz->temperature && td->threshold > low)
                        low = td->threshold;
 
-               if (td->threshold > tz->temperature && td->threshold < high)
+               if (td->threshold >= tz->temperature && td->threshold < high)
                        high = td->threshold;
        }