mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-24 22:43:05 +00:00
runtime-rs: Refactor vfio driver implementation
It's important to ensure that these tasks which setup vfio devices are completed before add_device. So Moving vfio device setup code to a dedicated method at device building time which does not affect the behavior of other code. And this change makes it easier to understand the difference between create and attach, and also makes the boundaries clearer. Fixes: #8665 Signed-off-by: alex.lyn <alex.lyn@antgroup.com>
This commit is contained in:
parent
82d3cfdeda
commit
94c83cea84
@ -291,7 +291,7 @@ impl DeviceManager {
|
||||
Arc::new(Mutex::new(VfioDevice::new(
|
||||
device_id.clone(),
|
||||
&vfio_dev_config,
|
||||
)))
|
||||
)?))
|
||||
}
|
||||
DeviceConfig::VhostUserBlkCfg(config) => {
|
||||
// try to find the device, found and just return id.
|
||||
|
@ -252,7 +252,7 @@ pub struct VfioDevice {
|
||||
|
||||
impl VfioDevice {
|
||||
// new with VfioConfig
|
||||
pub fn new(device_id: String, dev_info: &VfioConfig) -> Self {
|
||||
pub fn new(device_id: String, dev_info: &VfioConfig) -> Result<Self> {
|
||||
// devices and device_options are in a 1-1 mapping, used in
|
||||
// vfio-pci handler for kata-agent.
|
||||
let devices: Vec<HostDevice> = Vec::with_capacity(MAX_DEV_ID_SIZE);
|
||||
@ -262,7 +262,7 @@ impl VfioDevice {
|
||||
let dev_type = dev_info.dev_type.as_str();
|
||||
let driver_type = VfioBusMode::driver_type(dev_type).to_owned();
|
||||
|
||||
Self {
|
||||
let mut vfio_device = Self {
|
||||
device_id,
|
||||
attach_count: 0,
|
||||
bus_mode: VfioBusMode::PCI,
|
||||
@ -270,7 +270,13 @@ impl VfioDevice {
|
||||
config: dev_info.clone(),
|
||||
devices,
|
||||
device_options,
|
||||
}
|
||||
};
|
||||
|
||||
vfio_device
|
||||
.initialize_vfio_device()
|
||||
.context("initialize vfio device failed.")?;
|
||||
|
||||
Ok(vfio_device)
|
||||
}
|
||||
|
||||
fn get_host_path(&self) -> String {
|
||||
@ -370,7 +376,7 @@ impl VfioDevice {
|
||||
Ok(DeviceVendor(device, vendor))
|
||||
}
|
||||
|
||||
async fn set_vfio_config(
|
||||
fn set_vfio_config(
|
||||
&mut self,
|
||||
iommu_devs_path: PathBuf,
|
||||
device_name: &str,
|
||||
@ -422,11 +428,8 @@ impl VfioDevice {
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Device for VfioDevice {
|
||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()> {
|
||||
fn initialize_vfio_device(&mut self) -> Result<()> {
|
||||
// host path: /dev/vfio/X
|
||||
let host_path = self.get_host_path();
|
||||
// vfio group: X
|
||||
@ -460,7 +463,6 @@ impl Device for VfioDevice {
|
||||
|
||||
let mut hostdev: HostDevice = self
|
||||
.set_vfio_config(iommu_devs_path.clone(), device)
|
||||
.await
|
||||
.context("set vfio config failed")?;
|
||||
let dev_prefix = self.get_vfio_prefix();
|
||||
hostdev.hostdev_id = make_device_nameid(&dev_prefix, index, MAX_DEV_ID_SIZE);
|
||||
@ -468,6 +470,13 @@ impl Device for VfioDevice {
|
||||
self.devices.push(hostdev);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Device for VfioDevice {
|
||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()> {
|
||||
if self
|
||||
.increase_attach_count()
|
||||
.await
|
||||
|
Loading…
Reference in New Issue
Block a user