From: Ivan Boule Date: Thu, 31 May 2012 14:41:57 +0000 (+0200) Subject: timer: check TSC reliability X-Git-Tag: spdx-start~10956 X-Git-Url: http://git.droids-corp.org/?p=dpdk.git;a=commitdiff_plain;h=fb022b85bae4e262922a3ab035adadb03c57387e timer: check TSC reliability Read flags from /proc/cpuinfo and warn if constant_tsc or nonstop_tsc is not found. Signed-off-by: Thomas Monjalon Acked-by: Ivan Boule --- diff --git a/lib/librte_eal/linuxapp/eal/eal_timer.c b/lib/librte_eal/linuxapp/eal/eal_timer.c index b6cea1790d..64566d143d 100644 --- a/lib/librte_eal/linuxapp/eal/eal_timer.c +++ b/lib/librte_eal/linuxapp/eal/eal_timer.c @@ -2,6 +2,7 @@ * BSD LICENSE * * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * Copyright(c) 2012-2013 6WIND S.A. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -242,6 +243,41 @@ rte_eal_hpet_init(int make_default) } #endif +static void +check_tsc_flags(void) +{ + char line[512]; + FILE *stream; + + stream = fopen("/proc/cpuinfo", "r"); + if (!stream) { + RTE_LOG(WARNING, EAL, "WARNING: Unable to open /proc/cpuinfo\n"); + return; + } + + while (fgets(line, sizeof line, stream)) { + char *constant_tsc; + char *nonstop_tsc; + + if (strncmp(line, "flags", 5) != 0) + continue; + + constant_tsc = strstr(line, "constant_tsc"); + nonstop_tsc = strstr(line, "nonstop_tsc"); + if (!constant_tsc || !nonstop_tsc) + RTE_LOG(WARNING, EAL, + "WARNING: cpu flags " + "constant_tsc=%s " + "nonstop_tsc=%s " + "-> using unreliable clock cycles !\n", + constant_tsc ? "yes":"no", + nonstop_tsc ? "yes":"no"); + break; + } + + fclose(stream); +} + static int set_tsc_freq_from_clock(void) { @@ -304,5 +340,6 @@ rte_eal_timer_init(void) eal_timer_source = EAL_TIMER_TSC; set_tsc_freq(); + check_tsc_flags(); return 0; }