summary refs log tree commit diff
path: root/src/linux.rs
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2017-11-06 14:06:24 -0800
committerchrome-bot <chrome-bot@chromium.org>2017-12-18 17:54:57 -0800
commit295ccac1f3d6d9291ebc86df076920102cdbb63d (patch)
tree9267c0954ec8fc9e63a2706d976534ad00186b16 /src/linux.rs
parent39aa26b1680471acf26981d3c65829ccd216e0a4 (diff)
downloadcrosvm-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.rs18
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 {