mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-12-22 21:55:20 +00:00
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:
parent
4d9a2b17a7
commit
e37ec26ccf
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)?;
|
||||||
|
Loading…
Reference in New Issue
Block a user