The power library and its backends open a sysfs file, read one value
from it, and close it again in many places. Where the file is only
read once, use the EAL routines instead.
Add power_sysfs_read_u32() as a thin wrapper so the backends keep
reading into a uint32_t. It rejects a value that does not fit rather
than truncating it, which the open coded fscanf("%u") could not.
The files that are held open for the lifetime of the device, the
"rw+" handles used to repeatedly read and write the scaling
frequency, are left alone: they are not a single read, and closing
and reopening them on every frequency change would be a behaviour
change on a hot path.
This also removes a few cases where the FILE pointer was left
uninitialised and then tested against NULL in the cleanup path.
Signed-off-by: Stephen Hemminger <[email protected]>
---
drivers/power/acpi/acpi_cpufreq.c | 21 ++--
drivers/power/amd_pstate/amd_pstate_cpufreq.c | 63 ++----------
drivers/power/cppc/cppc_cpufreq.c | 69 ++-----------
.../power/intel_pstate/intel_pstate_cpufreq.c | 99 +++----------------
drivers/power/intel_uncore/intel_uncore.c | 32 ++----
lib/power/power_common.c | 52 +++++-----
lib/power/power_common.h | 6 ++
lib/power/rte_power_qos.c | 29 +-----
8 files changed, 87 insertions(+), 284 deletions(-)
diff --git a/drivers/power/acpi/acpi_cpufreq.c
b/drivers/power/acpi/acpi_cpufreq.c
index af85a8cdec..84e33375d0 100644
--- a/drivers/power/acpi/acpi_cpufreq.c
+++ b/drivers/power/acpi/acpi_cpufreq.c
@@ -9,6 +9,7 @@
#include <rte_memcpy.h>
#include <rte_stdatomic.h>
#include <rte_string_fns.h>
+#include <rte_sysfs.h>
#include "acpi_cpufreq.h"
#include "power_common.h"
@@ -111,21 +112,14 @@ power_set_governor_original(struct acpi_power_info *pi)
static int
power_get_available_freqs(struct acpi_power_info *pi)
{
- FILE *f;
+ char *freqs[RTE_MAX_LCORE_FREQS];
int ret = -1, i, count;
- char *p;
char buf[BUFSIZ];
- char *freqs[RTE_MAX_LCORE_FREQS];
-
- open_core_sysfs_file(&f, "r", POWER_SYSFILE_AVAIL_FREQ, pi->lcore_id);
- if (f == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_AVAIL_FREQ);
- goto out;
- }
+ char *p;
- ret = read_core_sysfs_s(f, buf, sizeof(buf));
- if ((ret) < 0) {
+ ret = rte_sysfs_parse_string(buf, sizeof(buf), POWER_SYSFILE_AVAIL_FREQ,
+ pi->lcore_id);
+ if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_AVAIL_FREQ);
goto out;
@@ -169,9 +163,6 @@ power_get_available_freqs(struct acpi_power_info *pi)
POWER_DEBUG_LOG("%d frequency(s) of lcore %u are available",
count, pi->lcore_id);
out:
- if (f != NULL)
- fclose(f);
-
return ret;
}
diff --git a/drivers/power/amd_pstate/amd_pstate_cpufreq.c
b/drivers/power/amd_pstate/amd_pstate_cpufreq.c
index af9c1309f3..1d9d4cb495 100644
--- a/drivers/power/amd_pstate/amd_pstate_cpufreq.c
+++ b/drivers/power/amd_pstate/amd_pstate_cpufreq.c
@@ -103,34 +103,19 @@ power_set_governor_userspace(struct amd_pstate_power_info
*pi)
static int
power_check_turbo(struct amd_pstate_power_info *pi)
{
- FILE *f_nom = NULL, *f_max = NULL;
int ret = -1;
uint32_t nominal_perf = 0, highest_perf = 0;
- open_core_sysfs_file(&f_max, "r", POWER_SYSFILE_HIGHEST_PERF,
+ ret = power_sysfs_read_u32(&highest_perf, POWER_SYSFILE_HIGHEST_PERF,
pi->lcore_id);
- if (f_max == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_HIGHEST_PERF);
- goto err;
- }
-
- open_core_sysfs_file(&f_nom, "r", POWER_SYSFILE_NOMINAL_PERF,
- pi->lcore_id);
- if (f_nom == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_NOMINAL_PERF);
- goto err;
- }
-
- ret = read_core_sysfs_u32(f_max, &highest_perf);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_HIGHEST_PERF);
goto err;
}
- ret = read_core_sysfs_u32(f_nom, &nominal_perf);
+ ret = power_sysfs_read_u32(&nominal_perf, POWER_SYSFILE_NOMINAL_PERF,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_NOMINAL_PERF);
@@ -156,10 +141,6 @@ power_check_turbo(struct amd_pstate_power_info *pi)
}
err:
- if (f_max != NULL)
- fclose(f_max);
- if (f_nom != NULL)
- fclose(f_nom);
return ret;
}
@@ -171,52 +152,30 @@ power_check_turbo(struct amd_pstate_power_info *pi)
static int
power_get_available_freqs(struct amd_pstate_power_info *pi)
{
- FILE *f_min = NULL, *f_max = NULL, *f_nom = NULL;
int ret = -1, nominal_idx = -1;
uint32_t scaling_min_freq = 0, scaling_max_freq = 0;
uint32_t i, num_freqs = RTE_MAX_LCORE_FREQS;
uint32_t nominal_freq = 0, scaling_freq = 0;
uint32_t freq_calc = 0;
- open_core_sysfs_file(&f_max, "r", POWER_SYSFILE_SCALING_MAX_FREQ,
+ ret = power_sysfs_read_u32(&scaling_max_freq,
POWER_SYSFILE_SCALING_MAX_FREQ,
pi->lcore_id);
- if (f_max == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_SCALING_MAX_FREQ);
- goto out;
- }
-
- open_core_sysfs_file(&f_min, "r", POWER_SYSFILE_SCALING_MIN_FREQ,
- pi->lcore_id);
- if (f_min == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_SCALING_MIN_FREQ);
- goto out;
- }
-
- open_core_sysfs_file(&f_nom, "r", POWER_SYSFILE_NOMINAL_FREQ,
- pi->lcore_id);
- if (f_nom == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_NOMINAL_FREQ);
- goto out;
- }
-
- ret = read_core_sysfs_u32(f_max, &scaling_max_freq);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_SCALING_MAX_FREQ);
goto out;
}
- ret = read_core_sysfs_u32(f_min, &scaling_min_freq);
+ ret = power_sysfs_read_u32(&scaling_min_freq,
POWER_SYSFILE_SCALING_MIN_FREQ,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_SCALING_MIN_FREQ);
goto out;
}
- ret = read_core_sysfs_u32(f_nom, &nominal_freq);
+ ret = power_sysfs_read_u32(&nominal_freq, POWER_SYSFILE_NOMINAL_FREQ,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_NOMINAL_FREQ);
@@ -272,12 +231,6 @@ power_get_available_freqs(struct amd_pstate_power_info *pi)
num_freqs, pi->lcore_id);
out:
- if (f_min != NULL)
- fclose(f_min);
- if (f_max != NULL)
- fclose(f_max);
- if (f_nom != NULL)
- fclose(f_nom);
return ret;
}
diff --git a/drivers/power/cppc/cppc_cpufreq.c
b/drivers/power/cppc/cppc_cpufreq.c
index aed44c1212..a25dc7eaf1 100644
--- a/drivers/power/cppc/cppc_cpufreq.c
+++ b/drivers/power/cppc/cppc_cpufreq.c
@@ -106,49 +106,27 @@ power_set_governor_userspace(struct cppc_power_info *pi)
static int
power_check_turbo(struct cppc_power_info *pi)
{
- FILE *f_nom = NULL, *f_max = NULL, *f_cmax = NULL;
- int ret = -1;
uint32_t nominal_perf = 0, highest_perf = 0, cpuinfo_max_freq = 0;
+ int ret = -1;
- open_core_sysfs_file(&f_max, "r", POWER_SYSFILE_HIGHEST_PERF,
- pi->lcore_id);
- if (f_max == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_HIGHEST_PERF);
- goto err;
- }
-
- open_core_sysfs_file(&f_nom, "r", POWER_SYSFILE_NOMINAL_PERF,
- pi->lcore_id);
- if (f_nom == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_NOMINAL_PERF);
- goto err;
- }
-
- open_core_sysfs_file(&f_cmax, "r", POWER_SYSFILE_SYS_MAX,
+ ret = power_sysfs_read_u32(&highest_perf, POWER_SYSFILE_HIGHEST_PERF,
pi->lcore_id);
- if (f_cmax == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_SYS_MAX);
- goto err;
- }
-
- ret = read_core_sysfs_u32(f_max, &highest_perf);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_HIGHEST_PERF);
goto err;
}
- ret = read_core_sysfs_u32(f_nom, &nominal_perf);
+ ret = power_sysfs_read_u32(&nominal_perf, POWER_SYSFILE_NOMINAL_PERF,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_NOMINAL_PERF);
goto err;
}
- ret = read_core_sysfs_u32(f_cmax, &cpuinfo_max_freq);
+ ret = power_sysfs_read_u32(&cpuinfo_max_freq, POWER_SYSFILE_SYS_MAX,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_SYS_MAX);
@@ -175,13 +153,6 @@ power_check_turbo(struct cppc_power_info *pi)
}
err:
- if (f_max != NULL)
- fclose(f_max);
- if (f_nom != NULL)
- fclose(f_nom);
- if (f_cmax != NULL)
- fclose(f_cmax);
-
return ret;
}
@@ -192,35 +163,20 @@ power_check_turbo(struct cppc_power_info *pi)
static int
power_get_available_freqs(struct cppc_power_info *pi)
{
- FILE *f_min = NULL, *f_max = NULL;
- int ret = -1;
uint32_t scaling_min_freq = 0, scaling_max_freq = 0, nominal_perf = 0;
uint32_t i, num_freqs = 0;
+ int ret = -1;
- open_core_sysfs_file(&f_max, "r", POWER_SYSFILE_SCALING_MAX_FREQ,
- pi->lcore_id);
- if (f_max == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_SCALING_MAX_FREQ);
- goto out;
- }
-
- open_core_sysfs_file(&f_min, "r", POWER_SYSFILE_SCALING_MIN_FREQ,
+ ret = power_sysfs_read_u32(&scaling_max_freq,
POWER_SYSFILE_SCALING_MAX_FREQ,
pi->lcore_id);
- if (f_min == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_SCALING_MIN_FREQ);
- goto out;
- }
-
- ret = read_core_sysfs_u32(f_max, &scaling_max_freq);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_SCALING_MAX_FREQ);
goto out;
}
- ret = read_core_sysfs_u32(f_min, &scaling_min_freq);
+ ret = power_sysfs_read_u32(&scaling_min_freq,
POWER_SYSFILE_SCALING_MIN_FREQ,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_SCALING_MIN_FREQ);
@@ -260,11 +216,6 @@ power_get_available_freqs(struct cppc_power_info *pi)
num_freqs, pi->lcore_id);
out:
- if (f_min != NULL)
- fclose(f_min);
- if (f_max != NULL)
- fclose(f_max);
-
return ret;
}
diff --git a/drivers/power/intel_pstate/intel_pstate_cpufreq.c
b/drivers/power/intel_pstate/intel_pstate_cpufreq.c
index dfbb5635a1..c8d0ed2c21 100644
--- a/drivers/power/intel_pstate/intel_pstate_cpufreq.c
+++ b/drivers/power/intel_pstate/intel_pstate_cpufreq.c
@@ -108,29 +108,12 @@ out: close(fd);
static int
power_init_for_setting_freq(struct pstate_power_info *pi)
{
- FILE *f_base = NULL, *f_base_min = NULL, *f_base_max = NULL,
- *f_min = NULL, *f_max = NULL;
+ FILE *f_min = NULL, *f_max = NULL;
uint32_t base_ratio, base_min_ratio, base_max_ratio;
uint64_t max_non_turbo = 0;
int ret;
- /* open all files we expect to have open */
- open_core_sysfs_file(&f_base_max, "r", POWER_SYSFILE_BASE_MAX_FREQ,
- pi->lcore_id);
- if (f_base_max == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_BASE_MAX_FREQ);
- goto err;
- }
-
- open_core_sysfs_file(&f_base_min, "r", POWER_SYSFILE_BASE_MIN_FREQ,
- pi->lcore_id);
- if (f_base_min == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_BASE_MIN_FREQ);
- goto err;
- }
-
+ /* open the files that are kept open for setting the frequency */
open_core_sysfs_file(&f_min, "rw+", POWER_SYSFILE_MIN_FREQ,
pi->lcore_id);
if (f_min == NULL) {
@@ -147,12 +130,9 @@ power_init_for_setting_freq(struct pstate_power_info *pi)
goto err;
}
- open_core_sysfs_file(&f_base, "r", POWER_SYSFILE_BASE_FREQ,
- pi->lcore_id);
- /* base ratio file may not exist in some kernels, so no error check */
-
/* read base max ratio */
- ret = read_core_sysfs_u32(f_base_max, &base_max_ratio);
+ ret = power_sysfs_read_u32(&base_max_ratio, POWER_SYSFILE_BASE_MAX_FREQ,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_BASE_MAX_FREQ);
@@ -160,24 +140,18 @@ power_init_for_setting_freq(struct pstate_power_info *pi)
}
/* read base min ratio */
- ret = read_core_sysfs_u32(f_base_min, &base_min_ratio);
+ ret = power_sysfs_read_u32(&base_min_ratio, POWER_SYSFILE_BASE_MIN_FREQ,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_BASE_MIN_FREQ);
goto err;
}
- /* base ratio may not exist */
- if (f_base != NULL) {
- ret = read_core_sysfs_u32(f_base, &base_ratio);
- if (ret < 0) {
- POWER_LOG(ERR, "Failed to read %s",
- POWER_SYSFILE_BASE_FREQ);
- goto err;
- }
- } else {
+ /* base ratio file may not exist in some kernels, so no error check */
+ if (power_sysfs_read_u32(&base_ratio, POWER_SYSFILE_BASE_FREQ,
+ pi->lcore_id) < 0)
base_ratio = 0;
- }
/* convert ratios to bins */
base_max_ratio /= BUS_FREQ;
@@ -222,20 +196,10 @@ power_init_for_setting_freq(struct pstate_power_info *pi)
pi->core_base_freq = base_ratio * BUS_FREQ;
out:
- if (f_base != NULL)
- fclose(f_base);
- fclose(f_base_max);
- fclose(f_base_min);
/* f_min and f_max are stored, no need to close */
return 0;
err:
- if (f_base != NULL)
- fclose(f_base);
- if (f_base_min != NULL)
- fclose(f_base_min);
- if (f_base_max != NULL)
- fclose(f_base_max);
if (f_min != NULL)
fclose(f_min);
if (f_max != NULL)
@@ -366,38 +330,22 @@ power_set_governor_original(struct pstate_power_info *pi)
static int
power_get_available_freqs(struct pstate_power_info *pi)
{
- FILE *f_min = NULL, *f_max = NULL;
- int ret = -1;
uint32_t sys_min_freq = 0, sys_max_freq = 0, base_max_freq = 0;
int config_min_freq, config_max_freq;
uint32_t i, num_freqs = 0;
-
- /* open all files */
- open_core_sysfs_file(&f_max, "r", POWER_SYSFILE_BASE_MAX_FREQ,
- pi->lcore_id);
- if (f_max == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_BASE_MAX_FREQ);
- goto out;
- }
-
- open_core_sysfs_file(&f_min, "r", POWER_SYSFILE_BASE_MIN_FREQ,
- pi->lcore_id);
- if (f_min == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_BASE_MIN_FREQ);
- goto out;
- }
+ int ret = -1;
/* read base ratios */
- ret = read_core_sysfs_u32(f_max, &sys_max_freq);
+ ret = power_sysfs_read_u32(&sys_max_freq, POWER_SYSFILE_BASE_MAX_FREQ,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_BASE_MAX_FREQ);
goto out;
}
- ret = read_core_sysfs_u32(f_min, &sys_min_freq);
+ ret = power_sysfs_read_u32(&sys_min_freq, POWER_SYSFILE_BASE_MIN_FREQ,
+ pi->lcore_id);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_BASE_MIN_FREQ);
@@ -467,31 +415,18 @@ power_get_available_freqs(struct pstate_power_info *pi)
num_freqs, pi->lcore_id);
out:
- if (f_min != NULL)
- fclose(f_min);
- if (f_max != NULL)
- fclose(f_max);
-
return ret;
}
static int
power_get_cur_idx(struct pstate_power_info *pi)
{
- FILE *f_cur;
- int ret = -1;
uint32_t sys_cur_freq = 0;
unsigned int i;
+ int ret = -1;
- open_core_sysfs_file(&f_cur, "r", POWER_SYSFILE_CUR_FREQ,
+ ret = power_sysfs_read_u32(&sys_cur_freq, POWER_SYSFILE_CUR_FREQ,
pi->lcore_id);
- if (f_cur == NULL) {
- POWER_LOG(ERR, "failed to open %s",
- POWER_SYSFILE_CUR_FREQ);
- goto fail;
- }
-
- ret = read_core_sysfs_u32(f_cur, &sys_cur_freq);
if (ret < 0) {
POWER_LOG(ERR, "Failed to read %s",
POWER_SYSFILE_CUR_FREQ);
@@ -517,8 +452,6 @@ power_get_cur_idx(struct pstate_power_info *pi)
ret = 0;
fail:
- if (f_cur != NULL)
- fclose(f_cur);
return ret;
}
diff --git a/drivers/power/intel_uncore/intel_uncore.c
b/drivers/power/intel_uncore/intel_uncore.c
index 6759ea1445..0e758312cf 100644
--- a/drivers/power/intel_uncore/intel_uncore.c
+++ b/drivers/power/intel_uncore/intel_uncore.c
@@ -111,20 +111,14 @@ set_uncore_freq_internal(struct uncore_power_info *ui,
uint32_t idx)
static int
power_init_for_setting_uncore_freq(struct uncore_power_info *ui)
{
- FILE *f_base_min = NULL, *f_base_max = NULL, *f_min = NULL, *f_max =
NULL;
+ FILE *f_min = NULL, *f_max = NULL;
uint32_t base_min_freq = 0, base_max_freq = 0, min_freq = 0, max_freq =
0;
int ret;
/* open and read all uncore sys files */
/* Base max */
- open_core_sysfs_file(&f_base_max, "r",
POWER_INTEL_UNCORE_SYSFILE_BASE_MAX_FREQ,
+ ret = power_sysfs_read_u32(&base_max_freq,
POWER_INTEL_UNCORE_SYSFILE_BASE_MAX_FREQ,
ui->pkg, ui->die);
- if (f_base_max == NULL) {
- POWER_LOG(DEBUG, "failed to open %s",
- POWER_INTEL_UNCORE_SYSFILE_BASE_MAX_FREQ);
- goto err;
- }
- ret = read_core_sysfs_u32(f_base_max, &base_max_freq);
if (ret < 0) {
POWER_LOG(DEBUG, "Failed to read %s",
POWER_INTEL_UNCORE_SYSFILE_BASE_MAX_FREQ);
@@ -132,21 +126,13 @@ power_init_for_setting_uncore_freq(struct
uncore_power_info *ui)
}
/* Base min */
- open_core_sysfs_file(&f_base_min, "r",
POWER_INTEL_UNCORE_SYSFILE_BASE_MIN_FREQ,
- ui->pkg, ui->die);
- if (f_base_min == NULL) {
- POWER_LOG(DEBUG, "failed to open %s",
+ ret = power_sysfs_read_u32(&base_min_freq,
POWER_INTEL_UNCORE_SYSFILE_BASE_MIN_FREQ,
+ ui->pkg, ui->die);
+ if (ret < 0) {
+ POWER_LOG(DEBUG, "Failed to read %s",
POWER_INTEL_UNCORE_SYSFILE_BASE_MIN_FREQ);
goto err;
}
- if (f_base_min != NULL) {
- ret = read_core_sysfs_u32(f_base_min, &base_min_freq);
- if (ret < 0) {
- POWER_LOG(DEBUG, "Failed to read %s",
-
POWER_INTEL_UNCORE_SYSFILE_BASE_MIN_FREQ);
- goto err;
- }
- }
/* Curr min */
open_core_sysfs_file(&f_min, "rw+", POWER_INTEL_UNCORE_SYSFILE_MIN_FREQ,
@@ -191,17 +177,11 @@ power_init_for_setting_uncore_freq(struct
uncore_power_info *ui)
ui->init_max_freq = base_max_freq;
ui->init_min_freq = base_min_freq;
- fclose(f_base_min);
- fclose(f_base_max);
/* f_min and f_max are stored, no need to close */
return 0;
err:
- if (f_base_min != NULL)
- fclose(f_base_min);
- if (f_base_max != NULL)
- fclose(f_base_max);
if (f_min != NULL)
fclose(f_min);
if (f_max != NULL)
diff --git a/lib/power/power_common.c b/lib/power/power_common.c
index da22a4d160..f583975152 100644
--- a/lib/power/power_common.c
+++ b/lib/power/power_common.c
@@ -3,14 +3,17 @@
*/
#include <limits.h>
+#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <stdarg.h>
#include <eal_export.h>
#include <rte_log.h>
#include <rte_string_fns.h>
#include <rte_lcore.h>
+#include <rte_sysfs.h>
#include "power_common.h"
@@ -28,34 +31,16 @@ cpufreq_check_scaling_driver(const char *driver_name)
{
unsigned int lcore_id = 0; /* always check core 0 */
char readbuf[PATH_MAX];
- size_t end_idx;
- char *s;
- FILE *f;
/*
* Check if scaling driver matches what we expect.
+ * If there is no driver at all, or it can't be read,
+ * consider the system unsupported.
*/
- open_core_sysfs_file(&f, "r", POWER_SYSFILE_SCALING_DRIVER,
- lcore_id);
- /* if there's no driver at all, bail out */
- if (f == NULL)
- return 0;
-
- s = fgets(readbuf, sizeof(readbuf), f);
- /* don't need it any more */
- fclose(f);
-
- /* if we can't read it, consider unsupported */
- if (s == NULL)
+ if (rte_sysfs_parse_string(readbuf, sizeof(readbuf),
+ POWER_SYSFILE_SCALING_DRIVER, lcore_id) < 0)
return 0;
- /* when read from sysfs, driver name has an extra newline at the end */
- end_idx = strnlen(readbuf, sizeof(readbuf));
- if (end_idx > 0 && readbuf[end_idx - 1] == '\n') {
- end_idx--;
- readbuf[end_idx] = '\0';
- }
-
/* does the driver name match? */
if (strncmp(readbuf, driver_name, sizeof(readbuf)) != 0)
return 0;
@@ -87,6 +72,29 @@ open_core_sysfs_file(FILE **f, const char *mode, const char
*format, ...)
return 0;
}
+RTE_EXPORT_INTERNAL_SYMBOL(power_sysfs_read_u32)
+int
+power_sysfs_read_u32(uint32_t *val, const char *format, ...)
+{
+ unsigned long tmp;
+ va_list ap;
+ int ret;
+
+ va_start(ap, format);
+ ret = rte_sysfs_vparse_uint(&tmp, format, ap);
+ va_end(ap);
+ if (ret < 0)
+ return -1;
+
+ if (tmp > UINT32_MAX) {
+ POWER_LOG(ERR, "sysfs value does not fit in 32 bits");
+ return -1;
+ }
+
+ *val = tmp;
+ return 0;
+}
+
RTE_EXPORT_INTERNAL_SYMBOL(read_core_sysfs_u32)
int
read_core_sysfs_u32(FILE *f, uint32_t *val)
diff --git a/lib/power/power_common.h b/lib/power/power_common.h
index 370c5246c6..6ca91658cd 100644
--- a/lib/power/power_common.h
+++ b/lib/power/power_common.h
@@ -8,6 +8,7 @@
#include <rte_common.h>
#include <rte_compat.h>
#include <rte_log.h>
+#include <stdint.h>
#define RTE_POWER_INVALID_FREQ_INDEX (~0)
@@ -48,6 +49,11 @@ int open_core_sysfs_file(FILE **f, const char *mode, const
char *format, ...)
__rte_internal
int read_core_sysfs_u32(FILE *f, uint32_t *val);
+/* read a 32 bit value from a sysfs file given by a printf style path */
+__rte_internal
+int power_sysfs_read_u32(uint32_t *val, const char *format, ...)
+ __rte_format_printf(2, 3);
+
__rte_internal
int read_core_sysfs_s(FILE *f, char *buf, unsigned int len);
diff --git a/lib/power/rte_power_qos.c b/lib/power/rte_power_qos.c
index d8d8d36a76..dd1b8f7384 100644
--- a/lib/power/rte_power_qos.c
+++ b/lib/power/rte_power_qos.c
@@ -9,6 +9,7 @@
#include <eal_export.h>
#include <rte_lcore.h>
#include <rte_log.h>
+#include <rte_sysfs.h>
#include "power_common.h"
#include "rte_power_qos.h"
@@ -24,7 +25,6 @@ rte_power_qos_set_cpu_resume_latency(uint16_t lcore_id, int
latency)
{
char buf[PM_QOS_CPU_RESUME_LATENCY_BUF_LEN];
uint32_t cpu_id;
- FILE *f;
int ret;
RTE_POWER_VALID_LCOREID_OR_ERR_RET(lcore_id, -EINVAL);
@@ -37,13 +37,6 @@ rte_power_qos_set_cpu_resume_latency(uint16_t lcore_id, int
latency)
return -EINVAL;
}
- ret = open_core_sysfs_file(&f, "w", PM_QOS_SYSFILE_RESUME_LATENCY_US,
cpu_id);
- if (ret != 0) {
- POWER_LOG(ERR, "Failed to open
"PM_QOS_SYSFILE_RESUME_LATENCY_US" : %s",
- cpu_id, strerror(errno));
- return ret;
- }
-
/*
* Based on the sysfs interface pm_qos_resume_latency_us under
* @PM_QOS_SYSFILE_RESUME_LATENCY_US directory in kernel, their meaning
@@ -59,13 +52,11 @@ rte_power_qos_set_cpu_resume_latency(uint16_t lcore_id, int
latency)
else
snprintf(buf, sizeof(buf), "%u", latency);
- ret = write_core_sysfs_s(f, buf);
+ ret = rte_sysfs_write_string(buf, PM_QOS_SYSFILE_RESUME_LATENCY_US,
cpu_id);
if (ret != 0)
POWER_LOG(ERR, "Failed to write
"PM_QOS_SYSFILE_RESUME_LATENCY_US" : %s",
cpu_id, strerror(errno));
- fclose(f);
-
return ret;
}
@@ -76,7 +67,6 @@ rte_power_qos_get_cpu_resume_latency(uint16_t lcore_id)
char buf[PM_QOS_CPU_RESUME_LATENCY_BUF_LEN];
int latency = -1;
uint32_t cpu_id;
- FILE *f;
int ret;
RTE_POWER_VALID_LCOREID_OR_ERR_RET(lcore_id, -EINVAL);
@@ -84,18 +74,12 @@ rte_power_qos_get_cpu_resume_latency(uint16_t lcore_id)
if (ret != 0)
return ret;
- ret = open_core_sysfs_file(&f, "r", PM_QOS_SYSFILE_RESUME_LATENCY_US,
cpu_id);
- if (ret != 0) {
- POWER_LOG(ERR, "Failed to open
"PM_QOS_SYSFILE_RESUME_LATENCY_US" : %s",
- cpu_id, strerror(errno));
- return ret;
- }
-
- ret = read_core_sysfs_s(f, buf, sizeof(buf));
+ ret = rte_sysfs_parse_string(buf, sizeof(buf),
PM_QOS_SYSFILE_RESUME_LATENCY_US,
+ cpu_id);
if (ret != 0) {
POWER_LOG(ERR, "Failed to read
"PM_QOS_SYSFILE_RESUME_LATENCY_US" : %s",
cpu_id, strerror(errno));
- goto out;
+ return ret;
}
/*
@@ -113,8 +97,5 @@ rte_power_qos_get_cpu_resume_latency(uint16_t lcore_id)
latency = latency == 0 ?
RTE_POWER_QOS_RESUME_LATENCY_NO_CONSTRAINT : latency;
}
-out:
- fclose(f);
-
return latency != -1 ? latency : ret;
}
--
2.53.0