diff options
-rw-r--r-- | config/odp-linux-generic.conf | 10 | ||||
-rw-r--r-- | platform/linux-generic/include/odp_global_data.h | 13 | ||||
-rw-r--r-- | platform/linux-generic/include/odp_sysinfo_internal.h | 1 | ||||
-rw-r--r-- | platform/linux-generic/m4/odp_libconfig.m4 | 2 | ||||
-rw-r--r-- | platform/linux-generic/odp_system_info.c | 50 | ||||
-rw-r--r-- | platform/linux-generic/test/inline-timer.conf | 2 | ||||
-rw-r--r-- | platform/linux-generic/test/packet_align.conf | 2 | ||||
-rw-r--r-- | platform/linux-generic/test/process-mode.conf | 2 | ||||
-rw-r--r-- | platform/linux-generic/test/sched-basic.conf | 2 |
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: { |