build: make PCI (virtio and vfio) disableable at build time

Although included by default it is now possible to build without PCI
support.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2019-09-11 17:07:33 +01:00
parent 6d27ac9dfc
commit c042483953
8 changed files with 49 additions and 29 deletions

View File

@ -18,8 +18,9 @@ tempdir= "0.3.7"
lazy_static= "1.4.0"
[features]
default = ["acpi"]
default = ["acpi", "pci"]
acpi = ["vmm/acpi"]
pci = ["vmm/pci_support"]
# Integration tests require a special environment to run in
integration_tests = []

View File

@ -4,6 +4,10 @@ version = "0.1.0"
authors = ["Samuel Ortiz <sameo@linux.intel.com>"]
edition = "2018"
[features]
default = []
pci_support = ["pci"]
[dependencies]
byteorder = "1.3.2"
devices = { path = "../devices" }
@ -12,7 +16,7 @@ libc = "0.2.60"
log = "0.4.8"
net_gen = { path = "../net_gen" }
net_util = { path = "../net_util" }
pci = { path = "../pci" }
pci = { path = "../pci", optional = true }
tempfile = "3.1.0"
virtio-bindings = { path = "../virtio-bindings" }
vm-allocator = { path = "../vm-allocator" }

View File

@ -12,6 +12,7 @@
extern crate epoll;
#[macro_use]
extern crate log;
#[cfg(feature = "pci_support")]
extern crate pci;
extern crate vhost_rs;
extern crate virtio_bindings;

View File

@ -2,8 +2,11 @@
//
// SPDX-License-Identifier: Apache-2.0
#[cfg(feature = "pci_support")]
mod pci_common_config;
#[cfg(feature = "pci_support")]
mod pci_device;
#[cfg(feature = "pci_support")]
pub use pci_common_config::VirtioPciCommonConfig;
#[cfg(feature = "pci_support")]
pub use pci_device::VirtioPciDevice;

View File

@ -7,6 +7,7 @@
// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
extern crate devices;
#[cfg(feature = "pci_support")]
extern crate pci;
extern crate vm_allocator;
extern crate vm_memory;

View File

