vmm: Remove PCI PIO optimisation

This optimisation provided some peformance improvement when measured by
perf however when considered in terms of boot time peformance this
optimisation doesn't have any impact measurable using our
peformance-metrics tooling.

Removing this optimisation helps simplify the VMM internals as it allows
the reordering of the VM creation process permitting refactoring of the
restore code path.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2022-11-22 16:13:52 +00:00
parent 4d9a2b17a7
commit e37ec26ccf
2 changed files with 0 additions and 39 deletions

View File

@ -54,8 +54,6 @@ use libc::{
cfmakeraw, isatty, tcgetattr, tcsetattr, termios, MAP_NORESERVE, MAP_PRIVATE, MAP_SHARED, cfmakeraw, isatty, tcgetattr, tcsetattr, termios, MAP_NORESERVE, MAP_PRIVATE, MAP_SHARED,
O_TMPFILE, PROT_READ, PROT_WRITE, TCSANOW, O_TMPFILE, PROT_READ, PROT_WRITE, TCSANOW,
}; };
#[cfg(target_arch = "x86_64")]
use pci::PciConfigIo;
use pci::{ use pci::{
DeviceRelocation, PciBarRegionType, PciBdf, PciDevice, VfioPciDevice, VfioUserDmaMapping, DeviceRelocation, PciBarRegionType, PciBdf, PciDevice, VfioPciDevice, VfioUserDmaMapping,
VfioUserPciDevice, VfioUserPciDeviceError, VfioUserPciDevice, VfioUserPciDeviceError,
@ -3564,12 +3562,6 @@ impl DeviceManager {
.map(|ic| ic.clone() as Arc<Mutex<dyn InterruptController>>) .map(|ic| ic.clone() as Arc<Mutex<dyn InterruptController>>)
} }
#[cfg(target_arch = "x86_64")]
// Used to provide a fast path for handling PIO exits
pub fn pci_config_io(&self) -> Arc<Mutex<PciConfigIo>> {
Arc::clone(self.pci_segments[0].pci_config_io.as_ref().unwrap())
}
pub(crate) fn pci_segments(&self) -> &Vec<PciSegment> { pub(crate) fn pci_segments(&self) -> &Vec<PciSegment> {
&self.pci_segments &self.pci_segments
} }

View File

@ -87,8 +87,6 @@ use std::{result, str, thread};
use thiserror::Error; use thiserror::Error;
use tracer::trace_scoped; use tracer::trace_scoped;
use vm_device::Bus; use vm_device::Bus;
#[cfg(target_arch = "x86_64")]
use vm_device::BusDevice;
#[cfg(feature = "tdx")] #[cfg(feature = "tdx")]
use vm_memory::{Address, ByteValued, GuestMemory, GuestMemoryRegion}; use vm_memory::{Address, ByteValued, GuestMemory, GuestMemoryRegion};
use vm_memory::{Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic}; use vm_memory::{Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic};
@ -365,8 +363,6 @@ struct VmOpsHandler {
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
io_bus: Arc<Bus>, io_bus: Arc<Bus>,
mmio_bus: Arc<Bus>, mmio_bus: Arc<Bus>,
#[cfg(target_arch = "x86_64")]
pci_config_io: Arc<Mutex<dyn BusDevice>>,
} }
impl VmOps for VmOpsHandler { impl VmOps for VmOpsHandler {
@ -408,17 +404,6 @@ impl VmOps for VmOpsHandler {
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
fn pio_read(&self, port: u64, data: &mut [u8]) -> result::Result<(), HypervisorVmError> { fn pio_read(&self, port: u64, data: &mut [u8]) -> result::Result<(), HypervisorVmError> {
use pci::{PCI_CONFIG_IO_PORT, PCI_CONFIG_IO_PORT_SIZE};
if (PCI_CONFIG_IO_PORT..(PCI_CONFIG_IO_PORT + PCI_CONFIG_IO_PORT_SIZE)).contains(&port) {
self.pci_config_io.lock().unwrap().read(
PCI_CONFIG_IO_PORT,
port - PCI_CONFIG_IO_PORT,
data,
);
return Ok(());
}
if let Err(vm_device::BusError::MissingAddressRange) = self.io_bus.read(port, data) { if let Err(vm_device::BusError::MissingAddressRange) = self.io_bus.read(port, data) {
info!("Guest PIO read to unregistered address 0x{:x}", port); info!("Guest PIO read to unregistered address 0x{:x}", port);
} }
@ -427,17 +412,6 @@ impl VmOps for VmOpsHandler {
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
fn pio_write(&self, port: u64, data: &[u8]) -> result::Result<(), HypervisorVmError> { fn pio_write(&self, port: u64, data: &[u8]) -> result::Result<(), HypervisorVmError> {
use pci::{PCI_CONFIG_IO_PORT, PCI_CONFIG_IO_PORT_SIZE};
if (PCI_CONFIG_IO_PORT..(PCI_CONFIG_IO_PORT + PCI_CONFIG_IO_PORT_SIZE)).contains(&port) {
self.pci_config_io.lock().unwrap().write(
PCI_CONFIG_IO_PORT,
port - PCI_CONFIG_IO_PORT,
data,
);
return Ok(());
}
match self.io_bus.write(port, data) { match self.io_bus.write(port, data) {
Err(vm_device::BusError::MissingAddressRange) => { Err(vm_device::BusError::MissingAddressRange) => {
info!("Guest PIO write to unregistered address 0x{:x}", port); info!("Guest PIO write to unregistered address 0x{:x}", port);
@ -557,16 +531,11 @@ impl Vm {
let io_bus = Arc::clone(device_manager.lock().unwrap().io_bus()); let io_bus = Arc::clone(device_manager.lock().unwrap().io_bus());
let mmio_bus = Arc::clone(device_manager.lock().unwrap().mmio_bus()); let mmio_bus = Arc::clone(device_manager.lock().unwrap().mmio_bus());
#[cfg(target_arch = "x86_64")]
let pci_config_io =
device_manager.lock().unwrap().pci_config_io() as Arc<Mutex<dyn BusDevice>>;
let vm_ops: Arc<dyn VmOps> = Arc::new(VmOpsHandler { let vm_ops: Arc<dyn VmOps> = Arc::new(VmOpsHandler {
memory, memory,
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
io_bus, io_bus,
mmio_bus, mmio_bus,
#[cfg(target_arch = "x86_64")]
pci_config_io,
}); });
let exit_evt_clone = exit_evt.try_clone().map_err(Error::EventFdClone)?; let exit_evt_clone = exit_evt.try_clone().map_err(Error::EventFdClone)?;