lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230712084840.3594-1-di.shen@unisoc.com>
Date:   Wed, 12 Jul 2023 16:48:40 +0800
From:   Di Shen <di.shen@...soc.com>
To:     <lukasz.luba@....com>, <rafael@...nel.org>,
        <daniel.lezcano@...aro.org>, <amitk@...nel.org>,
        <rui.zhang@...el.com>
CC:     <linux-pm@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
        <xuewen.yan@...soc.com>, <jeson.gao@...soc.com>,
        <orsonzhai@...il.com>, <zhanglyra@...il.com>, <di.shen@...soc.com>
Subject: [PATCH] Revert "thermal: power allocator: change the 'k_*' always in estimate_pid_constants()"

This reverts commit 90a996544946d1d4834ec2ec8add586edd905779.

The commit ensures that the pid constants are updated when
sustainable_power changes, but it makes it impossible for
the driver to set the pid constants when the sustainable_power
is not changed.

When the driver tries to register a thermal zone device by
thermal_zone_device_register_with_trips(const char *type,
	struct thermal_trip *trips, int num_trips, int mask,
	void *devdata, struct thermal_zone_device_ops *ops,
	struct thermal_zone_params *tzp, int passive_delay,
	int polling_delay)
and passes the private thermal_zone_params structure data,

thermal_zone_devcice_register_with_trips
	|
thermal_set_governor
	|
bind_to_tz
	|
power_allocator_bind
	|
estimate_pid_constants

the tzp->k_* will not be the data that driver have given,
but the data estimated by sustainable_power.

To make it possible for driver to add its own pid constants,
the 'force' flag is needed to indicate whether the tzp->k_*
should be estimated by sustainable_power or not.

Signed-off-by: Di Shen <di.shen@...soc.com>
---
 drivers/thermal/gov_power_allocator.c | 28 ++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/drivers/thermal/gov_power_allocator.c b/drivers/thermal/gov_power_allocator.c
index 8642f1096b91..f1753291b827 100644
--- a/drivers/thermal/gov_power_allocator.c
+++ b/drivers/thermal/gov_power_allocator.c
@@ -116,13 +116,18 @@ static u32 estimate_sustainable_power(struct thermal_zone_device *tz)
  * @sustainable_power:	sustainable power for the thermal zone
  * @trip_switch_on:	trip point number for the switch on temperature
  * @control_temp:	target temperature for the power allocator governor
+ * @force:	whether to force the update of the constants
  *
  * This function is used to update the estimation of the PID
  * controller constants in struct thermal_zone_parameters.
+ *
+ * If @force is not set, the values in the thermal zone's parameters
+ * are preserved if they are not zero.  If @force is set, the values
+ * in thermal zone's parameters are overwritten.
  */
 static void estimate_pid_constants(struct thermal_zone_device *tz,
 				   u32 sustainable_power, int trip_switch_on,
-				   int control_temp)
+				   int control_temp, bool force)
 {
 	struct thermal_trip trip;
 	u32 temperature_threshold = control_temp;
@@ -144,14 +149,18 @@ static void estimate_pid_constants(struct thermal_zone_device *tz,
 	if (!temperature_threshold)
 		return;
 
-	tz->tzp->k_po = int_to_frac(sustainable_power) /
-		temperature_threshold;
+	if (!tz->tzp->k_po || force)
+		tz->tzp->k_po = int_to_frac(sustainable_power) /
+			temperature_threshold;
 
-	tz->tzp->k_pu = int_to_frac(2 * sustainable_power) /
-		temperature_threshold;
+	if (!tz->tzp->k_pu || force)
+		tz->tzp->k_pu = int_to_frac(2 * sustainable_power) /
+			temperature_threshold;
 
-	k_i = tz->tzp->k_pu / 10;
-	tz->tzp->k_i = k_i > 0 ? k_i : 1;
+	if (!tz->tzp->k_i || force) {
+		k_i = tz->tzp->k_pu / 10;
+		tz->tzp->k_i = k_i > 0 ? k_i : 1;
+	}
 
 	/*
 	 * The default for k_d and integral_cutoff is 0, so we can
@@ -184,7 +193,8 @@ static u32 get_sustainable_power(struct thermal_zone_device *tz,
 	/* Check if it's init value 0 or there was update via sysfs */
 	if (sustainable_power != params->sustainable_power) {
 		estimate_pid_constants(tz, sustainable_power,
-				       params->trip_switch_on, control_temp);
+				       params->trip_switch_on, control_temp,
+				       true);
 
 		/* Do the estimation only once and make available in sysfs */
 		tz->tzp->sustainable_power = sustainable_power;
@@ -662,7 +672,7 @@ static int power_allocator_bind(struct thermal_zone_device *tz)
 		if (!ret)
 			estimate_pid_constants(tz, tz->tzp->sustainable_power,
 					       params->trip_switch_on,
-					       trip.temperature);
+					       trip.temperature, false);
 	}
 
 	reset_pid_controller(params);
-- 
2.17.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