diff --git a/pci/src/device.rs b/pci/src/device.rs index 99a4602b4..8f0b955fc 100644 --- a/pci/src/device.rs +++ b/pci/src/device.rs @@ -5,7 +5,7 @@ use crate::configuration::{self, PciBarRegionType}; use std::any::Any; use std::fmt::{self, Display}; -use std::sync::{Arc, Barrier}; +use std::sync::{Arc, Barrier, Mutex}; use std::{self, io, result}; use vm_allocator::{AddressAllocator, SystemAllocator}; use vm_device::BusDevice; @@ -51,7 +51,7 @@ pub trait PciDevice: BusDevice { /// returns an address. Returns a Vec of (GuestAddress, GuestUsize) tuples. fn allocate_bars( &mut self, - _allocator: &mut SystemAllocator, + _allocator: &Arc>, _mmio_allocator: &mut AddressAllocator, ) -> Result> { Ok(Vec::new()) diff --git a/pci/src/vfio.rs b/pci/src/vfio.rs index 90a0d92b7..8b11b045b 100644 --- a/pci/src/vfio.rs +++ b/pci/src/vfio.rs @@ -15,7 +15,7 @@ use std::collections::BTreeMap; use std::io; use std::os::unix::io::AsRawFd; use std::ptr::null_mut; -use std::sync::{Arc, Barrier}; +use std::sync::{Arc, Barrier, Mutex}; use thiserror::Error; use vfio_bindings::bindings::vfio::*; use vfio_ioctls::{VfioContainer, VfioDevice, VfioIrq, VfioRegionInfoCap}; @@ -360,7 +360,7 @@ pub(crate) struct VfioCommon { impl VfioCommon { pub(crate) fn allocate_bars( &mut self, - allocator: &mut SystemAllocator, + allocator: &Arc>, mmio_allocator: &mut AddressAllocator, vfio_wrapper: &dyn Vfio, ) -> Result, PciDeviceError> { @@ -430,6 +430,8 @@ impl VfioCommon { // The address needs to be 4 bytes aligned. bar_addr = allocator + .lock() + .unwrap() .allocate_io_addresses(None, region_size, Some(0x4)) .ok_or(PciDeviceError::IoAllocationFailed(region_size))?; } @@ -476,6 +478,8 @@ impl VfioCommon { // BAR allocation must be naturally aligned bar_addr = allocator + .lock() + .unwrap() .allocate_mmio_hole_addresses(None, region_size, Some(region_size)) .ok_or(PciDeviceError::IoAllocationFailed(region_size))?; } @@ -1308,7 +1312,7 @@ const PCI_ROM_EXP_BAR_INDEX: usize = 12; impl PciDevice for VfioPciDevice { fn allocate_bars( &mut self, - allocator: &mut SystemAllocator, + allocator: &Arc>, mmio_allocator: &mut AddressAllocator, ) -> Result, PciDeviceError> { self.common diff --git a/pci/src/vfio_user.rs b/pci/src/vfio_user.rs index 56b48ac2f..cf619ec0a 100644 --- a/pci/src/vfio_user.rs +++ b/pci/src/vfio_user.rs @@ -389,7 +389,7 @@ impl Vfio for VfioUserClientWrapper { impl PciDevice for VfioUserPciDevice { fn allocate_bars( &mut self, - allocator: &mut SystemAllocator, + allocator: &Arc>, mmio_allocator: &mut AddressAllocator, ) -> Result, PciDeviceError> { self.common diff --git a/virtio-devices/src/transport/pci_device.rs b/virtio-devices/src/transport/pci_device.rs index 34f69ead2..7f3e2414d 100644 --- a/virtio-devices/src/transport/pci_device.rs +++ b/virtio-devices/src/transport/pci_device.rs @@ -841,7 +841,7 @@ impl PciDevice for VirtioPciDevice { fn allocate_bars( &mut self, - allocator: &mut SystemAllocator, + allocator: &Arc>, mmio_allocator: &mut AddressAllocator, ) -> std::result::Result, PciDeviceError> { @@ -865,6 +865,8 @@ impl PciDevice for VirtioPciDevice { } else { let region_type = PciBarRegionType::Memory32BitRegion; let addr = allocator + .lock() + .unwrap() .allocate_mmio_hole_addresses( self.settings_bar_addr, CAPABILITY_BAR_SIZE, diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index a92d5b15f..11d462feb 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -3088,7 +3088,7 @@ impl DeviceManager { .lock() .unwrap() .allocate_bars( - &mut self.address_manager.allocator.lock().unwrap(), + &self.address_manager.allocator, &mut self.pci_segments[segment_id as usize] .allocator .lock()