Re: [PATCH v5 untested] kvm: better MWAIT emulation for guests
From: Alexander Graf
Date: Mon Mar 27 2017 - 09:34:54 EST
On 15/03/2017 22:22, Michael S. Tsirkin wrote:
Guests running Mac OS 5, 6, and 7 (Leopard through Lion) have a problem:
unless explicitly provided with kernel command line argument
"idlehalt=0" they'd implicitly assume MONITOR and MWAIT availability,
without checking CPUID.
We currently emulate that as a NOP but on VMX we can do better: let
guest stop the CPU until timer, IPI or memory change. CPU will be busy
but that isn't any worse than a NOP emulation.
Note that mwait within guests is not the same as on real hardware
because halt causes an exit while mwait doesn't. For this reason it
might not be a good idea to use the regular MWAIT flag in CPUID to
signal this capability. Add a flag in the hypervisor leaf instead.
So imagine we had proper MWAIT emulation capabilities based on page
faults. In that case, we could do something as fancy as
Treat MWAIT as pass-through by default
Have a per-vcpu monitor timer 10 times a second in the background that
checks which instruction we're in
If we're in mwait for the last - say - 1 second, switch to emulated
MWAIT, if $IP was in non-mwait within that time, reset counter.
Or instead maybe just reuse the adapter hlt logic?
Either way, with that we should be able to get super low latency IPIs
running while still maintaining some sanity on systems which don't have
dedicated CPUs for workloads.
And we wouldn't need guest modifications, which is a great plus. So
older guests (and Windows?) could benefit from mwait as well.
Alex