From da1b103a50732804bec48429523011322eb1acf5 Mon Sep 17 00:00:00 2001 From: PA4WDH Date: Sun, 21 May 2023 11:01:50 +0200 Subject: Improve error handling --- cpufreq.c | 6 +++++- cputemp2maxfreq.c | 30 +++++++++++++++++++++++++++--- failsafe.c | 15 +++++++-------- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/cpufreq.c b/cpufreq.c index d9e0e4e..75eb774 100644 --- a/cpufreq.c +++ b/cpufreq.c @@ -20,6 +20,7 @@ int cpufreq_set_str(char *parameter,char *value,int checkdelay) { int fd; char sysfs_file[128]; + int done=0; DEBUG1_CPUFREQ("Set %s to %s\n",parameter,value) @@ -66,11 +67,14 @@ int cpufreq_set_str(char *parameter,char *value,int checkdelay) DEBUG1_CPUFREQ("Failed to set %s\n",d->d_name); return -1; } + done++; } bpos+=d->d_reclen; } } close(fd); + + return done; } int cpufreq_set_long_int(char *parameter,long int value,int checkdelay) @@ -78,5 +82,5 @@ int cpufreq_set_long_int(char *parameter,long int value,int checkdelay) char buf[255]; snprintf(buf,255,"%ld",value); - cpufreq_set_str(parameter,buf,checkdelay); + return cpufreq_set_str(parameter,buf,checkdelay); } diff --git a/cputemp2maxfreq.c b/cputemp2maxfreq.c index 6ea71bf..00d8f4f 100644 --- a/cputemp2maxfreq.c +++ b/cputemp2maxfreq.c @@ -57,7 +57,7 @@ int main() } // Set the governor - if (cpufreq_set_str("scaling_governor",config.governor,0)!=0) + if (cpufreq_set_str("scaling_governor",config.governor,0)<0) { printf("Failed to set governor, error %d (%s).\n",errno,strerror(errno)); @@ -84,24 +84,48 @@ int main() DEBUG1_MAIN("Data: %ld %ld %ld %ld %ld\n",cpudata.cur_temp,config.max_temp,cpudata.max_freq,cpudata.scale_max,cpudata.cur_freq); +// Check if we should increase if ((cpudata.cur_tempcpudata.max_freq) newfreq=cpudata.max_freq; DEBUG1_MAIN("Increase to %ld\n",newfreq); - cpufreq_set_long_int("scaling_max_freq",newfreq,100); + +// Set new value and validate + if (cpufreq_set_long_int("scaling_max_freq",newfreq,100)<0) + { + printf("Failed to set scaling_max_freq, exiting.\n"); + failsafe(1); + } cpudata.scale_max=sysfs_read_long_int("/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq"); + if ((cpudata.scale_maxVALID_FREQ_MAX)) + { + printf("Invalid scale_max_freq reported, exiting,\n"); + failsafe(1); + } } +// Check if we should decrease if ((cpudata.cur_temp>config.max_temp) && (cpudata.scale_max>cpudata.min_freq)) { diff=(cpudata.cur_temp-config.max_temp)/1000; newfreq=cpudata.scale_max-(config.freq_step*diff); if (newfreqVALID_FREQ_MAX)) + { + printf("Invalid scale_max_freq reported, exiting,\n"); + failsafe(1); + } } sleep(config.interval); diff --git a/failsafe.c b/failsafe.c index 3b9fe48..fec00e8 100644 --- a/failsafe.c +++ b/failsafe.c @@ -10,24 +10,23 @@ extern struct s_config config; void failsafe(int code) { - printf("Failed to set governor, error %d (%s).\n",errno,strerror(errno)); - -// We failed to set the governor, try to fail safe. First try the CPU minimum -// frequency, if that doesn't work out try the fallback frequency - if (cpufreq_set_long_int("scaling_max_freq",cpudata.min_freq,100)==0) +// First try to set the CPU to it's minimum frequency + if (cpufreq_set_long_int("scaling_max_freq",cpudata.min_freq,100)>0) { - printf("Set scaling frequency to CPU's minimum frequency."); + printf("Set scaling frequency to CPU's minimum frequency.\n"); exit(code); } printf("Failed to set scaling frequency to CPU's minimum frequency, error: %d (%s).\n",errno,strerror(errno)); - if (cpufreq_set_long_int("scaling_max_freq",config.fallback_freq,100)==0) +// If that failed, try the fallback frequency + if (cpufreq_set_long_int("scaling_max_freq",config.fallback_freq,100)>0) { - printf("Set scaling frequency to fallback frequency."); + printf("Set scaling frequency to fallback frequency.\n"); exit(code); } printf("Failed to set scaling frequency to fallback frequency, error: %d (%s).\n",errno,strerror(errno)); +// Everything failed, issue a warning printf("All safety measures failed, watch out not to fry your hardware.\n"); exit(code); } -- cgit v1.2.3