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")] #[cfg(target_arch = "x86_64")]
msrs: MsrEntries, msrs: MsrEntries,
state: KvmVmState, 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`. // 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, fd: vm_fd,
msrs, msrs,
state: VmState {}, 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 { Ok(Arc::new(KvmVm {
fd: vm_fd, fd: vm_fd,
state: VmState {}, state: VmState {},
vmmops: ArcSwapOption::from(None), vmmops: Arc::new(ArcSwapOption::from(None)),
})) }))
} }
} }
@ -509,7 +509,7 @@ pub struct KvmVcpu {
fd: VcpuFd, fd: VcpuFd,
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
msrs: MsrEntries, msrs: MsrEntries,
vmmops: ArcSwapOption<Box<dyn vm::VmmOps>>, vmmops: Arc<ArcSwapOption<Box<dyn vm::VmmOps>>>,
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
hyperv_synic: AtomicBool, hyperv_synic: AtomicBool,
} }