aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2023-06-21 09:11:56 +0300
committerMatias Elo <matias.elo@nokia.com>2023-07-03 11:01:39 +0300
commitaa53b41739ab1df3c64aac3302615b6f04c72fb3 (patch)
tree5290a48dde666d08beb023286211c85edaa0b7d6
parentaf1a174d919465bf262a0dc5c91edaa1d3688fc1 (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>
-rw-r--r--platform/linux-generic/arch/x86/cpu_flags.c8
-rw-r--r--platform/linux-generic/arch/x86/odp_sysinfo_parse.c6
-rw-r--r--platform/linux-generic/include/odp_global_data.h4
-rw-r--r--platform/linux-generic/odp_init.c26
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;