hypervisor: kvm: Correctly share VmmOps between Kvm{Vm,Vcpu}

Cloning the ArcSwapOption (like the ArcSwap) does not act like a
.clone() on an Arc, instead an entirely new ArcSwap is created with the
same contents. To correctly share the ArcSwap needs to be placed inside
an Arc.

See: 2433d5719b (diff-6c6d94533c44c19bd1416ef17bad1a878e63dca6e98d59181228fbe8f967c62bR6)

Due to this being wrongly used ::clone() was removed from
ArcSwap/ArcSwapOption in 1.0.0.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2020-11-16 11:51:24 +00:00 committed by Samuel Ortiz
parent 096d99664d
commit 46e736973e

View File

@ -96,7 +96,7 @@ pub struct KvmVm {
#[cfg(target_arch = "x86_64")]
msrs: MsrEntries,
state: KvmVmState,
vmmops: ArcSwapOption<Box<dyn vm::VmmOps>>,
vmmops: Arc<ArcSwapOption<Box<dyn vm::VmmOps>>>,
}
// Returns a `Vec<T>` with a size in bytes at least as large as `size_in_bytes`.
@ -439,7 +439,7 @@ impl hypervisor::Hypervisor for KvmHypervisor {
fd: vm_fd,
msrs,
state: VmState {},
vmmops: ArcSwapOption::from(None),
vmmops: Arc::new(ArcSwapOption::from(None)),
}))
}
@ -448,7 +448,7 @@ impl hypervisor::Hypervisor for KvmHypervisor {
Ok(Arc::new(KvmVm {
fd: vm_fd,
state: VmState {},
vmmops: ArcSwapOption::from(None),
vmmops: Arc::new(ArcSwapOption::from(None)),
}))
}
}
@ -509,7 +509,7 @@ pub struct KvmVcpu {
fd: VcpuFd,
#[cfg(target_arch = "x86_64")]
msrs: MsrEntries,
vmmops: ArcSwapOption<Box<dyn vm::VmmOps>>,
vmmops: Arc<ArcSwapOption<Box<dyn vm::VmmOps>>>,
#[cfg(target_arch = "x86_64")]
hyperv_synic: AtomicBool,
}