diff options
author | PA4WDH | 2023-05-27 10:47:05 +0200 |
---|---|---|
committer | PA4WDH | 2023-05-27 10:47:05 +0200 |
commit | bd331dbb839d7ee8b2d8abeb89d4fd650db58a9d (patch) | |
tree | 617c55fff6034445caf56ff4c65779bda5b3d7f5 | |
parent | Added restart delay in Gentoo initscript (diff) | |
download | cputemp2maxfreq-bd331dbb839d7ee8b2d8abeb89d4fd650db58a9d.tar.gz cputemp2maxfreq-bd331dbb839d7ee8b2d8abeb89d4fd650db58a9d.tar.bz2 cputemp2maxfreq-bd331dbb839d7ee8b2d8abeb89d4fd650db58a9d.zip |
Use CPU Transition Latency as checkdelay when setting new scaling_max_freq
-rw-r--r-- | cpufreq.c | 4 | ||||
-rw-r--r-- | cpufreq.h | 4 | ||||
-rw-r--r-- | cputemp2maxfreq.c | 9 | ||||
-rw-r--r-- | cputemp2maxfreq.h | 15 | ||||
-rw-r--r-- | sysfs.c | 4 |
5 files changed, 22 insertions, 14 deletions
@@ -22,7 +22,7 @@ int cpufreq_is_cpu(char *name) } // Set a cpufreq parameter to a value -int cpufreq_set_str(char *parameter,char *value,int checkdelay) +int cpufreq_set_str(char *parameter,char *value,long int checkdelay) { int fd; char sysfs_file[128]; @@ -94,7 +94,7 @@ int cpufreq_set_str(char *parameter,char *value,int checkdelay) // This is just a wrapper around cpufreq_set_str with long int to string // convertion -int cpufreq_set_long_int(char *parameter,long int value,int checkdelay) +int cpufreq_set_long_int(char *parameter,long int value,long int checkdelay) { char buf[255]; @@ -1,7 +1,7 @@ #ifndef HAVE_CPUFREQ_H #define HAVE_CPUFREQ_H -int cpufreq_set_str(char *parameter,char *value,int checkdelay); -int cpufreq_set_long_int(char *parameter,long int value,int checkdelay); +int cpufreq_set_str(char *parameter,char *value,long int checkdelay); +int cpufreq_set_long_int(char *parameter,long int value,long int checkdelay); #endif diff --git a/cputemp2maxfreq.c b/cputemp2maxfreq.c index 556e404..9600d13 100644 --- a/cputemp2maxfreq.c +++ b/cputemp2maxfreq.c @@ -85,15 +85,18 @@ int main(int argc,char **argv) cpudata.min_freq=sysfs_read_long_int("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq"); cpudata.max_freq=sysfs_read_long_int("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq"); cpudata.scale_max=sysfs_read_long_int("/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq"); + cpudata.transition_latency=sysfs_read_long_int("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_transition_latency"); config.logger("CPU data:"); config.logger("Minimum frequency: %ld",cpudata.min_freq); config.logger("Maximum frequency: %ld",cpudata.max_freq); config.logger("Scaling maximum frequency: %ld",cpudata.scale_max); + config.logger("Transition Latency: %ld",cpudata.transition_latency); if ((cpudata.min_freq<VALID_FREQ_MIN) || (cpudata.min_freq>VALID_FREQ_MAX) || (cpudata.max_freq<VALID_FREQ_MIN) || (cpudata.max_freq>VALID_FREQ_MAX) || - (cpudata.scale_max<VALID_FREQ_MIN) || (cpudata.scale_max>VALID_FREQ_MAX)) + (cpudata.scale_max<VALID_FREQ_MIN) || (cpudata.scale_max>VALID_FREQ_MAX) || + (cpudata.transition_latency<VALID_TRANS_MIN) || (cpudata.transition_latency>VALID_TRANS_MAX)) { // If we have to fail now, there's not much we can do because we have no data config.logger("Invalid CPU data, exiting"); @@ -166,7 +169,7 @@ int main(int argc,char **argv) config.logger("Increase scaling_max_freq to %ld",newfreq); // Set new value and validate - if (cpufreq_set_long_int("scaling_max_freq",newfreq,100)<0) + if (cpufreq_set_long_int("scaling_max_freq",newfreq,cpudata.transition_latency)<0) { config.logger("Failed to set scaling_max_freq, exiting"); failsafe(1); @@ -189,7 +192,7 @@ int main(int argc,char **argv) config.logger("Decrease scaling_max_freq to %ld",newfreq); // Set new value and validate - if (cpufreq_set_long_int("scaling_max_freq",newfreq,100)<0) + if (cpufreq_set_long_int("scaling_max_freq",newfreq,cpudata.transition_latency)<0) { config.logger("Failed to set scaling_max_freq, exiting"); failsafe(1); diff --git a/cputemp2maxfreq.h b/cputemp2maxfreq.h index 984fabc..31f6da1 100644 --- a/cputemp2maxfreq.h +++ b/cputemp2maxfreq.h @@ -17,12 +17,17 @@ #define VALID_INTERVAL_MIN 1 #define VALID_INTERVAL_MAX 30 +// Valid transition delays between 0 and 100000 +#define VALID_TRANS_MIN 0 +#define VALID_TRANS_MAX 100000 + struct s_cpudata { - long int min_freq; // CPU's minimum frequency - long int max_freq; // CPU's maximum frequency - long int cur_freq; // CPU's current frequency - long int cur_temp; // CPU's current temperature - long int scale_max; // Governor's maximum scaling frequency + long int min_freq; // CPU's minimum frequency + long int max_freq; // CPU's maximum frequency + long int cur_freq; // CPU's current frequency + long int cur_temp; // CPU's current temperature + long int scale_max; // Governor's maximum scaling frequency + long int transition_latency; // CPU's transition latency }; struct s_config { @@ -47,7 +47,7 @@ long int sysfs_read_long_int(char *sysfs_file) return strtoll((char*)&buf,NULL,10); } -int sysfs_write_str(char *sysfs_file,char *value,int checkdelay) +int sysfs_write_str(char *sysfs_file,char *value,long int checkdelay) { int sysfs_handle; size_t len; @@ -66,7 +66,7 @@ int sysfs_write_str(char *sysfs_file,char *value,int checkdelay) DEBUG2_SYSFS("Written %zd bytes\n",len); // What if instructed to - if (checkdelay>0) usleep(checkdelay*1000); + if (checkdelay>0) usleep(checkdelay); // Validate we actually set what we want to set sysfs_read_str(sysfs_file,buf,sizeof(buf)); |