[PATCH 03/11] cpu/cpufreq: Add a separate cpufreq consistency test
Jeremy Kerr
jk at ozlabs.org
Thu May 21 09:34:27 UTC 2015
Add a separate test to check that cpufreq tables are consistent across
processors, instead of the current check included in the do_cpu path.
Signed-off-by: Jeremy Kerr <jk at ozlabs.org>
---
src/cpu/cpufreq/cpufreq.c | 68 +++++++++++++++++++++++++++++++++-----
1 file changed, 60 insertions(+), 8 deletions(-)
diff --git a/src/cpu/cpufreq/cpufreq.c b/src/cpu/cpufreq/cpufreq.c
index 93260b3..517c750 100644
--- a/src/cpu/cpufreq/cpufreq.c
+++ b/src/cpu/cpufreq/cpufreq.c
@@ -356,16 +356,8 @@ static void do_cpu(fwts_framework *fw, struct cpu *cpu)
cpu->freqs[i].speed, turbo);
}
- if (number_of_speeds == -1)
- number_of_speeds = cpu->n_freqs;
-
fwts_log_nl(fw);
- if (number_of_speeds != cpu->n_freqs)
- fwts_failed(fw, LOG_LEVEL_MEDIUM,
- "CPUFreqPStates",
- "Not all processors support the same number of P states.");
-
if (cpu->n_freqs < 2)
return;
@@ -620,6 +612,65 @@ static int cpufreq_test1(fwts_framework *fw)
return FWTS_OK;
}
+static int cpufreq_compare_freqs(fwts_framework *fw, struct cpu *c1,
+ struct cpu *c2)
+{
+ int i;
+
+ if (c1->n_freqs != c2->n_freqs) {
+ fwts_log_warning(fw, "cpu %d has %d freqs, cpu %d has %d freqs",
+ c1->idx, c1->n_freqs,
+ c2->idx, c2->n_freqs);
+ return FWTS_ERROR;
+ }
+
+ for (i = 0; i < c1->n_freqs; i++) {
+ if (c1->freqs[i].Hz != c2->freqs[i].Hz) {
+ fwts_log_warning(fw, "freq entry %d: "
+ "cpu %d is %" PRId64 ", "
+ "cpu %d is %" PRId64, i,
+ c1->idx, c1->freqs[i].Hz,
+ c2->idx, c2->freqs[i].Hz);
+ return FWTS_ERROR;
+ }
+ }
+
+ return FWTS_OK;
+}
+
+static int cpufreq_test_consistency(fwts_framework *fw)
+{
+ struct cpu *cpu, *cpu0;
+ bool consistent = true;
+ int i;
+
+ if (num_cpus < 2) {
+ fwts_skipped(fw, "Test skipped, only one processor present");
+ return FWTS_SKIP;
+ }
+
+ cpu0 = &cpus[0];
+
+ for (i = 1; i < num_cpus; i++) {
+ cpu = &cpus[i];
+ if (cpufreq_compare_freqs(fw, cpu0, cpu) != FWTS_OK) {
+ consistent = false;
+ fwts_log_error(fw,
+ "cpu %d has an inconsistent frequency table",
+ cpu->idx);
+ }
+ }
+
+ if (!consistent)
+ fwts_failed(fw, LOG_LEVEL_MEDIUM, "CPUFreqInconsistent",
+ "inconsistencies found in CPU "
+ "frequency tables");
+ else
+ fwts_passed(fw, "CPU frequency tables are consistent");
+
+ return FWTS_OK;
+}
+
static int cpu_freq_compare(const void *v1, const void *v2)
{
const fwts_cpu_freq *f1 = v1;
@@ -709,6 +760,7 @@ static int cpufreq_deinit(fwts_framework *fw)
}
static fwts_framework_minor_test cpufreq_tests[] = {
+ { cpufreq_test_consistency, "CPU frequency table consistency" },
#ifdef FWTS_ARCH_INTEL
{ cpufreq_test1, "CPU P-State tests." },
#else
More information about the fwts-devel
mailing list