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:
Sebastien Boeuf 2020-03-09 16:32:27 +01:00 committed by Rob Bradford
parent df71aaee3f
commit b50cbe5064
2 changed files with 21 additions and 0 deletions

View File

@ -31,6 +31,8 @@ pub enum PciRootError {
MmioInsert(devices::BusError),
/// Could not find an available device slot on the PCI bus.
NoPciDeviceSlotAvailable,
/// Invalid PCI device identifier provided.
InvalidPciDeviceSlot(usize),
}
pub type Result<T> = std::result::Result<T, PciRootError>;
@ -146,6 +148,15 @@ impl PciBus {
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 {

View File

@ -244,6 +244,10 @@ pub enum DeviceManagerError {
/// Failed to find an available PCI device ID.
#[cfg(feature = "pci_support")]
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>;
@ -1839,6 +1843,12 @@ impl DeviceManager {
// the device entry.
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) {
let (pci_device, bus_device, migratable_device) =
if let Ok(vfio_pci_device) = any_device.downcast::<Mutex<VfioPciDevice>>() {