diff --git a/src/runtime-rs/crates/hypervisor/src/device/device_manager.rs b/src/runtime-rs/crates/hypervisor/src/device/device_manager.rs index 376ed671d1..e5ec6276f5 100644 --- a/src/runtime-rs/crates/hypervisor/src/device/device_manager.rs +++ b/src/runtime-rs/crates/hypervisor/src/device/device_manager.rs @@ -8,6 +8,7 @@ use std::{collections::HashMap, sync::Arc}; use anyhow::{anyhow, Context, Result}; use kata_sys_util::rand::RandomBytes; +use kata_types::config::hypervisor::TopologyConfigInfo; use tokio::sync::{Mutex, RwLock}; use crate::{ @@ -94,15 +95,20 @@ pub struct DeviceManager { devices: HashMap, hypervisor: Arc, shared_info: SharedInfo, + pcie_topology: Option, } impl DeviceManager { - pub async fn new(hypervisor: Arc) -> Result { + pub async fn new( + hypervisor: Arc, + topo_config: Option<&TopologyConfigInfo>, + ) -> Result { let devices = HashMap::::new(); Ok(DeviceManager { devices, hypervisor, shared_info: SharedInfo::new().await, + pcie_topology: PCIeTopology::new(topo_config), }) } @@ -120,10 +126,11 @@ impl DeviceManager { .devices .get(device_id) .context("failed to find device")?; + let mut device_guard = device.lock().await; // attach device let result = device_guard - .attach(&mut None::<&mut PCIeTopology>, self.hypervisor.as_ref()) + .attach(&mut self.pcie_topology.as_mut(), self.hypervisor.as_ref()) .await; // handle attach error if let Err(e) = result { @@ -165,7 +172,7 @@ impl DeviceManager { if let Some(dev) = self.devices.get(device_id) { let mut device_guard = dev.lock().await; let result = match device_guard - .detach(&mut None::<&mut PCIeTopology>, self.hypervisor.as_ref()) + .detach(&mut self.pcie_topology.as_mut(), self.hypervisor.as_ref()) .await { Ok(index) => { @@ -605,6 +612,7 @@ mod tests { BlockConfig, KATA_BLK_DEV_TYPE, }; use anyhow::{anyhow, Context, Result}; + use kata_types::config::hypervisor::TopologyConfigInfo; use std::sync::Arc; use tests_utils::load_test_config; use tokio::sync::RwLock; @@ -612,6 +620,7 @@ mod tests { async fn new_device_manager() -> Result>> { let hypervisor_name: &str = "qemu"; let toml_config = load_test_config(hypervisor_name.to_owned())?; + let topo_config = TopologyConfigInfo::new(&toml_config); let hypervisor_config = toml_config .hypervisor .get(hypervisor_name) @@ -623,7 +632,7 @@ mod tests { .await; let dm = Arc::new(RwLock::new( - DeviceManager::new(Arc::new(hypervisor)) + DeviceManager::new(Arc::new(hypervisor), topo_config.as_ref()) .await .context("device manager")?, )); diff --git a/src/runtime-rs/crates/resource/src/manager_inner.rs b/src/runtime-rs/crates/resource/src/manager_inner.rs index 2b70fe90c0..284612453d 100644 --- a/src/runtime-rs/crates/resource/src/manager_inner.rs +++ b/src/runtime-rs/crates/resource/src/manager_inner.rs @@ -17,7 +17,7 @@ use hypervisor::{ }, BlockConfig, Hypervisor, VfioConfig, }; -use kata_types::config::TomlConfig; +use kata_types::config::{hypervisor::TopologyConfigInfo, TomlConfig}; use kata_types::mount::Mount; use oci::{Linux, LinuxCpu, LinuxResources}; use persist::sandbox_persist::Persist; @@ -59,8 +59,9 @@ impl ResourceManagerInner { toml_config: Arc, init_size_manager: InitialSizeManager, ) -> Result { + let topo_config = TopologyConfigInfo::new(&toml_config); // create device manager - let dev_manager = DeviceManager::new(hypervisor.clone()) + let dev_manager = DeviceManager::new(hypervisor.clone(), topo_config.as_ref()) .await .context("failed to create device manager")?; @@ -510,12 +511,14 @@ impl Persist for ResourceManagerInner { sid: resource_args.sid.clone(), config: resource_args.config, }; + let topo_config = TopologyConfigInfo::new(&args.config); + Ok(Self { sid: resource_args.sid, agent: resource_args.agent, hypervisor: resource_args.hypervisor.clone(), device_manager: Arc::new(RwLock::new( - DeviceManager::new(resource_args.hypervisor).await?, + DeviceManager::new(resource_args.hypervisor, topo_config.as_ref()).await?, )), network: None, share_fs: None, diff --git a/src/runtime-rs/crates/resource/src/network/endpoint/endpoints_test.rs b/src/runtime-rs/crates/resource/src/network/endpoint/endpoints_test.rs index 7bfb429621..83db7fe9ec 100644 --- a/src/runtime-rs/crates/resource/src/network/endpoint/endpoints_test.rs +++ b/src/runtime-rs/crates/resource/src/network/endpoint/endpoints_test.rs @@ -9,6 +9,7 @@ mod tests { use std::sync::Arc; use anyhow::{anyhow, Context, Result}; + use kata_types::config::hypervisor::TopologyConfigInfo; use netlink_packet_route::MACVLAN_MODE_PRIVATE; use scopeguard::defer; use tests_utils::load_test_config; @@ -29,6 +30,7 @@ mod tests { async fn get_device_manager() -> Result>> { let hypervisor_name: &str = "qemu"; let toml_config = load_test_config(hypervisor_name.to_owned())?; + let topo_config = TopologyConfigInfo::new(&toml_config); let hypervisor_config = toml_config .hypervisor .get(hypervisor_name) @@ -40,7 +42,7 @@ mod tests { .await; let dm = Arc::new(RwLock::new( - DeviceManager::new(Arc::new(hypervisor)) + DeviceManager::new(Arc::new(hypervisor), topo_config.as_ref()) .await .context("device manager")?, ));