lkml.org 
[lkml]   [2023]   [Aug]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH v4 08/10] ACPI: thermal: Rework thermal_get_trend()
Date
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Rework the ACPI thermal driver's .get_trend() callback function,
thermal_get_trend(), so that it does not call thermal_get_trip_type()
and thermal_get_trip_temp() which are going to be dropped.

This reduces the overhead of the function too, because it will always
carry out a trip point lookup once after the change.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---

v3 -> v4:
* Adjust for the lack of a direct way to get from the local trip point
representations to trips[i].

v2 -> v3: Rebase on top of the v2 of the previous patch.

v1 -> v2:
* Do not acquire thermal_check_lock in thermal_get_trend() (lockdep
would complain about this, because it is hold around thermal zone
locking and .get_trend() runs under the thermal zone lock). The
thermal zone locking added in the previous patches is sufficient
to protect this code.
* Check trips against invalid temperature values.
* Return an error for trips other than passive and active.
---
drivers/acpi/thermal.c | 68 +++++++++++++++++++++++++++----------------------
1 file changed, 38 insertions(+), 30 deletions(-)

Index: linux-pm/drivers/acpi/thermal.c
===================================================================
--- linux-pm.orig/drivers/acpi/thermal.c
+++ linux-pm/drivers/acpi/thermal.c
@@ -616,46 +616,54 @@ static int thermal_get_crit_temp(struct
}

static int thermal_get_trend(struct thermal_zone_device *thermal,
- int trip, enum thermal_trend *trend)
+ int trip_index, enum thermal_trend *trend)
{
struct acpi_thermal *tz = thermal_zone_device_priv(thermal);
- enum thermal_trip_type type;
- int i;
+ int t, i;

- if (thermal_get_trip_type(thermal, trip, &type))
+ if (!tz || trip_index < 0)
return -EINVAL;

- if (type == THERMAL_TRIP_ACTIVE) {
- int trip_temp;
- int temp = deci_kelvin_to_millicelsius_with_offset(
- tz->temperature, tz->kelvin_offset);
- if (thermal_get_trip_temp(thermal, trip, &trip_temp))
- return -EINVAL;
+ if (tz->trips.critical.valid)
+ trip_index--;

- if (temp > trip_temp) {
+ if (tz->trips.hot.valid)
+ trip_index--;
+
+ if (trip_index < 0)
+ return -EINVAL;
+
+ if (tz->trips.passive.valid && !trip_index--) {
+ t = tz->trips.passive.tc1 * (tz->temperature -
+ tz->last_temperature) +
+ tz->trips.passive.tc2 * (tz->temperature -
+ tz->trips.passive.temperature);
+ if (t > 0)
*trend = THERMAL_TREND_RAISING;
- return 0;
- } else {
- /* Fall back on default trend */
- return -EINVAL;
- }
+ else if (t < 0)
+ *trend = THERMAL_TREND_DROPPING;
+ else
+ *trend = THERMAL_TREND_STABLE;
+
+ return 0;
}

- /*
- * tz->temperature has already been updated by generic thermal layer,
- * before this callback being invoked
- */
- i = tz->trips.passive.tc1 * (tz->temperature - tz->last_temperature) +
- tz->trips.passive.tc2 * (tz->temperature - tz->trips.passive.temperature);
-
- if (i > 0)
- *trend = THERMAL_TREND_RAISING;
- else if (i < 0)
- *trend = THERMAL_TREND_DROPPING;
- else
- *trend = THERMAL_TREND_STABLE;
+ t = acpi_thermal_temp(tz, tz->temperature);
+
+ for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
+ if (tz->trips.active[i].valid && !trip_index--) {
+ int trip_temp;
+
+ trip_temp = acpi_thermal_temp(tz, tz->trips.active[i].temperature);
+ if (t > trip_temp) {
+ *trend = THERMAL_TREND_RAISING;
+ return 0;
+ }
+ break;
+ }
+ }

- return 0;
+ return -EINVAL;
}

static void acpi_thermal_zone_device_hot(struct thermal_zone_device *thermal)


\
 
 \ /
  Last update: 2023-08-04 23:26    [W:0.180 / U:2.088 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site