Commit bd700ba9 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

thermal/debugfs: Avoid printing zero duration for mitigation events in progress



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: 7ef01f22 ("thermal/debugfs: Add thermal debugfs information for mitigation episodes")
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarLukasz Luba <lukasz.luba@arm.com>
Tested-by: default avatarLukasz Luba <lukasz.luba@arm.com>
parent 31a0fa00
Loading
Loading
Loading
Loading
+33 −6
Original line number Diff line number Diff line
@@ -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,13 +770,23 @@ 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");

@@ -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);