This commit fixes an issue in the power library related to using lcores mapped to different physical cores (--lcores option in EAL).
Previously, the power library incorrectly accessed CPU sysfs attributes for power management, treating lcore IDs as CPU IDs. e.g. with --lcores '1@128', lcore_id '1' was interpreted as CPU_id instead of '128'. This patch corrects the cpu_id based on lcore and CPU mappings. It also constraints power management support for lcores mapped to multiple physical cores/threads. When multiple lcores are mapped to the same physical core, invoking frequency scaling APIs on any lcore will apply the changes effectively. Signed-off-by: Sivaprasad Tummala <sivaprasad.tumm...@amd.com> --- lib/power/power_acpi_cpufreq.c | 7 ++++++- lib/power/power_amd_pstate_cpufreq.c | 7 ++++++- lib/power/power_common.c | 23 +++++++++++++++++++++++ lib/power/power_common.h | 2 +- lib/power/power_cppc_cpufreq.c | 7 ++++++- lib/power/power_pstate_cpufreq.c | 7 ++++++- 6 files changed, 48 insertions(+), 5 deletions(-) diff --git a/lib/power/power_acpi_cpufreq.c b/lib/power/power_acpi_cpufreq.c index 81996e1c13..259bc8a263 100644 --- a/lib/power/power_acpi_cpufreq.c +++ b/lib/power/power_acpi_cpufreq.c @@ -258,7 +258,12 @@ power_acpi_cpufreq_init(unsigned int lcore_id) return -1; } - pi->lcore_id = lcore_id; + if (check_lcore_and_set_cpu(lcore_id, &pi->lcore_id) < 0) { + POWER_LOG(ERR, + "Cannot get cpu id mapped for lcore %u", lcore_id); + return -1; + } + /* Check and set the governor */ if (power_set_governor_userspace(pi) < 0) { POWER_LOG(ERR, "Cannot set governor of lcore %u to " diff --git a/lib/power/power_amd_pstate_cpufreq.c b/lib/power/power_amd_pstate_cpufreq.c index 090a0d96cb..9bfb271bb7 100644 --- a/lib/power/power_amd_pstate_cpufreq.c +++ b/lib/power/power_amd_pstate_cpufreq.c @@ -376,7 +376,12 @@ power_amd_pstate_cpufreq_init(unsigned int lcore_id) return -1; } - pi->lcore_id = lcore_id; + if (check_lcore_and_set_cpu(lcore_id, &pi->lcore_id) < 0) { + POWER_LOG(ERR, + "Cannot get cpu id mapped for lcore %u", lcore_id); + return -1; + } + /* Check and set the governor */ if (power_set_governor_userspace(pi) < 0) { POWER_LOG(ERR, "Cannot set governor of lcore %u to " diff --git a/lib/power/power_common.c b/lib/power/power_common.c index 590986d5ef..a8d5cd1c50 100644 --- a/lib/power/power_common.c +++ b/lib/power/power_common.c @@ -9,6 +9,7 @@ #include <rte_log.h> #include <rte_string_fns.h> +#include <rte_lcore.h> #include "power_common.h" @@ -204,3 +205,25 @@ power_set_governor(unsigned int lcore_id, const char *new_governor, return ret; } + +int check_lcore_and_set_cpu(uint32_t lcore_id, uint32_t *cpu_id) +{ + rte_cpuset_t lcore_cpus; + uint32_t cpu; + + lcore_cpus = rte_lcore_cpuset(lcore_id); + if (CPU_COUNT(&lcore_cpus) != 1) { + POWER_LOG(ERR, + "Power library does not support lcore %u mapping to %u cpus", + lcore_id, CPU_COUNT(&lcore_cpus)); + return -1; + } + + for (cpu = 0; cpu < CPU_SETSIZE; cpu++) { + if (CPU_ISSET(cpu, &lcore_cpus)) + break; + } + *cpu_id = cpu; + + return 0; +} diff --git a/lib/power/power_common.h b/lib/power/power_common.h index 83f742f42a..c5034104d0 100644 --- a/lib/power/power_common.h +++ b/lib/power/power_common.h @@ -31,5 +31,5 @@ int open_core_sysfs_file(FILE **f, const char *mode, const char *format, ...) int read_core_sysfs_u32(FILE *f, uint32_t *val); int read_core_sysfs_s(FILE *f, char *buf, unsigned int len); int write_core_sysfs_s(FILE *f, const char *str); - +int check_lcore_and_set_cpu(uint32_t lcore_id, uint32_t *cpu_id); #endif /* _POWER_COMMON_H_ */ diff --git a/lib/power/power_cppc_cpufreq.c b/lib/power/power_cppc_cpufreq.c index 32aaacb948..0a1d723bae 100644 --- a/lib/power/power_cppc_cpufreq.c +++ b/lib/power/power_cppc_cpufreq.c @@ -362,7 +362,12 @@ power_cppc_cpufreq_init(unsigned int lcore_id) return -1; } - pi->lcore_id = lcore_id; + if (check_lcore_and_set_cpu(lcore_id, &pi->lcore_id) < 0) { + POWER_LOG(ERR, + "Cannot get cpu id mapped for lcore %u", lcore_id); + return -1; + } + /* Check and set the governor */ if (power_set_governor_userspace(pi) < 0) { POWER_LOG(ERR, "Cannot set governor of lcore %u to " diff --git a/lib/power/power_pstate_cpufreq.c b/lib/power/power_pstate_cpufreq.c index 2343121621..116b130be2 100644 --- a/lib/power/power_pstate_cpufreq.c +++ b/lib/power/power_pstate_cpufreq.c @@ -564,7 +564,12 @@ power_pstate_cpufreq_init(unsigned int lcore_id) return -1; } - pi->lcore_id = lcore_id; + if (check_lcore_and_set_cpu(lcore_id, &pi->lcore_id) < 0) { + POWER_LOG(ERR, + "Cannot get cpu id mapped for lcore %u", lcore_id); + return -1; + } + /* Check and set the governor */ if (power_set_governor_performance(pi) < 0) { POWER_LOG(ERR, "Cannot set governor of lcore %u to " -- 2.34.1