On 2020-04-27 15:20 GMT+0300 Fady Bader wrote: > Implemented the needed Windows eal timer functions. [snip] > +void > +rte_delay_us_sleep(unsigned int us) > +{ > + HANDLE timer; > + LARGE_INTEGER li_due_time;
Here usually comes a blank line. > + /* create waitable timer */ > + timer = CreateWaitableTimer(NULL, TRUE, NULL); > + if (!timer) { > + RTE_LOG_WIN32_ERR("CreateWaitableTimer()"); > + rte_errno = ENOMEM; > + return; > + } > + > + /* set us microseconds time for timer */ > + li_due_time.QuadPart = -(us * 10); The comment is still misleading. [snip] > +uint64_t > +get_tsc_freq(void) > +{ > + uint64_t tsc_freq; > + LARGE_INTEGER Frequency; > + > + QueryPerformanceFrequency(&Frequency); > + > + /* > + * Mulitply by 1K to obtain the true frequency of the CPU > + * it was noted in the MSDN "in many cases, QueryPerformanceFrequency > + * returns the TSC frequency divided by 1024" > + */ > + tsc_freq = ((uint64_t)Frequency.QuadPart * 1024); > + > + return tsc_freq; > +} Extended quote from MSDN: Cases might exist where QueryPerformanceFrequency doesn't return the actual frequency of the hardware tick generator. For example, in many cases, QueryPerformanceFrequency returns the TSC frequency divided by 1024; and on Hyper-V, the performance counter frequency is always 10 MHz when the guest virtual machine runs under a hypervisor that implements the hypervisor version 1.0 interface. As a result, don't assume that QueryPerformanceFrequency will return the precise TSC frequency. https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps "In many cases" is pretty vague, we can't distinguish such cases. Here's what I observe on my QEMU guest ("ticks" is Win32 API, "tsc" is RDTSC): freq = 100000000 Hz # note: 100 MHz, not 10 MHz delta (ticks) = 100401071 # Sleep(1000) delta (secs) = 1.004011 # delta (ticks) / freq delta (tsc) = 3460948332 # roughly CPU clock frequency tsc / tick = 34.471229 I suggest measuring a real-time delay with rte_get_tsc_cycles() from arch/ as other EALs do when HPET is not available or configured. This is discouraged by MSDN, but its reasons seem irrelevant for DPDK. -- Dmitry Kozlyuk