Skip to content

Commit

Permalink
test/power: add delay before checking CPU frequency
Browse files Browse the repository at this point in the history
[ upstream commit 0045685 ]

For some platforms the newly-set frequency may not be effective
immediately. If we didn't get the right value from cpuinfo_cur_freq
immediately, add 10ms delay each time before rechecking until
timeout.

From our test, for some arm platforms, it requires up to 700ms when
going from a minimum to a maximum frequency. And it's not the
driver/software issue.

Fixes: ed7c51a ("app/test: vm power management")

Signed-off-by: Richael Zhuang <richael.zhuang@arm.com>
Reviewed-by: David Hunt <david.hunt@intel.com>
  • Loading branch information
richael02 authored and steevenlee committed May 8, 2021
1 parent 323d01c commit 2266f65
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions app/test/test_power_cpufreq.c
Expand Up @@ -8,6 +8,7 @@
#include <limits.h>
#include <string.h>
#include <inttypes.h>
#include <rte_cycles.h>

#include "test.h"

Expand Down Expand Up @@ -44,11 +45,13 @@ static int
check_cur_freq(unsigned lcore_id, uint32_t idx)
{
#define TEST_POWER_CONVERT_TO_DECIMAL 10
#define MAX_LOOP 100
FILE *f;
char fullpath[PATH_MAX];
char buf[BUFSIZ];
uint32_t cur_freq;
int ret = -1;
int i;

if (snprintf(fullpath, sizeof(fullpath),
TEST_POWER_SYSFILE_CUR_FREQ, lcore_id) < 0) {
Expand All @@ -58,13 +61,27 @@ check_cur_freq(unsigned lcore_id, uint32_t idx)
if (f == NULL) {
return 0;
}
if (fgets(buf, sizeof(buf), f) == NULL) {
goto fail_get_cur_freq;
for (i = 0; i < MAX_LOOP; i++) {
fflush(f);
if (fgets(buf, sizeof(buf), f) == NULL)
goto fail_all;

cur_freq = strtoul(buf, NULL, TEST_POWER_CONVERT_TO_DECIMAL);
ret = (freqs[idx] == cur_freq ? 0 : -1);

if (ret == 0)
break;

if (fseek(f, 0, SEEK_SET) < 0) {
printf("Fail to set file position indicator to 0\n");
goto fail_all;
}

/* wait for the value to be updated */
rte_delay_ms(10);
}
cur_freq = strtoul(buf, NULL, TEST_POWER_CONVERT_TO_DECIMAL);
ret = (freqs[idx] == cur_freq ? 0 : -1);

fail_get_cur_freq:
fail_all:
fclose(f);

return ret;
Expand Down

0 comments on commit 2266f65

Please sign in to comment.