pci: vfio: Naturally align the PCI BAR allocation

The PCI bar should be naturally aligned i.e. aligned to the size of the
bar itself.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2021-04-21 15:22:46 +01:00
parent bfc65bff2a
commit c82226fdae

View File

@ -910,26 +910,14 @@ impl PciDevice for VfioPciDevice {
let first_bit = region_size.trailing_zeros(); let first_bit = region_size.trailing_zeros();
region_size = 2u64.pow(first_bit); region_size = 2u64.pow(first_bit);
// We need to allocate a guest MMIO address range for that BAR. // BAR allocation needs to be naturally aligned
// In case the BAR is mappable directly, this means it might be
// set as user memory region, which expects to deal with 4K
// pages. Therefore, the alignment has to be set accordingly.
let bar_alignment = if (bar_id == VFIO_PCI_ROM_REGION_INDEX)
|| (self.device.get_region_flags(bar_id) & VFIO_REGION_INFO_FLAG_MMAP != 0)
{
// 4K alignment
0x1000
} else {
// Default 16 bytes alignment
0x10
};
if is_64bit_bar { if is_64bit_bar {
bar_addr = allocator bar_addr = allocator
.allocate_mmio_addresses(None, region_size, Some(bar_alignment)) .allocate_mmio_addresses(None, region_size, Some(region_size))
.ok_or(PciDeviceError::IoAllocationFailed(region_size))?; .ok_or(PciDeviceError::IoAllocationFailed(region_size))?;
} else { } else {
bar_addr = allocator bar_addr = allocator
.allocate_mmio_hole_addresses(None, region_size, Some(bar_alignment)) .allocate_mmio_hole_addresses(None, region_size, Some(region_size))
.ok_or(PciDeviceError::IoAllocationFailed(region_size))?; .ok_or(PciDeviceError::IoAllocationFailed(region_size))?;
} }
} }