diff options
author | Matias Elo <matias.elo@nokia.com> | 2023-06-21 09:11:56 +0300 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2023-07-03 11:01:39 +0300 |
commit | aa53b41739ab1df3c64aac3302615b6f04c72fb3 (patch) | |
tree | 5290a48dde666d08beb023286211c85edaa0b7d6 /platform | |
parent | af1a174d919465bf262a0dc5c91edaa1d3688fc1 (diff) |
linux-gen: cpu: detect constant_tsc from cpuinfo
INVTSC x86 CPU flag may not be always available with VMs. So, try also to
find 'constant_tsc' flag from /proc/cpuinfo.
Signed-off-by: Matias Elo <matias.elo@nokia.com>
Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
Diffstat (limited to 'platform')
-rw-r--r-- | platform/linux-generic/arch/x86/cpu_flags.c | 8 | ||||
-rw-r--r-- | platform/linux-generic/arch/x86/odp_sysinfo_parse.c | 6 | ||||
-rw-r--r-- | platform/linux-generic/include/odp_global_data.h | 4 | ||||
-rw-r--r-- | platform/linux-generic/odp_init.c | 26 |
4 files changed, 28 insertions, 16 deletions
diff --git a/platform/linux-generic/arch/x86/cpu_flags.c b/platform/linux-generic/arch/x86/cpu_flags.c index 482c25739..9211df002 100644 --- a/platform/linux-generic/arch/x86/cpu_flags.c +++ b/platform/linux-generic/arch/x86/cpu_flags.c @@ -10,9 +10,12 @@ */ #include "cpu_flags.h" -#include <odp_debug_internal.h> + #include <odp/api/abi/time_cpu.h> +#include <odp_debug_internal.h> +#include <odp_global_data.h> + #include <cpuid.h> #include <errno.h> #include <stdio.h> @@ -356,7 +359,8 @@ void _odp_cpu_flags_print_all(void) int _odp_time_cpu_global_freq_is_const(void) { - if (cpu_get_flag_enabled(RTE_CPUFLAG_INVTSC) > 0) + if (odp_global_ro.system_info.cpu_constant_tsc || + cpu_get_flag_enabled(RTE_CPUFLAG_INVTSC) > 0) return 1; _ODP_ERR("WARN: assuming constant TSC based on CPU arch, but could not confirm from CPU " diff --git a/platform/linux-generic/arch/x86/odp_sysinfo_parse.c b/platform/linux-generic/arch/x86/odp_sysinfo_parse.c index c74c52045..3cbdb2037 100644 --- a/platform/linux-generic/arch/x86/odp_sysinfo_parse.c +++ b/platform/linux-generic/arch/x86/odp_sysinfo_parse.c @@ -1,4 +1,5 @@ /* Copyright (c) 2016-2018, Linaro Limited + * Copyright (c) 2023, Nokia * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause @@ -30,6 +31,11 @@ int _odp_cpuinfo_parser(FILE *file, system_info_t *sysinfo) strcpy(sysinfo->cpu_arch_str, "x86"); while (fgets(str, sizeof(str), file) != NULL && id < CONFIG_NUM_CPU_IDS) { + if (strstr(str, "flags") && strstr(str, "constant_tsc")) { + sysinfo->cpu_constant_tsc = 1; + continue; + } + pos = strstr(str, "model name"); if (pos) { freq_set = false; diff --git a/platform/linux-generic/include/odp_global_data.h b/platform/linux-generic/include/odp_global_data.h index d4cc9cda4..67b7572ef 100644 --- a/platform/linux-generic/include/odp_global_data.h +++ b/platform/linux-generic/include/odp_global_data.h @@ -1,4 +1,5 @@ /* Copyright (c) 2013-2018, Linaro Limited + * Copyright (c) 2023, Nokia * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause @@ -34,7 +35,8 @@ typedef struct { uint64_t default_cpu_hz; uint64_t page_size; int cache_line_size; - odp_bool_t cpu_hz_static; + uint8_t cpu_hz_static; + uint8_t cpu_constant_tsc; 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/odp_init.c b/platform/linux-generic/odp_init.c index f1aae95bb..e6ea8bc0c 100644 --- a/platform/linux-generic/odp_init.c +++ b/platform/linux-generic/odp_init.c @@ -27,8 +27,8 @@ enum init_stage { LIBCONFIG_INIT, CPUMASK_INIT, CPU_CYCLES_INIT, - TIME_INIT, SYSINFO_INIT, + TIME_INIT, ISHM_INIT, FDSERVER_INIT, GLOBAL_RW_DATA_INIT, @@ -292,16 +292,16 @@ static int term_global(enum init_stage stage) } /* Fall through */ - case SYSINFO_INIT: - if (_odp_system_info_term()) { - _ODP_ERR("ODP system info term failed.\n"); + case TIME_INIT: + if (_odp_time_term_global()) { + _ODP_ERR("ODP time term failed.\n"); rc = -1; } /* Fall through */ - case TIME_INIT: - if (_odp_time_term_global()) { - _ODP_ERR("ODP time term failed.\n"); + case SYSINFO_INIT: + if (_odp_system_info_term()) { + _ODP_ERR("ODP system info term failed.\n"); rc = -1; } /* Fall through */ @@ -372,18 +372,18 @@ int odp_init_global(odp_instance_t *instance, } stage = CPU_CYCLES_INIT; - if (_odp_time_init_global()) { - _ODP_ERR("ODP time init failed.\n"); - goto init_failed; - } - stage = TIME_INIT; - if (_odp_system_info_init()) { _ODP_ERR("ODP system_info init failed.\n"); goto init_failed; } stage = SYSINFO_INIT; + if (_odp_time_init_global()) { + _ODP_ERR("ODP time init failed.\n"); + goto init_failed; + } + stage = TIME_INIT; + if (_odp_ishm_init_global(params)) { _ODP_ERR("ODP ishm init failed.\n"); goto init_failed; |