From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 1039E159 for ; Mon, 7 Apr 2014 14:55:55 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP; 07 Apr 2014 05:57:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.97,810,1389772800"; d="scan'208";a="508401601" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga001.fm.intel.com with ESMTP; 07 Apr 2014 05:57:30 -0700 Received: from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com [10.237.217.46]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id s37CvUOg002679; Mon, 7 Apr 2014 13:57:30 +0100 Received: from sivswdev02.ir.intel.com (localhost [127.0.0.1]) by sivswdev02.ir.intel.com with ESMTP id s37CvTki014813; Mon, 7 Apr 2014 13:57:29 +0100 Received: (from bricha3@localhost) by sivswdev02.ir.intel.com with id s37CvTVm014808; Mon, 7 Apr 2014 13:57:29 +0100 From: Bruce Richardson To: dev@dpdk.org Date: Mon, 7 Apr 2014 13:57:28 +0100 Message-Id: <1396875448-14778-1-git-send-email-bruce.richardson@intel.com> X-Mailer: git-send-email 1.7.0.7 Subject: [dpdk-dev] [PATCH] Revert "timer: get TSC frequency from /proc/cpuinfo" X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Apr 2014 12:55:56 -0000 This reverts commit da6fd0759cbeb5fc14991a79e40105b9f6b99059. The use of cpuinfo to determine the frequency of the TSC is not advisable and leads to incorrect results when power management is in use. This is because, while the TSC frequency does not change in modern cpus with constant_tsc support, the frequency of the core, and hence the frequency of the core reported by cpuinfo *does* change. Depending on the current frequency of core 0 when an application is started, the EAL can get a wildly incorrect value for the TSC freq. Since frequency is scaled down for power saving, any incorrect value is likely to be lower than the default, which means that any delay loops inside the code which rely on the TSC will be shorter than planned. This can cause issues (reported on the mailing list by a number of people) where ports are not initialized correctly due to delays being too short. Signed-off-by: Bruce Richardson --- lib/librte_eal/linuxapp/eal/eal_timer.c | 34 +----------------------------- 1 files changed, 2 insertions(+), 32 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_timer.c b/lib/librte_eal/linuxapp/eal/eal_timer.c index 1d10457..64566d1 100644 --- a/lib/librte_eal/linuxapp/eal/eal_timer.c +++ b/lib/librte_eal/linuxapp/eal/eal_timer.c @@ -279,35 +279,6 @@ check_tsc_flags(void) } 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) { #ifdef CLOCK_MONOTONIC_RAW @@ -355,9 +326,8 @@ set_tsc_freq_fallback(void) static void set_tsc_freq(void) { - if (set_tsc_freq_from_cpuinfo() < 0 && - set_tsc_freq_from_clock() < 0) - set_tsc_freq_fallback(); + if (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); -- 1.7.0.7