diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2018-10-05 11:40:59 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-10-12 23:07:16 -0700 |
commit | 56f283b297013a44e2f7d12c7a75e2267615c7f5 (patch) | |
tree | 57e35ee28119d718bb7b7c41f853d235b1ddcb96 /src/linux.rs | |
parent | ed31137fd027dcc53321fd946c6ead5a1726cf05 (diff) | |
download | crosvm-56f283b297013a44e2f7d12c7a75e2267615c7f5.tar crosvm-56f283b297013a44e2f7d12c7a75e2267615c7f5.tar.gz crosvm-56f283b297013a44e2f7d12c7a75e2267615c7f5.tar.bz2 crosvm-56f283b297013a44e2f7d12c7a75e2267615c7f5.tar.lz crosvm-56f283b297013a44e2f7d12c7a75e2267615c7f5.tar.xz crosvm-56f283b297013a44e2f7d12c7a75e2267615c7f5.tar.zst crosvm-56f283b297013a44e2f7d12c7a75e2267615c7f5.zip |
Revert "Revert "linux: Convert all virtio devices to PCI""
This reverts commit c8986f14a8dd9f256d6faed55996d955b50ff923. Re-land the virtio PCI conversion after the preceding fixes. BUG=chromium:854766 TEST=Boot crosvm on nami and kevin Change-Id: I3699e3ed1a45cecc99c51e352d0cf0c32bc4116f Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1265862 Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'src/linux.rs')
-rw-r--r-- | src/linux.rs | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/linux.rs b/src/linux.rs index b45b956..4975ab9 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -25,7 +25,7 @@ use rand::distributions::{IndependentSample, Range}; use rand::thread_rng; use byteorder::{ByteOrder, LittleEndian}; -use devices::{self, PciDevice}; +use devices::{self, PciDevice, VirtioPciDevice}; use io_jail::{self, Minijail}; use kvm::*; use net_util::Tap; @@ -92,6 +92,7 @@ pub enum Error { TimerFd(sys_util::Error), VhostNetDeviceNew(devices::virtio::vhost::Error), VhostVsockDeviceNew(devices::virtio::vhost::Error), + VirtioPciDev(sys_util::Error), WaylandDeviceNew(sys_util::Error), LoadKernel(Box<error::Error>), } @@ -171,6 +172,7 @@ impl fmt::Display for Error { &Error::VhostVsockDeviceNew(ref e) => { write!(f, "failed to set up virtual socket device: {:?}", e) } + &Error::VirtioPciDev(ref e) => write!(f, "failed to create virtio pci dev: {}", e), &Error::WaylandDeviceNew(ref e) => { write!(f, "failed to create wayland device: {:?}", e) } @@ -244,7 +246,7 @@ fn create_virtio_devs( _exit_evt: &EventFd, wayland_device_socket: UnixDatagram, balloon_device_socket: UnixDatagram, -) -> std::result::Result<Vec<VirtioDeviceStub>, Box<error::Error>> { +) -> std::result::Result<Vec<(Box<PciDevice + 'static>, Minijail)>, Box<error::Error>> { static DEFAULT_PIVOT_ROOT: &'static str = "/var/empty"; let mut devs = Vec::new(); @@ -614,7 +616,20 @@ fn create_virtio_devs( devs.push(VirtioDeviceStub { dev: p9_box, jail }); } - Ok(devs) + let mut pci_devices: Vec<(Box<PciDevice + 'static>, Minijail)> = Vec::new(); + for stub in devs { + let pci_dev = + Box::new(VirtioPciDevice::new((*mem).clone(), stub.dev).map_err(Error::VirtioPciDev)?); + + // TODO(dverkamp): Make this work in non-multiprocess mode without creating an empty jail + let jail = match stub.jail { + Some(j) => j, + None => Minijail::new().unwrap(), + }; + pci_devices.push((pci_dev, jail)); + } + + Ok(pci_devices) } fn setup_vcpu_signal_handler() -> Result<()> { @@ -758,15 +773,12 @@ pub fn run_config(cfg: Config) -> Result<()> { info!("crosvm entering multiprocess mode"); } - let pci_devices: Vec<(Box<PciDevice + 'static>, Minijail)> = Vec::new(); - // Masking signals is inherently dangerous, since this can persist across clones/execs. Do this // before any jailed devices have been spawned, so that we can catch any of them that fail very // quickly. let sigchld_fd = SignalFd::new(libc::SIGCHLD).map_err(Error::CreateSignalFd)?; let components = VmComponents { - pci_devices, memory_mb: (cfg.memory.unwrap_or(256) << 20) as u64, vcpu_count: cfg.vcpu_count.unwrap_or(1), kernel_image: File::open(cfg.kernel_path.as_path()) |