Hi,

By the beginning of February I posted an RFC regarding an approach to
alleviate time drift with HPET periodic timers.

Ref.: http://article.gmane.org/gmane.comp.emulators.kvm.devel/67346
      http://lists.gnu.org/archive/html/qemu-devel/2011-02/msg00327.html

During the discussion it became apparent that a generic API that could
facilitate (re)injection of lost timer interrupts for any timer device
emulation would be preferred over an isolated fix for a specific device.
However, at this stage there appears to be no plan to actually implement
the generic API. Therefore, we may want to reconsider an improved version
of the code that I originally included in the RFC. This improved version
compensates the loss of timer interrupts caused by ...

-  delayed timer callback.
-  interrupt coalescing (x86 only).

Lost timer interrupts are compensated by gradually injecting additional
interrupts during the subsequent timer intervals, starting at a rate of
one additional interrupt per interval. If further interrupts are lost
while compensation is still in progress, the rate is increased. A limit
is imposed on the rate and on the 'backlog' of lost interrupts that are
to be injected. Compensation of lost timer interrupts can be enabled via
a new QEMU command line option [1].

  -hpet [device=none|present][,driftfix=none|slew]

The code is enclosed in '#ifdef CONFIG_HPET_DRIFTFIX ... #endif' and
it is configurable via a new option '--enable-hpet-driftfix' for the
'configure' script. This also makes it easy to identify and to remove
if the generic API would be implemented some day.

I've tested this code primarily by playing a list of example video files
continuously in a Windows Vista(tm) guest. In some cases I observed the
guest time fall 15+ seconds behind KVM host time in one minute without
the patch, whereas with the patch there was no visible difference between
the guest time and KVM host time after several hours of testing [2]. The
'qemu-system-x86_64' test binary image file was built from snapshot ...

http://git.kernel.org/?p=virt/kvm/qemu-kvm.git;a=commit;h=e700699e9f6f1e163985a8e4cd76d8568d24c152

... using only the '--prefix' and '--enable-hpet-driftfix' options of the
'configure' script (other options default). The series of patches is based
on the aforementioned snapshot and it consists of three parts.

-  Part 1 introduces the new QEMU command line option.
-  Part 2 implements the method to compensate lost timer interrupts.
-  Part 3 introduces the new option for the 'configure' script.

Please review and please comment.


Regards,

Uli Obergfell


[1] Injecting additional timer interrupts to compensate lost interrupts
    can alleviate long term time drift. However, on a short time scale,
    this method can have the side effect of making virtual machine time
    intermittently pass faster than real time (depending on the guest's
    time keeping algorithm). Compensation is disabled by default and can
    be enabled for guests where this behaviour is acceptable.

[2] Testing required a patch in tight_compress_data(), ui/vnc-enc-tight.c
    to avoid segmentation fault / core dump of qemu. However, this needs
    to be discussed in a separate post.

Reply via email to