From da6fd0759cbeb5fc14991a79e40105b9f6b99059 Mon Sep 17 00:00:00 2001 From: Thomas Monjalon Date: Thu, 31 May 2012 19:00:31 +0200 Subject: [PATCH] timer: get TSC frequency from /proc/cpuinfo TSC frequency was guessed by reading CLOCK_MONOTONIC_RAW or sleeping 1 sec. Now, read frequency from cpuinfo first. Keep other methods as fallbacks. Signed-off-by: Thomas Monjalon Acked-by: Ivan Boule --- lib/librte_eal/linuxapp/eal/eal_timer.c | 34 +++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_timer.c b/lib/librte_eal/linuxapp/eal/eal_timer.c index 64566d143d..1d10457b8d 100644 --- a/lib/librte_eal/linuxapp/eal/eal_timer.c +++ b/lib/librte_eal/linuxapp/eal/eal_timer.c @@ -278,6 +278,35 @@ check_tsc_flags(void) fclose(stream); } +static int +set_tsc_freq_from_cpuinfo(void) +{ + char line[256]; + FILE *stream; + double dmhz; + + stream = fopen("/proc/cpuinfo", "r"); + if (!stream) { + RTE_LOG(WARNING, EAL, "WARNING: Unable to open /proc/cpuinfo\n"); + return -1; + } + + while (fgets(line, sizeof line, stream)) { + if (sscanf(line, "cpu MHz\t: %lf", &dmhz) == 1) { + eal_tsc_resolution_hz = (uint64_t)(dmhz * 1000000UL); + break; + } + } + + fclose(stream); + + if (!eal_tsc_resolution_hz) { + RTE_LOG(WARNING, EAL, "WARNING: Cannot read CPU clock from cpuinfo\n"); + return -1; + } + return 0; +} + static int set_tsc_freq_from_clock(void) { @@ -326,8 +355,9 @@ set_tsc_freq_fallback(void) static void set_tsc_freq(void) { - if (set_tsc_freq_from_clock() < 0) - set_tsc_freq_fallback(); + if (set_tsc_freq_from_cpuinfo() < 0 && + set_tsc_freq_from_clock() < 0) + set_tsc_freq_fallback(); RTE_LOG(INFO, EAL, "TSC frequency is ~%"PRIu64" KHz\n", eal_tsc_resolution_hz/1000); -- 2.20.1