diff options
author | Christian Ehrhardt <christian.ehrhardt@canonical.com> | 2019-07-04 10:40:06 +0200 |
---|---|---|
committer | Christian Ehrhardt <christian.ehrhardt@canonical.com> | 2019-07-04 10:48:05 +0200 |
commit | 8d53e9f3c6001dcb2865f6e894da5b54e1418f88 (patch) | |
tree | 63907f21c13636a987d43463c675d0727a04e327 /lib/librte_power | |
parent | e2bea7436061ca2e7e14bfcfdc5870f2555c3965 (diff) |
New upstream version 18.11.2upstream-18.11-stable
Change-Id: I23eb4f9179abf1f9c659891f8fddb27ee68ad26b
Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Diffstat (limited to 'lib/librte_power')
-rw-r--r-- | lib/librte_power/power_acpi_cpufreq.c | 5 | ||||
-rw-r--r-- | lib/librte_power/rte_power.c | 30 | ||||
-rw-r--r-- | lib/librte_power/rte_power.h | 2 | ||||
-rw-r--r-- | lib/librte_power/rte_power_empty_poll.c | 3 | ||||
-rw-r--r-- | lib/librte_power/rte_power_empty_poll.h | 2 |
5 files changed, 27 insertions, 15 deletions
diff --git a/lib/librte_power/power_acpi_cpufreq.c b/lib/librte_power/power_acpi_cpufreq.c index cd5978d5..f7d3f9ca 100644 --- a/lib/librte_power/power_acpi_cpufreq.c +++ b/lib/librte_power/power_acpi_cpufreq.c @@ -12,8 +12,9 @@ #include <signal.h> #include <limits.h> -#include <rte_memcpy.h> #include <rte_atomic.h> +#include <rte_memcpy.h> +#include <rte_memory.h> #include "power_acpi_cpufreq.h" #include "power_common.h" @@ -147,6 +148,8 @@ power_set_governor_userspace(struct rte_power_info *pi) s = fgets(buf, sizeof(buf), f); FOPS_OR_NULL_GOTO(s, out); + /* Strip off terminating '\n' */ + strtok(buf, "\n"); /* Check if current governor is userspace */ if (strncmp(buf, POWER_GOVERNOR_USERSPACE, diff --git a/lib/librte_power/rte_power.c b/lib/librte_power/rte_power.c index 208b7919..cc05b0fa 100644 --- a/lib/librte_power/rte_power.c +++ b/lib/librte_power/rte_power.c @@ -2,7 +2,7 @@ * Copyright(c) 2010-2014 Intel Corporation */ -#include <rte_atomic.h> +#include <rte_spinlock.h> #include "rte_power.h" #include "power_acpi_cpufreq.h" @@ -11,7 +11,7 @@ enum power_management_env global_default_env = PM_ENV_NOT_SET; -volatile uint32_t global_env_cfg_status = 0; +static rte_spinlock_t global_env_cfg_lock = RTE_SPINLOCK_INITIALIZER; /* function pointers */ rte_power_freqs_t rte_power_freqs = NULL; @@ -29,9 +29,15 @@ rte_power_get_capabilities_t rte_power_get_capabilities; int rte_power_set_env(enum power_management_env env) { - if (rte_atomic32_cmpset(&global_env_cfg_status, 0, 1) == 0) { + rte_spinlock_lock(&global_env_cfg_lock); + + if (global_default_env != PM_ENV_NOT_SET) { + rte_spinlock_unlock(&global_env_cfg_lock); return 0; } + + int ret = 0; + if (env == PM_ENV_ACPI_CPUFREQ) { rte_power_freqs = power_acpi_cpufreq_freqs; rte_power_get_freq = power_acpi_cpufreq_get_freq; @@ -59,19 +65,25 @@ rte_power_set_env(enum power_management_env env) } else { RTE_LOG(ERR, POWER, "Invalid Power Management Environment(%d) set\n", env); - rte_power_unset_env(); - return -1; + ret = -1; } - global_default_env = env; - return 0; + + if (ret == 0) + global_default_env = env; + else + global_default_env = PM_ENV_NOT_SET; + + rte_spinlock_unlock(&global_env_cfg_lock); + return ret; } void rte_power_unset_env(void) { - if (rte_atomic32_cmpset(&global_env_cfg_status, 1, 0) != 0) - global_default_env = PM_ENV_NOT_SET; + rte_spinlock_lock(&global_env_cfg_lock); + global_default_env = PM_ENV_NOT_SET; + rte_spinlock_unlock(&global_env_cfg_lock); } enum power_management_env diff --git a/lib/librte_power/rte_power.h b/lib/librte_power/rte_power.h index d70bc0b3..d7542c3f 100644 --- a/lib/librte_power/rte_power.h +++ b/lib/librte_power/rte_power.h @@ -25,7 +25,7 @@ enum power_management_env {PM_ENV_NOT_SET, PM_ENV_ACPI_CPUFREQ, PM_ENV_KVM_VM}; /** * Set the default power management implementation. If this is not called prior * to rte_power_init(), then auto-detect of the environment will take place. - * It is not thread safe. + * It is thread safe. * * @param env * env. The environment in which to initialise Power Management for. diff --git a/lib/librte_power/rte_power_empty_poll.c b/lib/librte_power/rte_power_empty_poll.c index e6145462..15d4f050 100644 --- a/lib/librte_power/rte_power_empty_poll.c +++ b/lib/librte_power/rte_power_empty_poll.c @@ -156,11 +156,8 @@ update_training_stats(struct priority_worker *poll_stats, { RTE_SET_USED(specific_freq); - char pfi_str[32]; uint64_t p0_empty_deq; - sprintf(pfi_str, "%02d", freq); - if (poll_stats->cur_freq == freq && poll_stats->thresh[freq].trained == false) { if (poll_stats->thresh[freq].cur_train_iter == 0) { diff --git a/lib/librte_power/rte_power_empty_poll.h b/lib/librte_power/rte_power_empty_poll.h index c1ad5c24..33f24e0c 100644 --- a/lib/librte_power/rte_power_empty_poll.h +++ b/lib/librte_power/rte_power_empty_poll.h @@ -59,7 +59,7 @@ struct freq_threshold { uint32_t cur_train_iter; }; -/* Each Worder Thread Empty Poll Stats */ +/* Each Worker Thread Empty Poll Stats */ struct priority_worker { /* Current dequeue and throughput counts */ |