[PATCH 4/4] cpu: cpufreq: Use new fwts_cpu_performance() helper function
Keng-Yu Lin
kengyu at canonical.com
Tue Dec 18 02:24:34 UTC 2012
On Tue, Dec 11, 2012 at 8:04 PM, Colin King <colin.king at canonical.com> wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Use fwts_cpu_performance(), remove duplicated code. Also change
> CPU loop counts from unsigned longs to uint64_t and CPU frequencies
> to uint32_t.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/cpu/cpufreq/cpufreq.c | 157 +++++++++++++++++++++++-----------------------
> 1 file changed, 80 insertions(+), 77 deletions(-)
>
> diff --git a/src/cpu/cpufreq/cpufreq.c b/src/cpu/cpufreq/cpufreq.c
> index e8ae9b0..146e3f2 100644
> --- a/src/cpu/cpufreq/cpufreq.c
> +++ b/src/cpu/cpufreq/cpufreq.c
> @@ -37,19 +37,20 @@
> #include <time.h>
> #include <math.h>
> #include <ctype.h>
> +#include <inttypes.h>
>
> #define FWTS_CPU_PATH "/sys/devices/system/cpu"
>
> typedef struct {
> - unsigned long Hz;
> - unsigned long speed;
> + uint32_t Hz;
> + uint64_t speed;
> } fwts_cpu_freq;
>
> static int number_of_speeds = -1;
> static int total_tests = 1;
> static int performed_tests = 0;
> static int no_cpufreq = 0;
> -static unsigned long top_speed = 0;
> +static uint64_t top_speed = 0;
> static int num_cpus;
>
> #define GET_PERFORMANCE_MAX (0)
> @@ -126,63 +127,26 @@ static void set_HZ(fwts_framework *fw, const int cpu, const unsigned long Hz)
>
> }
>
> -static unsigned long get_performance(const int cpu)
> -{
> - cpu_set_t mask, oldset;
> - time_t current;
> - unsigned long loopcount = 0;
> -
> - /* First, go to the right cpu */
> -
> - sched_getaffinity(0, sizeof(oldset), &oldset);
> -
> - CPU_ZERO(&mask);
> - CPU_SET(cpu, &mask);
> - sched_setaffinity(0, sizeof(mask), &mask);
> -
> - current = time(NULL);
> - while (current == time(NULL))
> - sched_yield();
> - current = time(NULL);
> -
> - do {
> - double A, B;
> - int i;
> - A = 1.234567;
> - B = 3.121213;
> - for (i = 0; i < 100; i++) {
> - A = A * B;
> - B = A * A;
> - A = A - B + sqrt(A);
> - A = A * B;
> - B = A * A;
> - A = A - B + sqrt(A);
> - A = A * B;
> - B = A * A;
> - A = A - B + sqrt(A);
> - A = A * B;
> - B = A * A;
> - A = A - B + sqrt(A);
> - }
> - loopcount++;
> - } while (current == time(NULL));
> -
> - sched_setaffinity(0, sizeof(oldset), &oldset);
> -
> - return loopcount;
> -}
> -
> -static unsigned long get_performance_repeat(int cpu, int count, int type)
> +static int get_performance_repeat(
> + fwts_framework *fw,
> + const int cpu,
> + const int count,
> + const int type,
> + uint64_t *retval)
> {
> int i;
>
> - unsigned long max = 0, min = ULONG_MAX, real_count = 0;
> - unsigned long long cumulative = 0;
> - unsigned long retval;
> + uint64_t max = 0;
> + uint64_t min = ~0;
> + uint64_t real_count = 0;
> + uint64_t cumulative = 0;
>
> for (i = 0; i < count; i++) {
> - unsigned long temp;
> - temp = get_performance(cpu);
> + uint64_t temp;
> +
> + if (fwts_cpu_performance(fw, cpu, &temp) != FWTS_OK)
> + return FWTS_ERROR;
> +
> if (temp) {
> if (temp < min)
> min = temp;
> @@ -197,19 +161,19 @@ static unsigned long get_performance_repeat(int cpu, int count, int type)
>
> switch (type) {
> case GET_PERFORMANCE_MAX:
> - retval = max;
> + *retval = max;
> break;
> case GET_PERFORMANCE_MIN:
> - retval = min;
> + *retval = min;
> break;
> case GET_PERFORMANCE_AVG:
> - retval = cumulative/real_count;
> + *retval = cumulative / real_count;
> break;
> default:
> - retval = 0;
> + *retval = 0;
> break;
> }
> - return retval;
> + return FWTS_OK;
> }
>
> static char *HzToHuman(unsigned long hz)
> @@ -235,11 +199,11 @@ static char *HzToHuman(unsigned long hz)
>
>
>
> -static unsigned long get_claimed_hz(const int cpu)
> +static uint32_t get_claimed_hz(const int cpu)
> {
> char path[PATH_MAX];
> char *buffer;
> - unsigned long value = 0;
> + uint32_t value = 0;
>
> cpu_mkpath(path, sizeof(path), cpu, "scaling_max_freq");
>
> @@ -261,7 +225,7 @@ static void do_cpu(fwts_framework *fw, int cpu)
> int speedcount;
> static int warned=0;
> int warned_PSS = 0;
> - unsigned long cpu_top_speed = 0;
> + uint64_t cpu_top_speed = 0;
>
> memset(freqs, 0, sizeof(freqs));
> memset(line, 0, sizeof(line));
> @@ -296,7 +260,12 @@ static void do_cpu(fwts_framework *fw, int cpu)
>
> freqs[i].Hz = strtoull(c, NULL, 10);
> set_HZ(fw, cpu, freqs[i].Hz);
> - freqs[i].speed = get_performance(cpu);
> +
> + if (fwts_cpu_performance(fw, cpu, &freqs[i].speed) != FWTS_OK) {
> + fwts_log_error(fw, "Failed to get CPU performance for "
> + "CPU frequency %" PRIu32 " Hz.", freqs[i].Hz);
> + freqs[i].speed = 0;
> + }
> if (freqs[i].speed > cpu_top_speed)
> cpu_top_speed = freqs[i].speed;
>
> @@ -364,7 +333,8 @@ static void do_cpu(fwts_framework *fw, int cpu)
> cpu);
> if (freqs[i].Hz > get_claimed_hz(cpu) && !warned_PSS) {
> warned_PSS = 1;
> - fwts_warning(fw, "Frequency %lu not achievable; _PSS limit of %lu in effect?",
> + fwts_warning(fw, "Frequency %" PRIu32
> + " not achievable; _PSS limit of %" PRIu32 " in effect?",
> freqs[i].Hz, get_claimed_hz(cpu));
> }
> }
> @@ -444,7 +414,7 @@ static void do_sw_all_test(fwts_framework *fw)
> {
> DIR *dir;
> struct dirent *entry;
> - unsigned long highperf, lowperf;
> + uint64_t highperf, lowperf;
> int first_cpu_index = -1;
> int cpu;
>
> @@ -465,11 +435,20 @@ static void do_sw_all_test(fwts_framework *fw)
> closedir(dir);
>
> /* All CPUs at the lowest frequency */
> - lowperf = 100 * get_performance_repeat(first_cpu_index,
> - 5, GET_PERFORMANCE_MIN) / top_speed;
> + if (get_performance_repeat(fw, first_cpu_index, 5, GET_PERFORMANCE_MIN, &lowperf) != FWTS_OK) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "CPUFreqSW_ALLGetPerf",
> + "Failed to get CPU performance.");
> + return;
> + }
> + lowperf = (lowperf * 100) / top_speed;
> +
> highest_speed(fw, first_cpu_index);
> - highperf = 100 * get_performance_repeat(first_cpu_index,
> - 5, GET_PERFORMANCE_MAX) / top_speed;
> + if (get_performance_repeat(fw, first_cpu_index, 5, GET_PERFORMANCE_MAX, &highperf) != FWTS_OK) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "CPUFreqSW_ALLGetPerf",
> + "Failed to get CPU performance.");
> + return;
> + }
> + highperf = (highperf * 100) / top_speed;
>
> if (lowperf >= highperf)
> fwts_failed(fw, LOG_LEVEL_MEDIUM,
> @@ -512,8 +491,12 @@ static void do_sw_any_test(fwts_framework *fw)
> rewinddir(dir);
>
> /* All CPUs at the lowest frequency */
> - lowperf = 100 * get_performance_repeat(first_cpu_index,
> - 5, GET_PERFORMANCE_MIN) / top_speed;
> + if (get_performance_repeat(fw, first_cpu_index, 5, GET_PERFORMANCE_MIN, &lowperf) != FWTS_OK) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "CPUFreqSW_ANYGetPerf",
> + "Failed to get CPU performance.");
> + return;
> + }
> + lowperf = (100 * lowperf) / top_speed;
>
> highest_speed(fw, first_cpu_index);
>
> @@ -527,8 +510,12 @@ static void do_sw_any_test(fwts_framework *fw)
> }
> closedir(dir);
>
> - highperf = 100 * get_performance_repeat(first_cpu_index,
> - 5, GET_PERFORMANCE_MAX) / top_speed;
> + if (get_performance_repeat(fw, first_cpu_index, 5, GET_PERFORMANCE_MAX, &highperf) != FWTS_OK) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM, "CPUFreqSW_ANYGetPerf",
> + "Failed to get CPU performance.");
> + return;
> + }
> + highperf = (100 * highperf) / top_speed;
>
> if (lowperf >= highperf)
> fwts_failed(fw, LOG_LEVEL_MEDIUM,
> @@ -568,13 +555,24 @@ static void check_sw_any(fwts_framework *fw)
> return; /* Single processor machine, no point in checking anything */
>
> /* assume that all processors have the same low performance */
> - low_perf = get_performance(max_cpu);
> + if (fwts_cpu_performance(fw, max_cpu, &low_perf) != FWTS_OK) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "CPUFreqCPsSetToSW_ANYGetPerf",
> + "Cannot get CPU performance.");
> + return;
> + }
> +
> for (i = 0; i <= max_cpu; i++) {
> highest_speed(fw, i);
> if (!cpu_exists(i))
> continue;
>
> - high_perf = get_performance(i);
> + if (fwts_cpu_performance(fw, i, &high_perf) != FWTS_OK) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "CPUFreqCPsSetToSW_ANYGetPerf",
> + "Cannot get CPU performance.");
> + return;
> + }
> performed_tests++;
> fwts_progress(fw, 100 * performed_tests/total_tests);
> /*
> @@ -585,7 +583,12 @@ static void check_sw_any(fwts_framework *fw)
> for (j = 0; j <= max_cpu; j++)
> if (i != j)
> lowest_speed(fw, j);
> - newhigh_perf = get_performance(i);
> + if (fwts_cpu_performance(fw, i, &newhigh_perf) != FWTS_OK) {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "CPUFreqCPsSetToSW_ANYGetPerf",
> + "Cannot get CPU performance.");
> + return;
> + }
> if ((high_perf > newhigh_perf) &&
> (high_perf - newhigh_perf > (high_perf - low_perf)/4) &&
> (once == 0) && (high_perf - low_perf > 20)) {
> --
> 1.8.0
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>
More information about the fwts-devel
mailing list