]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
thermal/debugfs: Do not extend mitigation episodes beyond system resume
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 28 May 2024 14:53:47 +0000 (16:53 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 11 Jun 2024 19:04:00 +0000 (21:04 +0200)
Because thermal zone handling by the thermal core is started from
scratch during resume from system-wide suspend, prevent the debug
code from extending mitigation episodes beyond that point by ending
the mitigation episode currently in progress, if any, for each thermal
zone.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
drivers/thermal/thermal_core.c
drivers/thermal/thermal_debugfs.c
drivers/thermal/thermal_debugfs.h

index d70e76dd3c943849904a681b076642c9dbeca27f..bd31193bb58319984185ed71331b6176a913bb3a 100644 (file)
@@ -1648,6 +1648,7 @@ static void thermal_zone_device_resume(struct work_struct *work)
 
        tz->suspended = false;
 
+       thermal_debug_tz_resume(tz);
        thermal_zone_device_init(tz);
        __thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
 
index 66c0105465dd9c3755368f6bb25da154fc037199..c592eca11a50c9a4a827f5d025d6d1ed90f5a757 100644 (file)
@@ -926,3 +926,39 @@ void thermal_debug_tz_remove(struct thermal_zone_device *tz)
        thermal_debugfs_remove_id(thermal_dbg);
        kfree(trips_crossed);
 }
+
+void thermal_debug_tz_resume(struct thermal_zone_device *tz)
+{
+       struct thermal_debugfs *thermal_dbg = tz->debugfs;
+       ktime_t now = ktime_get();
+       struct tz_debugfs *tz_dbg;
+       struct tz_episode *tze;
+       int i;
+
+       if (!thermal_dbg)
+               return;
+
+       mutex_lock(&thermal_dbg->lock);
+
+       tz_dbg = &thermal_dbg->tz_dbg;
+
+       if (!tz_dbg->nr_trips)
+               goto out;
+
+       /*
+        * A mitigation episode was in progress before the preceding system
+        * suspend transition, so close it because the zone handling is starting
+        * over from scratch.
+        */
+       tze = list_first_entry(&tz_dbg->tz_episodes, struct tz_episode, node);
+
+       for (i = 0; i < tz_dbg->nr_trips; i++)
+               tz_episode_close_trip(tze, tz_dbg->trips_crossed[i], now);
+
+       tze->duration = ktime_sub(now, tze->timestamp);
+
+       tz_dbg->nr_trips = 0;
+
+out:
+       mutex_unlock(&thermal_dbg->lock);
+}
index 74ee65ee82ff8b4014b5fb8bedca4586d9a26cd8..1c957ce2ec8fe32808f1584864dc2ca2b2cafa93 100644 (file)
@@ -7,6 +7,7 @@ void thermal_debug_cdev_remove(struct thermal_cooling_device *cdev);
 void thermal_debug_cdev_state_update(const struct thermal_cooling_device *cdev, int state);
 void thermal_debug_tz_add(struct thermal_zone_device *tz);
 void thermal_debug_tz_remove(struct thermal_zone_device *tz);
+void thermal_debug_tz_resume(struct thermal_zone_device *tz);
 void thermal_debug_tz_trip_up(struct thermal_zone_device *tz,
                              const struct thermal_trip *trip);
 void thermal_debug_tz_trip_down(struct thermal_zone_device *tz,
@@ -20,6 +21,7 @@ static inline void thermal_debug_cdev_state_update(const struct thermal_cooling_
                                                   int state) {}
 static inline void thermal_debug_tz_add(struct thermal_zone_device *tz) {}
 static inline void thermal_debug_tz_remove(struct thermal_zone_device *tz) {}
+static inline void thermal_debug_tz_resume(struct thermal_zone_device *tz) {}
 static inline void thermal_debug_tz_trip_up(struct thermal_zone_device *tz,
                                            const struct thermal_trip *trip) {};
 static inline void thermal_debug_tz_trip_down(struct thermal_zone_device *tz,