hypervisor: drop create_device from Vm trait

This then avoids the need for creating a generic DeviceFd type in the
hypervisor crate.

Signed-off-by: Wei Liu <liuwe@microsoft.com>
This commit is contained in:
Wei Liu 2022-07-20 15:11:27 +00:00 committed by Liu Wei
parent 500d91311f
commit 422bf89d4d
3 changed files with 28 additions and 26 deletions

View File

@ -314,6 +314,20 @@ pub struct KvmVm {
dirty_log_slots: Arc<RwLock<HashMap<u32, KvmDirtyLogSlot>>>, dirty_log_slots: Arc<RwLock<HashMap<u32, KvmDirtyLogSlot>>>,
} }
impl KvmVm {
///
/// Creates an emulated device in the kernel.
///
/// See the documentation for `KVM_CREATE_DEVICE`.
fn create_device(&self, device: &mut CreateDevice) -> vm::Result<Arc<dyn device::Device>> {
let device_fd = self
.fd
.create_device(device)
.map_err(|e| vm::HypervisorVmError::CreateDevice(e.into()))?;
Ok(Arc::new(device_fd))
}
}
/// ///
/// Implementation of Vm trait for KVM /// Implementation of Vm trait for KVM
/// Example: /// Example:
@ -616,17 +630,6 @@ impl vm::Vm for KvmVm {
} }
} }
/// ///
/// Creates an emulated device in the kernel.
///
/// See the documentation for `KVM_CREATE_DEVICE`.
fn create_device(&self, device: &mut CreateDevice) -> vm::Result<Arc<dyn device::Device>> {
let device_fd = self
.fd
.create_device(device)
.map_err(|e| vm::HypervisorVmError::CreateDevice(e.into()))?;
Ok(Arc::new(device_fd))
}
///
/// Returns the preferred CPU target type which can be emulated by KVM on underlying host. /// Returns the preferred CPU target type which can be emulated by KVM on underlying host.
/// ///
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]

View File

@ -913,6 +913,20 @@ pub struct MshvVm {
dirty_log_slots: Arc<RwLock<HashMap<u64, MshvDirtyLogSlot>>>, dirty_log_slots: Arc<RwLock<HashMap<u64, MshvDirtyLogSlot>>>,
} }
impl MshvVm {
///
/// Creates an in-kernel device.
///
/// See the documentation for `MSHV_CREATE_DEVICE`.
fn create_device(&self, device: &mut CreateDevice) -> vm::Result<Arc<dyn device::Device>> {
let device_fd = self
.fd
.create_device(device)
.map_err(|e| vm::HypervisorVmError::CreateDevice(e.into()))?;
Ok(Arc::new(device_fd))
}
}
/// ///
/// Implementation of Vm trait for Mshv /// Implementation of Vm trait for Mshv
/// Example: /// Example:
@ -1096,18 +1110,6 @@ impl vm::Vm for MshvVm {
.into() .into()
} }
///
/// Creates an in-kernel device.
///
/// See the documentation for `MSHV_CREATE_DEVICE`.
fn create_device(&self, device: &mut CreateDevice) -> vm::Result<Arc<dyn device::Device>> {
let device_fd = self
.fd
.create_device(device)
.map_err(|e| vm::HypervisorVmError::CreateDevice(e.into()))?;
Ok(Arc::new(device_fd))
}
fn create_passthrough_device(&self) -> vm::Result<Arc<dyn device::Device>> { fn create_passthrough_device(&self) -> vm::Result<Arc<dyn device::Device>> {
let mut vfio_dev = mshv_create_device { let mut vfio_dev = mshv_create_device {
type_: mshv_device_type_MSHV_DEV_TYPE_VFIO, type_: mshv_device_type_MSHV_DEV_TYPE_VFIO,

View File

@ -18,7 +18,6 @@ use crate::cpu::Vcpu;
use crate::device::Device; use crate::device::Device;
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
use crate::ClockData; use crate::ClockData;
use crate::CreateDevice;
use crate::UserMemoryRegion; use crate::UserMemoryRegion;
use crate::{IoEventAddress, IrqRoutingEntry}; use crate::{IoEventAddress, IrqRoutingEntry};
#[cfg(feature = "kvm")] #[cfg(feature = "kvm")]
@ -314,8 +313,6 @@ pub trait Vm: Send + Sync + Any {
fn create_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> Result<()>; fn create_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> Result<()>;
/// Removes a guest physical memory slot. /// Removes a guest physical memory slot.
fn remove_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> Result<()>; fn remove_user_memory_region(&self, user_memory_region: UserMemoryRegion) -> Result<()>;
/// Creates an emulated device in the kernel.
fn create_device(&self, device: &mut CreateDevice) -> Result<Arc<dyn Device>>;
/// Returns the preferred CPU target type which can be emulated by KVM on underlying host. /// Returns the preferred CPU target type which can be emulated by KVM on underlying host.
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
fn get_preferred_target(&self, kvi: &mut VcpuInit) -> Result<()>; fn get_preferred_target(&self, kvi: &mut VcpuInit) -> Result<()>;