summary refs log tree commit diff
path: root/sys_util/src/guest_memory.rs
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2017-11-06 14:06:58 -0800
committerchrome-bot <chrome-bot@chromium.org>2017-12-08 00:37:01 -0800
commit2415ef6988700f796b46c62cc5462ba9e7d1ded2 (patch)
treece1c926aa86caed6ff2e96b589918114ef2533a5 /sys_util/src/guest_memory.rs
parentfedb675ed52b8e54f78d80b9938c98746e888b37 (diff)
downloadcrosvm-2415ef6988700f796b46c62cc5462ba9e7d1ded2.tar
crosvm-2415ef6988700f796b46c62cc5462ba9e7d1ded2.tar.gz
crosvm-2415ef6988700f796b46c62cc5462ba9e7d1ded2.tar.bz2
crosvm-2415ef6988700f796b46c62cc5462ba9e7d1ded2.tar.lz
crosvm-2415ef6988700f796b46c62cc5462ba9e7d1ded2.tar.xz
crosvm-2415ef6988700f796b46c62cc5462ba9e7d1ded2.tar.zst
crosvm-2415ef6988700f796b46c62cc5462ba9e7d1ded2.zip
sys_util: Add ability to madvise a region
Add functions to let the kernel know a given range of memory isn't
needed currently. This function will result in `madvise(DONTNEED)`.

The ability to signal memory as not needed will be used by the balloon
driver to allow system memory to be redistributed away from the VM.

Change-Id: I4ca56e09010eec33989824f5738db4a4be0ec428
Signed-off-by: Dylan Reid <dgreid@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/759305
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'sys_util/src/guest_memory.rs')
-rw-r--r--sys_util/src/guest_memory.rs9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys_util/src/guest_memory.rs b/sys_util/src/guest_memory.rs
index 8e2dd97..2a849e9 100644
--- a/sys_util/src/guest_memory.rs
+++ b/sys_util/src/guest_memory.rs
@@ -105,6 +105,15 @@ impl GuestMemory {
         self.regions.len()
     }
 
+    /// Madvise away the address range in the host that is associated with the given guest range.
+    pub fn dont_need_range(&self, addr: GuestAddress, count: usize) -> Result<()> {
+        self.do_in_region(addr, move |mapping, offset| {
+            mapping
+                .dont_need_range(offset, count)
+                .map_err(|e| Error::MemoryAccess(addr, e))
+        })
+    }
+
     /// Perform the specified action on each region's addresses.
     pub fn with_regions<F, E>(&self, cb: F) -> result::Result<(), E>
         where F: Fn(usize, GuestAddress, usize, usize) -> result::Result<(), E>