In XenServer system test it has become apparent that versions of Windows that make use of the time reference counter enlightenment cannot cope with large jumps forward in the value read from the MSR. Specifically, suspending a very large domain took approx. 45 minutes to complete and when the domain was resumed it was discovered that the WMI (Windows Management Instrumentation) service had hung.
The reason a large jump forward is seen by the guest is that, when a guest is suspended, the guest stops running when the SCHEDOP_suspend hypercall is made, however the MSR value essentially keeps incrementing until the tool-stack issues DOMCTL_gethvmcontext.
This patch adds code to freeze the value of the time reference counter on domain pause and 'thaw' it on domain unpause, but only thaw it if the domain is not shutting down. The absolute value of the counter is then saved in the viridian domain context record. This prevents the guest OS from experiencing large jumps in the value of the MSR and has been shown to reliably fix the problem with WMI.
f6a0764 x86/viridian: freeze time reference counter when domain is paused
xen/arch/arm/domain.c | 12 +++++++
xen/arch/x86/domain.c | 19 ++++++++++
xen/arch/x86/hvm/viridian.c | 60 +++++++++++++++++++++++++-------
xen/common/domain.c | 26 ++++++++------
xen/include/asm-x86/hvm/hvm.h | 9 ++++-
xen/include/asm-x86/hvm/viridian.h | 27 ++++++++++++++
xen/include/public/arch-x86/hvm/save.h | 1 +
xen/include/xen/domain.h | 4 +++
8 files changed, 135 insertions(+), 23 deletions(-)