ACK: [PATCH] cpu: cpufreq: tidy code, show advice when cpu scaling unavailable (LP: #1267959)

Alex Hung alex.hung at canonical.com
Thu Feb 13 09:54:00 UTC 2014


On 02/11/2014 10:11 PM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> A few cleanups and some extra advice:
>    1) make no_cpufreq a bool
>    2) make cpu_mkpath inline
>    3) rename HzToHuman to hz_to_human
>    4) add read_freqs_available() to read CPU freqs
>    5) add advice when cpu freq scaling is not available
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>   src/cpu/cpufreq/cpufreq.c | 118 +++++++++++++++++++++++-----------------------
>   1 file changed, 58 insertions(+), 60 deletions(-)
>
> diff --git a/src/cpu/cpufreq/cpufreq.c b/src/cpu/cpufreq/cpufreq.c
> index c2b9ef8..993acb4 100644
> --- a/src/cpu/cpufreq/cpufreq.c
> +++ b/src/cpu/cpufreq/cpufreq.c
> @@ -26,6 +26,7 @@
>   #include <stdio.h>
>   #include <stdlib.h>
>   #include <string.h>
> +#include <stdbool.h>
>   #include <unistd.h>
>   #include <sys/types.h>
>   #include <limits.h>
> @@ -50,7 +51,7 @@ typedef struct {
>   static int number_of_speeds = -1;
>   static int total_tests = 1;
>   static int performed_tests = 0;
> -static int no_cpufreq = 0;
> +static bool no_cpufreq = false;
>   static uint64_t top_speed = 0;
>   static int num_cpus;
>
> @@ -58,7 +59,7 @@ static int num_cpus;
>   #define GET_PERFORMANCE_MIN (1)
>   #define GET_PERFORMANCE_AVG (2)
>
> -static void cpu_mkpath(
> +static inline void cpu_mkpath(
>   	char *const path,
>   	const int len,
>   	const int cpu,
> @@ -67,22 +68,6 @@ static void cpu_mkpath(
>   	snprintf(path, len, "%s/cpu%i/cpufreq/%s", FWTS_CPU_PATH, cpu, name);
>   }
>
> -static int count_ints(char *text)
> -{
> -	char *str = text;
> -	int count = 0;
> -
> -	while (str && strlen(str) > 0) {
> -		char *str2 = strchr(str, ' ');
> -		if (!str2)
> -			break;
> -		str = str2 + 1;
> -		count++;
> -	}
> -
> -	return count;
> -}
> -
>   static void set_governor(fwts_framework *fw, const int cpu)
>   {
>   	char path[PATH_MAX];
> @@ -92,8 +77,8 @@ static void set_governor(fwts_framework *fw, const int cpu)
>   	if (fwts_set("userspace", path) != FWTS_OK) {
>   		if (!no_cpufreq) {
>   			fwts_warning(fw,
> -				"Frequency scaling not supported.");
> -			no_cpufreq = 1;
> +				"Cannot set CPU scaling governor to userspace scaling.");
> +			no_cpufreq = true;
>   		}
>   	}
>   }
> @@ -130,7 +115,6 @@ static void set_HZ(fwts_framework *fw, const int cpu, const uint32_t Hz)
>   	fwts_set(buffer, path);
>
>   	sched_setaffinity(0, sizeof(oldset), &oldset);
> -
>   }
>
>   #ifdef FWTS_ARCH_INTEL
> @@ -187,7 +171,7 @@ static int get_performance_repeat(
>   }
>   #endif
>
> -static char *HzToHuman(const uint32_t hz)
> +static char *hz_to_human(const uint32_t hz)
>   {
>   	static char buffer[32];
>   	unsigned long long Hz;
> @@ -246,15 +230,42 @@ static int cpu_freq_compare(const void *v1, const void *v2)
>   	return cpu_freq1->Hz - cpu_freq2->Hz;
>   }
>
> -static void do_cpu(fwts_framework *fw, const int cpu)
> +static int read_freqs_available(const int cpu, fwts_cpu_freq *freqs)
>   {
>   	char path[PATH_MAX];
>   	char line[4096];
> -	fwts_cpu_freq freqs[MAX_FREQS];
>   	FILE *file;
>   	char *c, *c2;
> -	int i;
> -	int speedcount;
> +	int i = 0;
> +
> +	memset(line, 0, sizeof(line));
> +	cpu_mkpath(path, sizeof(path), cpu, "scaling_available_frequencies");
> +	if ((file = fopen(path, "r")) == NULL)
> +		return 0;
> +	c = fgets(line, 4095, file);
> +	fclose(file);
> +	if (!c)
> +		return 0;
> +
> +	while ((i < MAX_FREQS) && c && strlen(c) > 1) {
> +		c2 = strchr(c, ' ');
> +		if (c2) {
> +			*c2 = 0;
> +			c2++;
> +		} else
> +			c2 = NULL;
> +
> +		freqs[i].Hz = strtoull(c, NULL, 10);
> +		c = c2;
> +		i++;
> +	}
> +	return i;
> +}
> +
> +static void do_cpu(fwts_framework *fw, const int cpu)
> +{
> +	fwts_cpu_freq freqs[MAX_FREQS];
> +	int i, speedcount;
>   	static int warned = 0;
>   	bool warned_PSS = false;
>   	uint64_t cpu_top_speed = 0;
> @@ -264,39 +275,30 @@ static void do_cpu(fwts_framework *fw, const int cpu)
>   	const uint32_t bios_limit = get_bios_limit(cpu);
>
>   	memset(freqs, 0, sizeof(freqs));
> -	memset(line, 0, sizeof(line));
> -
>   	set_governor(fw, cpu);
>
> -	cpu_mkpath(path, sizeof(path), cpu, "scaling_available_frequencies");
> -	if ((file = fopen(path, "r")) == NULL) {
> +	if ((speedcount = read_freqs_available(cpu, freqs)) == 0) {
>   		if (!no_cpufreq) {
> -			fwts_warning(fw, "Frequency scaling not supported.");
> -			no_cpufreq = 1;
> +			char path[PATH_MAX];
> +			char *driver;
> +
> +			no_cpufreq = true;
> +			fwts_warning(fw, "CPU frequency scaling not supported.");
> +
> +			cpu_mkpath(path, sizeof(path), cpu, "scaling_driver");
> +			driver = fwts_get(path);
> +			if (driver) {
> +				fwts_advice(fw, "Scaling driver '%s' is enabled and this "
> +					"does not seem to allow CPU frequency scaling.", driver);
> +				free(driver);
> +			}
>   		}
>   		return;
>   	}
> -	if (fgets(line, 4095, file) == NULL) {
> -		fclose(file);
> -		return;
> -	}
> -	fclose(file);
> -
>   	if (total_tests == 1)
> -		total_tests = (2 + count_ints(line)) *
> -			num_cpus + 2;
> +		total_tests = ((2 + speedcount) * num_cpus) + 2;
>
> -	c = line;
> -	i = 0;
> -	while ((i < MAX_FREQS) && c && strlen(c) > 1) {
> -		c2 = strchr(c, ' ');
> -		if (c2) {
> -			*c2 = 0;
> -			c2++;
> -		} else
> -			c2 = NULL;
> -
> -		freqs[i].Hz = strtoull(c, NULL, 10);
> +	for (i = 0; i < speedcount; i++) {
>   		set_HZ(fw, cpu, freqs[i].Hz);
>
>   		if ((claimed_hz != 0) && (claimed_hz < freqs[i].Hz))
> @@ -314,11 +316,7 @@ static void do_cpu(fwts_framework *fw, const int cpu)
>
>   		performed_tests++;
>   		fwts_progress(fw, 100 * performed_tests/total_tests);
> -
> -		i++;
> -		c = c2;
>   	}
> -	speedcount = i;
>
>   	if (cpu_top_speed > top_speed)
>   		top_speed = cpu_top_speed;
> @@ -331,7 +329,7 @@ static void do_cpu(fwts_framework *fw, const int cpu)
>   			"There were %d CPU frequencies larger than the _PSS "
>   			"maximum CPU frequency of %s for CPU %d. Has %s "
>   			"been set too low?",
> -			claimed_hz_too_low, HzToHuman(claimed_hz), cpu, path);
> +			claimed_hz_too_low, hz_to_human(claimed_hz), cpu, path);
>   	}
>
>   	if (bios_limit_too_low) {
> @@ -341,7 +339,7 @@ static void do_cpu(fwts_framework *fw, const int cpu)
>   		fwts_warning(fw,
>   			"The CPU frequency BIOS limit %s for CPU %d was set to %s "
>   			"which is lower than some of the ACPI scaling frequencies.",
> -			path, cpu, HzToHuman(bios_limit));
> +			path, cpu, hz_to_human(bios_limit));
>   	}
>
>   	if (claimed_hz_too_low || bios_limit_too_low)
> @@ -352,7 +350,7 @@ static void do_cpu(fwts_framework *fw, const int cpu)
>   	fwts_log_info_verbatum(fw, "-----------+----------------+-----------");
>   	for (i = 0; i < speedcount; i++)
>   		fwts_log_info_verbatum(fw, "%10s |     %5.1f %%    | %9" PRIu64,
> -			HzToHuman(freqs[i].Hz),
> +			hz_to_human(freqs[i].Hz),
>   			100.0 * freqs[i].speed/cpu_top_speed,
>   			freqs[i].speed);
>
> @@ -384,8 +382,8 @@ static void do_cpu(fwts_framework *fw, const int cpu)
>   				"Supposedly higher frequency %s is slower (%" PRIu64
>   				" bogo loops) than frequency %s (%" PRIu64
>   				" bogo loops) on CPU %i.",
> -				HzToHuman(freqs[i+1].Hz), freqs[i+1].speed,
> -				HzToHuman(freqs[i].Hz), freqs[i].speed,
> +				hz_to_human(freqs[i+1].Hz), freqs[i+1].speed,
> +				hz_to_human(freqs[i].Hz), freqs[i].speed,
>   				cpu);
>
>   		if ((freqs[i].Hz > claimed_hz) && !warned_PSS) {
>

Acked-by: Alex Hung <alex.hung at canonical.com>

-- 
Cheers,
Alex Hung



More information about the fwts-devel mailing list