aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/odp-linux-generic.conf10
-rw-r--r--platform/linux-generic/include/odp_global_data.h13
-rw-r--r--platform/linux-generic/include/odp_sysinfo_internal.h1
-rw-r--r--platform/linux-generic/m4/odp_libconfig.m42
-rw-r--r--platform/linux-generic/odp_system_info.c50
-rw-r--r--platform/linux-generic/test/inline-timer.conf2
-rw-r--r--platform/linux-generic/test/packet_align.conf2
-rw-r--r--platform/linux-generic/test/process-mode.conf2
-rw-r--r--platform/linux-generic/test/sched-basic.conf2
9 files changed, 59 insertions, 25 deletions
diff --git a/config/odp-linux-generic.conf b/config/odp-linux-generic.conf
index 01c622fe8..ce2412a07 100644
--- a/config/odp-linux-generic.conf
+++ b/config/odp-linux-generic.conf
@@ -16,7 +16,7 @@
# Mandatory fields
odp_implementation = "linux-generic"
-config_file_version = "0.1.18"
+config_file_version = "0.1.19"
# System options
system: {
@@ -30,6 +30,14 @@ system: {
# available using standard Linux methods.
cpu_mhz_max = 1400
+ # When enabled (1), implementation reads the CPU frequency values from
+ # OS only once during ODP initialization. Enabling this option removes
+ # system calls from odp_cpu_hz() and odp_cpu_hz_id() implementations.
+ #
+ # NOTE: This option should only be used on systems where CPU frequency
+ # scaling is disabled.
+ cpu_hz_static = 0
+
# Maximum number of ODP threads that can be created.
# odp_thread_count_max() returns this value or the build time
# maximum ODP_THREAD_COUNT_MAX, whichever is lower. This setting
diff --git a/platform/linux-generic/include/odp_global_data.h b/platform/linux-generic/include/odp_global_data.h
index fd42c4ab6..657988fd0 100644
--- a/platform/linux-generic/include/odp_global_data.h
+++ b/platform/linux-generic/include/odp_global_data.h
@@ -11,26 +11,31 @@
extern "C" {
#endif
-#include <odp/api/init.h>
#include <odp/api/cpumask.h>
+#include <odp/api/init.h>
#include <odp/api/random.h>
#include <odp/api/system_info.h>
-#include <sys/types.h>
+#include <odp/api/std_types.h>
+
+#include <odp_config_internal.h>
+
+#include <libconfig.h>
#include <pthread.h>
#include <stdint.h>
-#include <libconfig.h>
-#include <odp_config_internal.h>
+#include <sys/types.h>
#define MODEL_STR_SIZE 128
#define UID_MAXLEN 30
typedef struct {
uint64_t cpu_hz_max[CONFIG_NUM_CPU_IDS];
+ uint64_t cpu_hz[CONFIG_NUM_CPU_IDS];
uint64_t default_cpu_hz_max;
uint64_t default_cpu_hz;
uint64_t page_size;
int cache_line_size;
int cpu_count;
+ odp_bool_t cpu_hz_static;
odp_cpu_arch_t cpu_arch;
odp_cpu_arch_isa_t cpu_isa_sw;
odp_cpu_arch_isa_t cpu_isa_hw;
diff --git a/platform/linux-generic/include/odp_sysinfo_internal.h b/platform/linux-generic/include/odp_sysinfo_internal.h
index 81bfd045f..16e4ced84 100644
--- a/platform/linux-generic/include/odp_sysinfo_internal.h
+++ b/platform/linux-generic/include/odp_sysinfo_internal.h
@@ -17,7 +17,6 @@ extern "C" {
#include <string.h>
int _odp_cpuinfo_parser(FILE *file, system_info_t *sysinfo);
-uint64_t odp_cpu_hz_current(int id);
uint64_t odp_cpu_arch_hz_current(int id);
void _odp_sys_info_print_arch(void);
diff --git a/platform/linux-generic/m4/odp_libconfig.m4 b/platform/linux-generic/m4/odp_libconfig.m4
index ccbf1d6f5..90b49d155 100644
--- a/platform/linux-generic/m4/odp_libconfig.m4
+++ b/platform/linux-generic/m4/odp_libconfig.m4
@@ -3,7 +3,7 @@
##########################################################################
m4_define([_odp_config_version_generation], [0])
m4_define([_odp_config_version_major], [1])
-m4_define([_odp_config_version_minor], [18])
+m4_define([_odp_config_version_minor], [19])
m4_define([_odp_config_version],
[_odp_config_version_generation._odp_config_version_major._odp_config_version_minor])
diff --git a/platform/linux-generic/odp_system_info.c b/platform/linux-generic/odp_system_info.c
index 778ea08cb..1e4f775e1 100644
--- a/platform/linux-generic/odp_system_info.c
+++ b/platform/linux-generic/odp_system_info.c
@@ -24,9 +24,9 @@
#include <odp_config_internal.h>
#include <odp/api/align.h>
#include <odp/api/cpu.h>
+
#include <errno.h>
#include <pthread.h>
-#include <sched.h>
#include <string.h>
#include <stdio.h>
#include <inttypes.h>
@@ -276,6 +276,21 @@ static uint64_t read_cpufreq(const char *filename, int id)
return ret;
}
+static inline uint64_t cpu_hz_current(int id)
+{
+ uint64_t cur_hz = read_cpufreq("cpuinfo_cur_freq", id);
+
+ if (!cur_hz)
+ cur_hz = odp_cpu_arch_hz_current(id);
+
+ return cur_hz;
+}
+
+static inline uint64_t cpu_hz_static(int id)
+{
+ return odp_global_ro.system_info.cpu_hz[id];
+}
+
/*
* Analysis of /sys/devices/system/cpu/ files
*/
@@ -337,6 +352,13 @@ static int read_config_file(void)
}
odp_global_ro.system_info.default_cpu_hz_max = (uint64_t)val * 1000000;
+ str = "system.cpu_hz_static";
+ if (!_odp_libconfig_lookup_int(str, &val)) {
+ ODP_ERR("Config option '%s' not found.\n", str);
+ return -1;
+ }
+ odp_global_ro.system_info.cpu_hz_static = !!val;
+
return 0;
}
@@ -364,6 +386,10 @@ int _odp_system_info_init(void)
"CPU IDs. Increase CONFIG_NUM_CPU_IDS value.\n",
num_cpus);
+ /* Read and save all CPU frequencies for static mode */
+ for (i = 0; i < CONFIG_NUM_CPU_IDS; i++)
+ odp_global_ro.system_info.cpu_hz[i] = cpu_hz_current(i);
+
/* By default, read max frequency from a cpufreq file */
for (i = 0; i < CONFIG_NUM_CPU_IDS; i++) {
uint64_t cpu_hz_max = read_cpufreq("cpuinfo_max_freq", i);
@@ -407,26 +433,22 @@ int _odp_system_info_term(void)
* Public access functions
*************************
*/
-uint64_t odp_cpu_hz_current(int id)
-{
- uint64_t cur_hz = read_cpufreq("cpuinfo_cur_freq", id);
-
- if (!cur_hz)
- cur_hz = odp_cpu_arch_hz_current(id);
-
- return cur_hz;
-}
-
uint64_t odp_cpu_hz(void)
{
- int id = sched_getcpu();
+ int id = odp_cpu_id();
- return odp_cpu_hz_current(id);
+ if (odp_global_ro.system_info.cpu_hz_static)
+ return cpu_hz_static(id);
+ return cpu_hz_current(id);
}
uint64_t odp_cpu_hz_id(int id)
{
- return odp_cpu_hz_current(id);
+ ODP_ASSERT(id >= 0 && id < CONFIG_NUM_CPU_IDS);
+
+ if (odp_global_ro.system_info.cpu_hz_static)
+ return cpu_hz_static(id);
+ return cpu_hz_current(id);
}
uint64_t odp_cpu_hz_max(void)
diff --git a/platform/linux-generic/test/inline-timer.conf b/platform/linux-generic/test/inline-timer.conf
index 90709d86d..38da87617 100644
--- a/platform/linux-generic/test/inline-timer.conf
+++ b/platform/linux-generic/test/inline-timer.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-generic"
-config_file_version = "0.1.18"
+config_file_version = "0.1.19"
timer: {
# Enable inline timer implementation
diff --git a/platform/linux-generic/test/packet_align.conf b/platform/linux-generic/test/packet_align.conf
index f9b39abf6..e3e4251cd 100644
--- a/platform/linux-generic/test/packet_align.conf
+++ b/platform/linux-generic/test/packet_align.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-generic"
-config_file_version = "0.1.18"
+config_file_version = "0.1.19"
pool: {
pkt: {
diff --git a/platform/linux-generic/test/process-mode.conf b/platform/linux-generic/test/process-mode.conf
index a4b5d3f39..7453ffa36 100644
--- a/platform/linux-generic/test/process-mode.conf
+++ b/platform/linux-generic/test/process-mode.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-generic"
-config_file_version = "0.1.18"
+config_file_version = "0.1.19"
# Shared memory options
shm: {
diff --git a/platform/linux-generic/test/sched-basic.conf b/platform/linux-generic/test/sched-basic.conf
index 4ef0ab044..32abdb5b3 100644
--- a/platform/linux-generic/test/sched-basic.conf
+++ b/platform/linux-generic/test/sched-basic.conf
@@ -1,6 +1,6 @@
# Mandatory fields
odp_implementation = "linux-generic"
-config_file_version = "0.1.18"
+config_file_version = "0.1.19"
# Test scheduler with an odd spread value and without dynamic load balance
sched_basic: {