x86/vhpet: avoid 'small' time diff test on resume
authorPaul Durrant <paul.durrant@citrix.com>
Fri, 5 Jul 2019 08:29:12 +0000 (10:29 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 5 Jul 2019 08:29:12 +0000 (10:29 +0200)
commit7ca58e5aa3dec342743cd0e4a8088085aefe9277
tree43388f6d27cdb9559187bfed28ddc674e3e3275b
parentbe800a1676ca2a6347f2c792c09c8446d0e87d46
x86/vhpet: avoid 'small' time diff test on resume

It appears that even 64-bit versions of Windows 10, when not using syth-
etic timers, will use 32-bit HPET non-periodic timers. There is a test
in hpet_set_timer(), specific to 32-bit timers, that tries to disambiguate
between a comparator value that is in the past and one that is sufficiently
far in the future that it wraps. This is done by assuming that the delta
between the main counter and comparator will be 'small' [1], if the
comparator value is in the past. Unfortunately, more often than not, this
is not the case if the timer is being re-started after a migrate and so
the timer is set to fire far in the future (in excess of a minute in
several observed cases) rather then set to fire immediately. This has a
rather odd symptom where the guest console is alive enough to be able to
deal with mouse pointer re-rendering, but any keyboard activity or mouse
clicks yield no response.

This patch simply adds an extra check of 'creation_finished' into
hpet_set_timer() so that the 'small' time test is omitted when the function
is called to restart timers after migration, and thus any negative delta
causes a timer to fire immediately.

[1] The number of ticks that equate to 0.9765625 milliseconds

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: b144cf45d50b603c2909fc32c6abf7359f86f1aa
master date: 2019-05-31 11:40:52 +0200
xen/arch/x86/hvm/hpet.c