ACK: [PATCH 05/11] cpu/cpufreq: Do bios limit and claimed max checks as separate tests
Colin Ian King
colin.king at canonical.com
Tue May 26 09:24:52 UTC 2015
On 21/05/15 10:34, Jeremy Kerr wrote:
> 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
>
Again, good idea.
Acked-by: Colin Ian King <colin.king at canonical.com>
More information about the fwts-devel
mailing list