Dear YangFeng,

thanks for the question :-)

Timekeeping is a complex topic.
Could you perhaps add more detail on what you are trying to achieve?
Linux offers various API functions for timing, in the kernel and in 
the user space - though oops, you haven't mentioned what guest VM you 
are considering...
Different timing functions serve different purposes, and under the 
hood, they tap into different hardware "resources" available (timers, 
counters, whatever). Such as, you can ask the guest OS:
- "wake me up after 20 ms, starting from now"
- Or, you can ask it "wake me up at 13:07:21.057 precisely". 
- Or, you may merely want to know "what time is it, right now as I'm 
asking?" 

Note that QEMU/KVM comes accompanied by a set of guest-side drivers. 
One of them presents a virtual PHC. This will provide a fairly 
precise answer to the question "what time is it right now", tapping 
into the host's timebase and hardware. Ordinarily, you would let your 
guest OS sync its timebase to that PHC, and your applications running 
in the guest would then get precise time just by asking their OS in 
the standard way.

If the question really is, "how precise are the emulated HW timers", 
e.g. the PC AT i8254 programmable timer, or some HPET (not sure if 
this even gets emulated) - obviously that emulation is not so rosy. 
Its precision boils down to event (interrupt) handling latency and 
jitter. Things are relatively good if you have a whole CPU core 
reserved to the particular VM guest instance - but if multiple guest 
VM instances share the time of a physical host CPU core, guess what's 
likely to happen... Same thing if the HV/host OS instance is busy, 
especially if busy serving other interrupts.

Please note that the PIT and HPET exist just once for the whole 
physical machine (are a part of the chipset) and therefore need to be 
emulated for each VM guest instance.
Modern x86 CPU's supposedly also have the "local APIC timer" - and 
the LAPIC supposedly is private to a CPU core. Not sure to what 
extent the LAPIC is beneficial to virtualization - you could argue 
that the VM guest could use it directly, if the CPU core is 
reserved/dedicated to a particular guest. Yet I wouldn't bet on this, 
and for the general case, the host / HV will likely want to keep a 
handle on the LAPIC timer per core (and maybe make it available to 
the VM guest through some virty encapsulation mechanism).
The one hardware counter that IMO needs no virty wrappers, is the TSC 
:-) It just counts forward, at some constant frequency, derived by 
multiplication from the physical CPU's external reference base.


I don't quite understand your note about the TCG *accelerator*.
I'm just a fellow user of QEMU, not conversant in the guts.
A quick google is telling me that the TCG is the code generator 
inside QEMU, that's able to emulate instructions not supported by 
your physical CPU.
In that vein, for optimal results, I would suggest to set the 
emulated CPU to "host" (=native). This should allow your guest OS to 
adapt to your host CPU's physical capabilities, thus all guest 
instructions get executed natively by bare metal, and thus the need 
to actually emulate instructions via the TCG gets minimized...

Frank

https://www.vmware.com/docs/vmware_timekeeping
https://wiki.osdev.org/APIC_Timer
https://airbus-seclab.github.io/qemu_blog/tcg_p1.html



Subject:                Timer quality
From:                   Yanfeng Liu <yfliu2...@qq.com>
To:                     qemu-discuss@nongnu.org
Date sent:              Wed, 05 Mar 2025 15:37:30 +0800

> Dear experts,
> 
> I am wondering how the precision of timers are with QEMU on x64 Ubuntu
> Linux and TCG accelerator?
> 
> Regards,
> yf
> 
> 
> 
> 



Reply via email to