timer: get TSC frequency from /proc/cpuinfo
authorThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 31 May 2012 17:00:31 +0000 (19:00 +0200)
committerDavid Marchand <david.marchand@6wind.com>
Wed, 26 Feb 2014 10:01:14 +0000 (11:01 +0100)
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 <thomas.monjalon@6wind.com>
Acked-by: Ivan Boule <ivan.boule@6wind.com>
lib/librte_eal/linuxapp/eal/eal_timer.c

index 64566d1..1d10457 100644 (file)
@@ -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);