timer: fix TSC frequency by not reading /proc/cpuinfo
This reverts commit da6fd0759c
.
"timer: get TSC frequency from /proc/cpuinfo"
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 <bruce.richardson@intel.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
This commit is contained in:
parent
99f2cdf9ca
commit
d73d8f3ad4
@ -278,35 +278,6 @@ 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)
|
||||
{
|
||||
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user