mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2025-01-22 04:25:21 +00:00
pci: Give PCI device ID back when removing a device
Upon removal of a PCI device, make sure we don't hold onto the device ID as it could be reused for another device later. Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
parent
df71aaee3f
commit
b50cbe5064
@ -31,6 +31,8 @@ pub enum PciRootError {
|
|||||||
MmioInsert(devices::BusError),
|
MmioInsert(devices::BusError),
|
||||||
/// Could not find an available device slot on the PCI bus.
|
/// Could not find an available device slot on the PCI bus.
|
||||||
NoPciDeviceSlotAvailable,
|
NoPciDeviceSlotAvailable,
|
||||||
|
/// Invalid PCI device identifier provided.
|
||||||
|
InvalidPciDeviceSlot(usize),
|
||||||
}
|
}
|
||||||
pub type Result<T> = std::result::Result<T, PciRootError>;
|
pub type Result<T> = std::result::Result<T, PciRootError>;
|
||||||
|
|
||||||
@ -146,6 +148,15 @@ impl PciBus {
|
|||||||
|
|
||||||
Err(PciRootError::NoPciDeviceSlotAvailable)
|
Err(PciRootError::NoPciDeviceSlotAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn put_device_id(&mut self, id: usize) -> Result<()> {
|
||||||
|
if id < NUM_DEVICE_IDS {
|
||||||
|
self.device_ids[id] = false;
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(PciRootError::InvalidPciDeviceSlot(id))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct PciConfigIo {
|
pub struct PciConfigIo {
|
||||||
|
@ -244,6 +244,10 @@ pub enum DeviceManagerError {
|
|||||||
/// Failed to find an available PCI device ID.
|
/// Failed to find an available PCI device ID.
|
||||||
#[cfg(feature = "pci_support")]
|
#[cfg(feature = "pci_support")]
|
||||||
NextPciDeviceId(pci::PciRootError),
|
NextPciDeviceId(pci::PciRootError),
|
||||||
|
|
||||||
|
/// Could not give the PCI device ID back.
|
||||||
|
#[cfg(feature = "pci_support")]
|
||||||
|
PutPciDeviceId(pci::PciRootError),
|
||||||
}
|
}
|
||||||
pub type DeviceManagerResult<T> = result::Result<T, DeviceManagerError>;
|
pub type DeviceManagerResult<T> = result::Result<T, DeviceManagerError>;
|
||||||
|
|
||||||
@ -1839,6 +1843,12 @@ impl DeviceManager {
|
|||||||
// the device entry.
|
// the device entry.
|
||||||
self.pci_id_list.retain(|_, bdf| *bdf != pci_device_bdf);
|
self.pci_id_list.retain(|_, bdf| *bdf != pci_device_bdf);
|
||||||
|
|
||||||
|
// Give the PCI device ID back to the PCI bus.
|
||||||
|
pci.lock()
|
||||||
|
.unwrap()
|
||||||
|
.put_device_id(device_id as usize)
|
||||||
|
.map_err(DeviceManagerError::PutPciDeviceId)?;
|
||||||
|
|
||||||
if let Some(any_device) = self.pci_devices.remove(&pci_device_bdf) {
|
if let Some(any_device) = self.pci_devices.remove(&pci_device_bdf) {
|
||||||
let (pci_device, bus_device, migratable_device) =
|
let (pci_device, bus_device, migratable_device) =
|
||||||
if let Ok(vfio_pci_device) = any_device.downcast::<Mutex<VfioPciDevice>>() {
|
if let Ok(vfio_pci_device) = any_device.downcast::<Mutex<VfioPciDevice>>() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user