thermal/debugfs: Avoid printing zero duration for mitigation events in progress
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 25 Apr 2024 12:24:02 +0000 (14:24 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 26 Apr 2024 13:01:56 +0000 (15:01 +0200)
If a thermal mitigation event is in progress, its duration value has
not been updated yet, so 0 will be printed as the event duration by
tze_seq_show() which is confusing.

Avoid doing that by marking the beginning of the event with the
KTIME_MIN duration value and making tze_seq_show() compute the current
event duration on the fly, in which case '>' will be printed instead of
'=' in the event duration value field.

Similarly, for trip points that have been crossed on the down, mark
the end of mitigation with the KTIME_MAX timestamp value and make
tze_seq_show() compute the current duration on the fly for the trip
points still involved in the mitigation, in which cases the duration
value printed by it will be prepended with a '>' character.

Fixes: 7ef01f228c9f ("thermal/debugfs: Add thermal debugfs information for mitigation episodes")
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Lukasz Luba <lukasz.luba@arm.com>
Tested-by: Lukasz Luba <lukasz.luba@arm.com>
drivers/thermal/thermal_debugfs.c

index 59b1d999383c3e4a8d3a3b78f849fc0793ec2009..91f9c21235a8a9dcb05d51a45ddb4ee0f2ecf983 100644 (file)
@@ -556,6 +556,7 @@ static struct tz_episode *thermal_debugfs_tz_event_alloc(struct thermal_zone_dev
 
        INIT_LIST_HEAD(&tze->node);
        tze->timestamp = now;
+       tze->duration = KTIME_MIN;
 
        for (i = 0; i < tz->num_trips; i++) {
                tze->trip_stats[i].min = INT_MAX;
@@ -691,6 +692,9 @@ void thermal_debug_tz_trip_down(struct thermal_zone_device *tz,
        tze->trip_stats[trip_id].duration =
                ktime_add(delta, tze->trip_stats[trip_id].duration);
 
+       /* Mark the end of mitigation for this trip point. */
+       tze->trip_stats[trip_id].timestamp = KTIME_MAX;
+
        /*
         * This event closes the mitigation as we are crossing the
         * last trip point the way down.
@@ -766,15 +770,25 @@ static int tze_seq_show(struct seq_file *s, void *v)
        struct thermal_trip_desc *td;
        struct tz_episode *tze;
        const char *type;
+       u64 duration_ms;
        int trip_id;
+       char c;
 
        tze = list_entry((struct list_head *)v, struct tz_episode, node);
 
-       seq_printf(s, ",-Mitigation at %lluus, duration=%llums\n",
-                  ktime_to_us(tze->timestamp),
-                  ktime_to_ms(tze->duration));
+       if (tze->duration == KTIME_MIN) {
+               /* Mitigation in progress. */
+               duration_ms = ktime_to_ms(ktime_sub(ktime_get(), tze->timestamp));
+               c = '>';
+       } else {
+               duration_ms = ktime_to_ms(tze->duration);
+               c = '=';
+       }
+
+       seq_printf(s, ",-Mitigation at %lluus, duration%c%llums\n",
+                  ktime_to_us(tze->timestamp), c, duration_ms);
 
-       seq_printf(s, "| trip |     type | temp(°mC) | hyst(°mC) |  duration  |  avg(°mC) |  min(°mC) |  max(°mC) |\n");
+       seq_printf(s, "| trip |     type | temp(°mC) | hyst(°mC) |  duration   |  avg(°mC) |  min(°mC) |  max(°mC) |\n");
 
        for_each_trip_desc(tz, td) {
                const struct thermal_trip *trip = &td->trip;
@@ -806,12 +820,25 @@ static int tze_seq_show(struct seq_file *s, void *v)
                else
                        type = "hot";
 
-               seq_printf(s, "| %*d | %*s | %*d | %*d | %*lld | %*d | %*d | %*d |\n",
+               if (trip_stats->timestamp != KTIME_MAX) {
+                       /* Mitigation in progress. */
+                       ktime_t delta = ktime_sub(ktime_get(),
+                                                 trip_stats->timestamp);
+
+                       delta = ktime_add(delta, trip_stats->duration);
+                       duration_ms = ktime_to_ms(delta);
+                       c = '>';
+               } else {
+                       duration_ms = ktime_to_ms(trip_stats->duration);
+                       c = ' ';
+               }
+
+               seq_printf(s, "| %*d | %*s | %*d | %*d | %c%*lld | %*d | %*d | %*d |\n",
                           4 , trip_id,
                           8, type,
                           9, trip->temperature,
                           9, trip->hysteresis,
-                          10, ktime_to_ms(trip_stats->duration),
+                          c, 10, duration_ms,
                           9, trip_stats->avg,
                           9, trip_stats->min,
                           9, trip_stats->max);