From 295ccac1f3d6d9291ebc86df076920102cdbb63d Mon Sep 17 00:00:00 2001 From: Dylan Reid Date: Mon, 6 Nov 2017 14:06:24 -0800 Subject: 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 Reviewed-on: https://chromium-review.googlesource.com/759306 Reviewed-by: Stephen Barber --- src/linux.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/linux.rs') 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 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 { -- cgit 1.4.1