From patchwork Tue Dec 11 12:04:06 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [4/4] cpu: cpufreq: Use new fwts_cpu_performance() helper function Date: Tue, 11 Dec 2012 02:04:06 -0000 From: Colin King X-Patchwork-Id: 205188 Message-Id: <1355227446-14380-5-git-send-email-colin.king@canonical.com> To: fwts-devel@lists.ubuntu.com From: Colin Ian King 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 Acked-by: Keng-Yu Lin Acked-by: Ivan Hu --- 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 #include #include +#include #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)) {