mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-09-04 10:24:37 +00:00
runtime-rs: add one more argument in Device attach/detach
Add one more argument with type &mut Option<&mut PCIeTopology> in attach and detach to inroduce methods within PCIe Topology. Fixes: #7218 Signed-off-by: alex.lyn <alex.lyn@antgroup.com>
This commit is contained in:
@@ -18,6 +18,7 @@ use crate::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
|
topology::PCIeTopology,
|
||||||
util::{get_host_path, get_virt_drive_name, DEVICE_TYPE_BLOCK},
|
util::{get_host_path, get_virt_drive_name, DEVICE_TYPE_BLOCK},
|
||||||
Device, DeviceConfig, DeviceType,
|
Device, DeviceConfig, DeviceType,
|
||||||
};
|
};
|
||||||
@@ -121,7 +122,9 @@ impl DeviceManager {
|
|||||||
.context("failed to find device")?;
|
.context("failed to find device")?;
|
||||||
let mut device_guard = device.lock().await;
|
let mut device_guard = device.lock().await;
|
||||||
// attach device
|
// attach device
|
||||||
let result = device_guard.attach(self.hypervisor.as_ref()).await;
|
let result = device_guard
|
||||||
|
.attach(&mut None::<&mut PCIeTopology>, self.hypervisor.as_ref())
|
||||||
|
.await;
|
||||||
// handle attach error
|
// handle attach error
|
||||||
if let Err(e) = result {
|
if let Err(e) = result {
|
||||||
match device_guard.get_device_info().await {
|
match device_guard.get_device_info().await {
|
||||||
@@ -161,7 +164,10 @@ impl DeviceManager {
|
|||||||
pub async fn try_remove_device(&mut self, device_id: &str) -> Result<()> {
|
pub async fn try_remove_device(&mut self, device_id: &str) -> Result<()> {
|
||||||
if let Some(dev) = self.devices.get(device_id) {
|
if let Some(dev) = self.devices.get(device_id) {
|
||||||
let mut device_guard = dev.lock().await;
|
let mut device_guard = dev.lock().await;
|
||||||
let result = match device_guard.detach(self.hypervisor.as_ref()).await {
|
let result = match device_guard
|
||||||
|
.detach(&mut None::<&mut PCIeTopology>, self.hypervisor.as_ref())
|
||||||
|
.await
|
||||||
|
{
|
||||||
Ok(index) => {
|
Ok(index) => {
|
||||||
if let Some(i) = index {
|
if let Some(i) = index {
|
||||||
// release the declared device index
|
// release the declared device index
|
||||||
|
@@ -477,7 +477,11 @@ impl VfioDevice {
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl Device for VfioDevice {
|
impl Device for VfioDevice {
|
||||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()> {
|
async fn attach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<()> {
|
||||||
if self
|
if self
|
||||||
.increase_attach_count()
|
.increase_attach_count()
|
||||||
.await
|
.await
|
||||||
@@ -525,7 +529,11 @@ impl Device for VfioDevice {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn detach(&mut self, h: &dyn hypervisor) -> Result<Option<u64>> {
|
async fn detach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<Option<u64>> {
|
||||||
if self
|
if self
|
||||||
.decrease_attach_count()
|
.decrease_attach_count()
|
||||||
.await
|
.await
|
||||||
|
@@ -9,7 +9,7 @@ use async_trait::async_trait;
|
|||||||
|
|
||||||
use super::VhostUserConfig;
|
use super::VhostUserConfig;
|
||||||
use crate::{
|
use crate::{
|
||||||
device::{Device, DeviceType},
|
device::{topology::PCIeTopology, Device, DeviceType},
|
||||||
Hypervisor as hypervisor,
|
Hypervisor as hypervisor,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -45,7 +45,11 @@ impl VhostUserBlkDevice {
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl Device for VhostUserBlkDevice {
|
impl Device for VhostUserBlkDevice {
|
||||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()> {
|
async fn attach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<()> {
|
||||||
// increase attach count, skip attach the device if the device is already attached
|
// increase attach count, skip attach the device if the device is already attached
|
||||||
if self
|
if self
|
||||||
.increase_attach_count()
|
.increase_attach_count()
|
||||||
@@ -64,7 +68,11 @@ impl Device for VhostUserBlkDevice {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn detach(&mut self, h: &dyn hypervisor) -> Result<Option<u64>> {
|
async fn detach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<Option<u64>> {
|
||||||
// get the count of device detached, and detach once it reaches 0
|
// get the count of device detached, and detach once it reaches 0
|
||||||
if self
|
if self
|
||||||
.decrease_attach_count()
|
.decrease_attach_count()
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
|
||||||
|
use crate::device::topology::PCIeTopology;
|
||||||
use crate::device::{Device, DeviceType};
|
use crate::device::{Device, DeviceType};
|
||||||
use crate::{Hypervisor, VhostUserConfig};
|
use crate::{Hypervisor, VhostUserConfig};
|
||||||
|
|
||||||
@@ -22,14 +23,22 @@ impl VhostUserNetDevice {
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl Device for VhostUserNetDevice {
|
impl Device for VhostUserNetDevice {
|
||||||
async fn attach(&mut self, h: &dyn Hypervisor) -> Result<()> {
|
async fn attach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn Hypervisor,
|
||||||
|
) -> Result<()> {
|
||||||
h.add_device(DeviceType::VhostUserNetwork(self.clone()))
|
h.add_device(DeviceType::VhostUserNetwork(self.clone()))
|
||||||
.await
|
.await
|
||||||
.context("add vhost-user-net device to hypervisor")?;
|
.context("add vhost-user-net device to hypervisor")?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn detach(&mut self, h: &dyn Hypervisor) -> Result<Option<u64>> {
|
async fn detach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn Hypervisor,
|
||||||
|
) -> Result<Option<u64>> {
|
||||||
h.remove_device(DeviceType::VhostUserNetwork(self.clone()))
|
h.remove_device(DeviceType::VhostUserNetwork(self.clone()))
|
||||||
.await
|
.await
|
||||||
.context("remove vhost-user-net device from hypervisor")?;
|
.context("remove vhost-user-net device from hypervisor")?;
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
use crate::device::pci_path::PciPath;
|
use crate::device::pci_path::PciPath;
|
||||||
|
use crate::device::topology::PCIeTopology;
|
||||||
use crate::device::Device;
|
use crate::device::Device;
|
||||||
use crate::device::DeviceType;
|
use crate::device::DeviceType;
|
||||||
use crate::Hypervisor as hypervisor;
|
use crate::Hypervisor as hypervisor;
|
||||||
@@ -73,7 +74,11 @@ impl BlockDevice {
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl Device for BlockDevice {
|
impl Device for BlockDevice {
|
||||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()> {
|
async fn attach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<()> {
|
||||||
// increase attach count, skip attach the device if the device is already attached
|
// increase attach count, skip attach the device if the device is already attached
|
||||||
if self
|
if self
|
||||||
.increase_attach_count()
|
.increase_attach_count()
|
||||||
@@ -98,7 +103,11 @@ impl Device for BlockDevice {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn detach(&mut self, h: &dyn hypervisor) -> Result<Option<u64>> {
|
async fn detach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<Option<u64>> {
|
||||||
// get the count of device detached, skip detach once it reaches the 0
|
// get the count of device detached, skip detach once it reaches the 0
|
||||||
if self
|
if self
|
||||||
.decrease_attach_count()
|
.decrease_attach_count()
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
|
||||||
use crate::device::{hypervisor, Device, DeviceType};
|
use crate::device::{hypervisor, topology::PCIeTopology, Device, DeviceType};
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Default)]
|
#[derive(Copy, Clone, Debug, Default)]
|
||||||
pub enum ShareFsMountOperation {
|
pub enum ShareFsMountOperation {
|
||||||
@@ -99,7 +99,11 @@ impl ShareFsDevice {
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl Device for ShareFsDevice {
|
impl Device for ShareFsDevice {
|
||||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()> {
|
async fn attach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<()> {
|
||||||
h.add_device(DeviceType::ShareFs(self.clone()))
|
h.add_device(DeviceType::ShareFs(self.clone()))
|
||||||
.await
|
.await
|
||||||
.context("add share-fs device.")?;
|
.context("add share-fs device.")?;
|
||||||
@@ -107,7 +111,11 @@ impl Device for ShareFsDevice {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn detach(&mut self, _h: &dyn hypervisor) -> Result<Option<u64>> {
|
async fn detach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
_h: &dyn hypervisor,
|
||||||
|
) -> Result<Option<u64>> {
|
||||||
// no need to detach share-fs device
|
// no need to detach share-fs device
|
||||||
|
|
||||||
Ok(None)
|
Ok(None)
|
||||||
|
@@ -9,6 +9,7 @@ use std::fmt;
|
|||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
|
||||||
|
use crate::device::topology::PCIeTopology;
|
||||||
use crate::device::{Device, DeviceType};
|
use crate::device::{Device, DeviceType};
|
||||||
use crate::Hypervisor as hypervisor;
|
use crate::Hypervisor as hypervisor;
|
||||||
|
|
||||||
@@ -70,7 +71,11 @@ impl NetworkDevice {
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl Device for NetworkDevice {
|
impl Device for NetworkDevice {
|
||||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()> {
|
async fn attach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<()> {
|
||||||
h.add_device(DeviceType::Network(self.clone()))
|
h.add_device(DeviceType::Network(self.clone()))
|
||||||
.await
|
.await
|
||||||
.context("add network device.")?;
|
.context("add network device.")?;
|
||||||
@@ -78,7 +83,11 @@ impl Device for NetworkDevice {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn detach(&mut self, h: &dyn hypervisor) -> Result<Option<u64>> {
|
async fn detach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<Option<u64>> {
|
||||||
h.remove_device(DeviceType::Network(self.clone()))
|
h.remove_device(DeviceType::Network(self.clone()))
|
||||||
.await
|
.await
|
||||||
.context("remove network device.")?;
|
.context("remove network device.")?;
|
||||||
|
@@ -12,7 +12,7 @@ use tokio::fs::{File, OpenOptions};
|
|||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
device::{Device, DeviceType},
|
device::{topology::PCIeTopology, Device, DeviceType},
|
||||||
Hypervisor as hypervisor,
|
Hypervisor as hypervisor,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -49,7 +49,11 @@ impl HybridVsockDevice {
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl Device for HybridVsockDevice {
|
impl Device for HybridVsockDevice {
|
||||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()> {
|
async fn attach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<()> {
|
||||||
h.add_device(DeviceType::HybridVsock(self.clone()))
|
h.add_device(DeviceType::HybridVsock(self.clone()))
|
||||||
.await
|
.await
|
||||||
.context("add hybrid vsock device.")?;
|
.context("add hybrid vsock device.")?;
|
||||||
@@ -57,7 +61,11 @@ impl Device for HybridVsockDevice {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn detach(&mut self, _h: &dyn hypervisor) -> Result<Option<u64>> {
|
async fn detach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
_h: &dyn hypervisor,
|
||||||
|
) -> Result<Option<u64>> {
|
||||||
// no need to do detach, just return Ok(None)
|
// no need to do detach, just return Ok(None)
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
@@ -135,7 +143,11 @@ impl VsockDevice {
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl Device for VsockDevice {
|
impl Device for VsockDevice {
|
||||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()> {
|
async fn attach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<()> {
|
||||||
h.add_device(DeviceType::Vsock(self.clone()))
|
h.add_device(DeviceType::Vsock(self.clone()))
|
||||||
.await
|
.await
|
||||||
.context("add vsock device.")?;
|
.context("add vsock device.")?;
|
||||||
@@ -143,7 +155,11 @@ impl Device for VsockDevice {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn detach(&mut self, _h: &dyn hypervisor) -> Result<Option<u64>> {
|
async fn detach(
|
||||||
|
&mut self,
|
||||||
|
_pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
_h: &dyn hypervisor,
|
||||||
|
) -> Result<Option<u64>> {
|
||||||
// no need to do detach, just return Ok(None)
|
// no need to do detach, just return Ok(None)
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
|
@@ -56,9 +56,17 @@ impl fmt::Display for DeviceType {
|
|||||||
#[async_trait]
|
#[async_trait]
|
||||||
pub trait Device: std::fmt::Debug + Send + Sync {
|
pub trait Device: std::fmt::Debug + Send + Sync {
|
||||||
// attach is to plug device into VM
|
// attach is to plug device into VM
|
||||||
async fn attach(&mut self, h: &dyn hypervisor) -> Result<()>;
|
async fn attach(
|
||||||
|
&mut self,
|
||||||
|
pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<()>;
|
||||||
// detach is to unplug device from VM
|
// detach is to unplug device from VM
|
||||||
async fn detach(&mut self, h: &dyn hypervisor) -> Result<Option<u64>>;
|
async fn detach(
|
||||||
|
&mut self,
|
||||||
|
pcie_topo: &mut Option<&mut PCIeTopology>,
|
||||||
|
h: &dyn hypervisor,
|
||||||
|
) -> Result<Option<u64>>;
|
||||||
// update is to do update for some device
|
// update is to do update for some device
|
||||||
async fn update(&mut self, h: &dyn hypervisor) -> Result<()>;
|
async fn update(&mut self, h: &dyn hypervisor) -> Result<()>;
|
||||||
// get_device_info returns device config
|
// get_device_info returns device config
|
||||||
|
Reference in New Issue
Block a user