@ -7,6 +7,7 @@ edition = "2018"
[features]
default = []
acpi = ["acpi_tables","devices/acpi", "arch/acpi"]
pci_support = ["pci", "vfio", "vm-virtio/pci_support"]
[dependencies]
acpi_tables = { path = "../acpi_tables", optional = true }
@ -18,9 +19,9 @@ kvm-ioctls = { git = "https://github.com/rust-vmm/kvm-ioctls", branch = "master"
libc = "0.2.62"
log = "0.4.8"
net_util = { path = "../net_util" }
pci = {path = "../pci"}
pci = {path = "../pci", optional = true}
qcow = { path = "../qcow" }
vfio = { path = "../vfio" }
vfio = { path = "../vfio", optional = true }
vm-virtio = { path = "../vm-virtio" }
vm-allocator = { path = "../vm-allocator" }
vmm-sys-util = { git = "https://github.com/rust-vmm/vmm-sys-util" }

View File

@ -19,6 +19,7 @@ use libc::O_TMPFILE;
use libc::{EFD_NONBLOCK, TIOCGWINSZ};
use net_util::Tap;
#[cfg(feature = "pci_support")]
use pci::{
InterruptDelivery, InterruptParameters, PciConfigIo, PciDevice, PciInterruptPin, PciRoot,
};
@ -32,9 +33,11 @@ use std::os::unix::io::AsRawFd;
use std::ptr::null_mut;
use std::result;
use std::sync::{Arc, Mutex, RwLock};
#[cfg(feature = "pci_support")]
use vfio::{VfioDevice, VfioPciDevice, VfioPciError};
use vm_allocator::SystemAllocator;
use vm_memory::{Address, GuestMemoryMmap, GuestUsize};
#[cfg(feature = "pci_support")]
use vm_virtio::transport::VirtioPciDevice;
use vm_virtio::{VirtioSharedMemory, VirtioSharedMemoryList};
use vmm_sys_util::eventfd::EventFd;
@ -98,6 +101,7 @@ pub enum DeviceManagerError {
Irq(io::Error),
/// Cannot allocate PCI BARs
#[cfg(feature = "pci_support")]
AllocateBars(pci::PciDeviceError),
/// Cannot register ioevent.
@ -107,6 +111,7 @@ pub enum DeviceManagerError {
VirtioDevice(vmm_sys_util::errno::Error),
/// Cannot add PCI device
#[cfg(feature = "pci_support")]
AddPciDevice(pci::PciRootError),
/// Cannot open persistent memory file
@ -128,12 +133,15 @@ pub enum DeviceManagerError {
ConsoleOutputFileOpen(io::Error),
/// Cannot create a VFIO device
#[cfg(feature = "pci_support")]
VfioCreate(vfio::VfioError),
/// Cannot create a VFIO PCI device
#[cfg(feature = "pci_support")]
VfioPciCreate(vfio::VfioPciError),
/// Failed to map VFIO MMIO region.
#[cfg(feature = "pci_support")]
VfioMapRegion(VfioPciError),
/// Failed to create the KVM device.
@ -272,9 +280,6 @@ pub struct DeviceManager {
// IOAPIC
ioapic: Option<Arc<Mutex<ioapic::Ioapic>>>,
// PCI root
pci: Arc<Mutex<PciConfigIo>>,
// mmap()ed region to unmap on drop
mmap_regions: Vec<(*mut libc::c_void, usize)>,
@ -395,26 +400,33 @@ impl DeviceManager {
&mut mmap_regions,
)?);
#[allow(unused_mut)]
let mut cmdline_additions = Vec::new();
let pci_root = PciRoot::new(None);
let mut pci = PciConfigIo::new(pci_root);
#[cfg(feature = "pci_support")]
{
let pci_root = PciRoot::new(None);
let mut pci = PciConfigIo::new(pci_root);
for device in virtio_devices {
DeviceManager::add_virtio_pci_device(
device,
vm_info.memory,
allocator,
vm_info.vm_fd,
&mut pci,
&mut buses,
&interrupt_info,
)?;
for device in virtio_devices {
DeviceManager::add_virtio_pci_device(
device,
vm_info.memory,
allocator,
vm_info.vm_fd,
&mut pci,
&mut buses,
&interrupt_info,
)?;
}
DeviceManager::add_vfio_devices(vm_info, allocator, &mut pci, &mut buses, mem_slots)?;
let pci = Arc::new(Mutex::new(pci));
io_bus
.insert(pci, 0xcf8, 0x8)
.map_err(DeviceManagerError::BusError)?;
}
DeviceManager::add_vfio_devices(vm_info, allocator, &mut pci, &mut buses, mem_slots)?;
let pci = Arc::new(Mutex::new(pci));
let mut dm = DeviceManager {
io_bus,
@ -424,7 +436,6 @@ impl DeviceManager {
#[cfg(feature = "acpi")]
acpi_device,
ioapic,
pci,
mmap_regions,
cmdline_additions,
};
@ -767,6 +778,7 @@ impl DeviceManager {
.map_err(DeviceManagerError::CreateKvmDevice)
}
#[cfg(feature = "pci_support")]
fn add_vfio_devices(
vm_info: &VmInfo,
allocator: &mut SystemAllocator,
@ -808,6 +820,7 @@ impl DeviceManager {
Ok(())
}
#[cfg(feature = "pci_support")]
fn add_virtio_pci_device(
virtio_device: Box<dyn vm_virtio::VirtioDevice>,
memory: &Arc<RwLock<GuestMemoryMmap>>,
@ -939,11 +952,6 @@ impl DeviceManager {
.insert(self.acpi_device.clone(), 0x3c0, 0x4)
.map_err(DeviceManagerError::BusError)?;
// Insert the PCI root configuration space.
self.io_bus
.insert(self.pci.clone(), 0xcf8, 0x8)
.map_err(DeviceManagerError::BusError)?;
if let Some(ioapic) = &self.ioapic {
// Insert IOAPIC
self.mmio_bus

View File

@ -17,6 +17,7 @@ extern crate libc;
extern crate linux_loader;
extern crate net_util;
extern crate signal_hook;
#[cfg(feature = "pci_support")]
extern crate vfio;
extern crate vm_allocator;
extern crate vm_memory;