vmm: Ensure PIO/MMIO exits complete before pausing only for KVM

MSHV does not require to ensure MMIO/PIO exits complete
before pausing. This patch makes sure the above requirement
by checking the hypervisor type run-time.

Fixes #5037

Signed-off-by: Muminul Islam <muislam@microsoft.com>
This commit is contained in:
Muminul Islam 2023-01-09 13:22:43 -08:00 committed by Rob Bradford
parent e661139e1e
commit 4e3bc20f2c
2 changed files with 10 additions and 6 deletions

View File

@ -59,7 +59,7 @@ pub use vm::{
Vm, VmOps, Vm, VmOps,
}; };
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum HypervisorType { pub enum HypervisorType {
#[cfg(feature = "kvm")] #[cfg(feature = "kvm")]
Kvm, Kvm,

View File

@ -811,6 +811,8 @@ impl CpuManager {
) -> Result<()> { ) -> Result<()> {
let reset_evt = self.reset_evt.try_clone().unwrap(); let reset_evt = self.reset_evt.try_clone().unwrap();
let exit_evt = self.exit_evt.try_clone().unwrap(); let exit_evt = self.exit_evt.try_clone().unwrap();
#[cfg(feature = "kvm")]
let hypervisor_type = self.hypervisor_type;
#[cfg(feature = "guest_debug")] #[cfg(feature = "guest_debug")]
let vm_debug_evt = self.vm_debug_evt.try_clone().unwrap(); let vm_debug_evt = self.vm_debug_evt.try_clone().unwrap();
let panic_exit_evt = self.exit_evt.try_clone().unwrap(); let panic_exit_evt = self.exit_evt.try_clone().unwrap();
@ -919,6 +921,7 @@ impl CpuManager {
#[cfg(feature = "kvm")] #[cfg(feature = "kvm")]
{ {
if matches!(hypervisor_type, HypervisorType::Kvm) {
vcpu.lock().as_ref().unwrap().vcpu.set_immediate_exit(true); vcpu.lock().as_ref().unwrap().vcpu.set_immediate_exit(true);
if !matches!(vcpu.lock().unwrap().run(), Ok(VmExit::Ignore)) { if !matches!(vcpu.lock().unwrap().run(), Ok(VmExit::Ignore)) {
error!("Unexpected VM exit on \"immediate_exit\" run"); error!("Unexpected VM exit on \"immediate_exit\" run");
@ -926,6 +929,7 @@ impl CpuManager {
} }
vcpu.lock().as_ref().unwrap().vcpu.set_immediate_exit(false); vcpu.lock().as_ref().unwrap().vcpu.set_immediate_exit(false);
} }
}
vcpu_run_interrupted.store(true, Ordering::SeqCst); vcpu_run_interrupted.store(true, Ordering::SeqCst);
while vcpu_pause_signalled.load(Ordering::SeqCst) { while vcpu_pause_signalled.load(Ordering::SeqCst) {