[PATCH 05/11] cpu/cpufreq: Do bios limit and claimed max checks as separate tests

Jeremy Kerr jk at ozlabs.org
Thu May 21 09:34:27 UTC 2015


Rather than combining the bios limit and claimed max tests into the
do_cpu tests, separate them out into individual tests.

Signed-off-by: Jeremy Kerr <jk at ozlabs.org>

---
 src/cpu/cpufreq/cpufreq.c |  123 ++++++++++++++++++++++++--------------
 1 file changed, 80 insertions(+), 43 deletions(-)

diff --git a/src/cpu/cpufreq/cpufreq.c b/src/cpu/cpufreq/cpufreq.c
index 4adb58c..0b4d8a7 100644
--- a/src/cpu/cpufreq/cpufreq.c
+++ b/src/cpu/cpufreq/cpufreq.c
@@ -258,12 +258,7 @@ static void do_cpu(fwts_framework *fw, struct cpu *cpu)
 {
 	int i;
 	static int warned = 0;
-	bool warned_PSS = false;
 	uint64_t cpu_top_perf = 0;
-	int claimed_hz_too_low = 0;
-	int bios_limit_too_low = 0;
-	const uint64_t claimed_hz = get_claimed_hz(cpu);
-	const uint64_t bios_limit = get_bios_limit(cpu);
 
 	cpu_set_governor(fw, cpu, "userspace");
 
@@ -291,11 +286,6 @@ static void do_cpu(fwts_framework *fw, struct cpu *cpu)
 	for (i = 0; i < cpu->n_freqs; i++) {
 		cpu_set_frequency(fw, cpu, cpu->freqs[i].Hz);
 
-		if ((claimed_hz != 0) && (claimed_hz < cpu->freqs[i].Hz))
-			claimed_hz_too_low++;
-		if ((bios_limit != 0) && (bios_limit < cpu->freqs[i].Hz))
-			bios_limit_too_low++;
-
 		if (fwts_cpu_performance(fw, cpu->idx, &cpu->freqs[i].speed)
 				!= FWTS_OK) {
 			fwts_log_error(fw, "Failed to get CPU performance for "
@@ -313,31 +303,6 @@ static void do_cpu(fwts_framework *fw, struct cpu *cpu)
 	if (cpu_top_perf > top_speed)
 		top_speed = cpu_top_perf;
 
-	if (claimed_hz_too_low) {
-		char path[PATH_MAX];
-
-		cpu_mkpath(path, sizeof(path), cpu, "scaling_max_freq");
-		fwts_warning(fw,
-			"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, hz_to_human(claimed_hz),
-			cpu->idx, path);
-	}
-
-	if (bios_limit_too_low) {
-		char path[PATH_MAX];
-
-		cpu_mkpath(path, sizeof(path), cpu, "bios_limit");
-		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->idx, hz_to_human(bios_limit));
-	}
-
-	if (claimed_hz_too_low || bios_limit_too_low)
-		fwts_log_nl(fw);
-
 	fwts_log_info(fw, "CPU %d: %i CPU frequency steps supported.",
 			cpu->idx, cpu->n_freqs);
 	fwts_log_info_verbatum(fw, " Frequency | Relative Speed | Bogo loops");
@@ -378,14 +343,6 @@ static void do_cpu(fwts_framework *fw, struct cpu *cpu)
 				hz_to_human(cpu->freqs[i].Hz),
 				cpu->freqs[i].speed,
 				cpu->idx);
-
-		if ((cpu->freqs[i].Hz > claimed_hz) && !warned_PSS) {
-			warned_PSS = true;
-			fwts_warning(fw, "Frequency %" PRIu64
-				" not achievable; _PSS limit of %" PRIu64
-					" in effect?",
-				cpu->freqs[i].Hz, claimed_hz);
-		}
 	}
 }
 
@@ -706,6 +663,84 @@ static int cpufreq_test_duplicates(fwts_framework *fw)
 	return FWTS_OK;
 }
 
+static int cpufreq_test_bios_limits(fwts_framework *fw)
+{
+	bool ok, present;
+	int i;
+
+	present = false;
+	ok = true;
+
+	for (i = 0; i < num_cpus; i++) {
+		struct cpu *cpu = &cpus[i];
+		uint64_t bios_limit;
+
+		bios_limit = get_bios_limit(cpu);
+
+		if (!bios_limit)
+			continue;
+
+		present = true;
+
+		if (bios_limit < cpu->freqs[cpu->n_freqs-1].Hz) {
+			ok = false;
+			fwts_warning(fw, "cpu %d has bios limit of %" PRId64
+					", lower than max freq of %"
+					PRId64, cpu->idx, bios_limit,
+					cpu->freqs[cpu->n_freqs-1].Hz);
+		}
+	}
+
+	if (!present)
+		fwts_passed(fw, "No BIOS limits imposed");
+	else if (ok)
+		fwts_passed(fw, "CPU BIOS limit OK");
+	else
+		fwts_failed(fw, LOG_LEVEL_MEDIUM, "CPUFreqBIOSLimit",
+				"CPU BIOS limit is set too low");
+
+	return FWTS_OK;
+}
+
+static int cpufreq_test_claimed_max(fwts_framework *fw)
+{
+	bool ok, present;
+	int i;
+
+	present = false;
+	ok = true;
+
+	for (i = 0; i < num_cpus; i++) {
+		struct cpu *cpu = &cpus[i];
+		uint64_t max;
+
+		max = get_claimed_hz(cpu);
+
+		if (!max)
+			continue;
+
+		present = true;
+
+		if (max > cpu->freqs[cpu->n_freqs-1].Hz) {
+			ok = false;
+			fwts_warning(fw, "cpu %d has claimed frequency of %"
+					PRId64 ", higher than max freq of %"
+					PRId64, cpu->idx, max,
+					cpu->freqs[cpu->n_freqs-1].Hz);
+		}
+	}
+
+	if (!present)
+		fwts_passed(fw, "No max frequencies present");
+	else if (ok)
+		fwts_passed(fw, "CPU max frequencies OK");
+	else
+		fwts_failed(fw, LOG_LEVEL_MEDIUM, "CPUFreqClaimedMax",
+				"CPU max frequency is unreachable");
+
+	return FWTS_OK;
+}
+
 static int cpu_freq_compare(const void *v1, const void *v2)
 {
 	const fwts_cpu_freq *f1 = v1;
@@ -797,6 +832,8 @@ static int cpufreq_deinit(fwts_framework *fw)
 static fwts_framework_minor_test cpufreq_tests[] = {
 	{ cpufreq_test_consistency,	"CPU frequency table consistency" },
 	{ cpufreq_test_duplicates,	"CPU frequency table duplicates" },
+	{ cpufreq_test_bios_limits,	"CPU frequency firmware limits" },
+	{ cpufreq_test_claimed_max,	"CPU frequency claimed maximum" },
 #ifdef FWTS_ARCH_INTEL
 	{ cpufreq_test1, "CPU P-State tests." },
 #else



More information about the fwts-devel mailing list