diff options
author | Dylan Reid <dgreid@chromium.org> | 2017-11-06 14:06:24 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-12-18 17:54:57 -0800 |
commit | 295ccac1f3d6d9291ebc86df076920102cdbb63d (patch) | |
tree | 9267c0954ec8fc9e63a2706d976534ad00186b16 /src/linux.rs | |
parent | 39aa26b1680471acf26981d3c65829ccd216e0a4 (diff) | |
download | crosvm-295ccac1f3d6d9291ebc86df076920102cdbb63d.tar crosvm-295ccac1f3d6d9291ebc86df076920102cdbb63d.tar.gz crosvm-295ccac1f3d6d9291ebc86df076920102cdbb63d.tar.bz2 crosvm-295ccac1f3d6d9291ebc86df076920102cdbb63d.tar.lz crosvm-295ccac1f3d6d9291ebc86df076920102cdbb63d.tar.xz crosvm-295ccac1f3d6d9291ebc86df076920102cdbb63d.tar.zst crosvm-295ccac1f3d6d9291ebc86df076920102cdbb63d.zip |
devices: Add balloon
The balloon device is used to take regions of unused memory from the guest and allow other host processes to use that memory. Change-Id: I06c821365a58672d605fc7555beaec599cae1b15 Signed-off-by: Dylan Reid <dgreid@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/759306 Reviewed-by: Stephen Barber <smbarber@chromium.org>
Diffstat (limited to 'src/linux.rs')
-rw-r--r-- | src/linux.rs | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/linux.rs b/src/linux.rs index 6323c7d..c57f6b3 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -33,6 +33,7 @@ use Config; use x86_64; pub enum Error { + BalloonDeviceNew(devices::virtio::BalloonError), OpenKernel(PathBuf, std::io::Error), Socket(std::io::Error), Disk(std::io::Error), @@ -43,6 +44,7 @@ pub enum Error { VhostVsockDeviceNew(devices::virtio::vhost::Error), DeviceJail(io_jail::Error), DevicePivotRoot(io_jail::Error), + RegisterBalloon(device_manager::Error), RegisterBlock(device_manager::Error), RegisterNet(device_manager::Error), RegisterWayland(device_manager::Error), @@ -89,6 +91,7 @@ impl std::convert::From<sys_util::Error> for Error { impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { + &Error::BalloonDeviceNew(ref e) => write!(f, "failed to create balloon: {:?}", e), &Error::OpenKernel(ref p, ref e) => write!(f, "failed to open kernel image {:?}: {}", p, e), &Error::Socket(ref e) => write!(f, "failed to create socket: {}", e), &Error::Disk(ref e) => write!(f, "failed to load disk image: {}", e), @@ -101,6 +104,9 @@ impl fmt::Display for Error { &Error::DeviceJail(ref e) => write!(f, "failed to jail device: {}", e), &Error::DevicePivotRoot(ref e) => write!(f, "failed to pivot root device: {}", e), &Error::VhostVsockDeviceNew(ref e) => write!(f, "failed to set up virtual socket device: {:?}", e), + &Error::RegisterBalloon(ref e) => { + write!(f, "error registering balloon device: {:?}", e) + }, &Error::RegisterNet(ref e) => write!(f, "error registering net device: {:?}", e), &Error::RegisterRng(ref e) => write!(f, "error registering rng device: {:?}", e), &Error::RngDeviceNew(ref e) => write!(f, "failed to set up rng: {:?}", e), @@ -247,6 +253,18 @@ pub fn run_config(cfg: Config) -> Result<()> { device_manager.register_mmio(rng_box, rng_jail, &mut cmdline) .map_err(Error::RegisterRng)?; + let (_, balloon_device_socket) = UnixDatagram::pair().map_err(Error::Socket)?; + let balloon_box = Box::new(devices::virtio::Balloon::new(balloon_device_socket) + .map_err(Error::BalloonDeviceNew)?); + let balloon_jail = if cfg.multiprocess { + let policy_path: PathBuf = cfg.seccomp_policy_dir.join("balloon_device.policy"); + Some(create_base_minijail(empty_root_path, &policy_path)?) + } else { + None + }; + device_manager.register_mmio(balloon_box, balloon_jail, &mut cmdline) + .map_err(Error::RegisterBalloon)?; + // We checked above that if the IP is defined, then the netmask is, too. if let Some(host_ip) = cfg.host_ip { if let Some(netmask) = cfg.netmask { |