feat(balloon): implement inflate queue

Signed-off-by: Changyuan Lyu <changyuanl@google.com>
This commit is contained in:
Changyuan Lyu 2024-10-20 17:55:15 -07:00 committed by Lencerf
parent 4313406fa0
commit f2dd1f9f79
2 changed files with 18 additions and 6 deletions

View file

@ -26,11 +26,11 @@ use std::ptr::{null_mut, NonNull};
use std::sync::Arc;
use libc::{
c_void, mmap, msync, munmap, MAP_ANONYMOUS, MAP_FAILED, MAP_PRIVATE, MAP_SHARED, MS_ASYNC,
PROT_EXEC, PROT_READ, PROT_WRITE,
c_void, madvise, mmap, msync, munmap, MAP_ANONYMOUS, MAP_FAILED, MAP_PRIVATE, MAP_SHARED,
MS_ASYNC, PROT_EXEC, PROT_READ, PROT_WRITE,
};
#[cfg(target_os = "linux")]
use libc::{madvise, MADV_HUGEPAGE, MFD_CLOEXEC};
use libc::{MADV_HUGEPAGE, MFD_CLOEXEC};
use parking_lot::{RwLock, RwLockReadGuard};
use snafu::ResultExt;
use zerocopy::{FromBytes, Immutable, IntoBytes};
@ -404,6 +404,14 @@ impl Ram {
pub fn iter(&self) -> impl DoubleEndedIterator<Item = (u64, &ArcMemPages)> {
self.inner.iter()
}
pub fn madvise(&self, gpa: u64, size: u64, advice: i32) -> Result<()> {
for r in self.slice_iter_mut(gpa, size) {
let s = r?;
ffi!(unsafe { madvise(s.as_mut_ptr() as _, s.len(), advice) })?;
}
Ok(())
}
}
impl Default for RamBus {

View file

@ -143,9 +143,9 @@ impl Balloon {
})
}
fn inflate(&self, desc: &[IoSlice], _ram: &Ram) {
fn inflate(&self, desc: &[IoSlice], ram: &Ram) {
for buf in desc {
for bytes in buf.chunks(4) {
for bytes in buf.chunks(size_of::<u32>()) {
let Ok(page_num) = u32::read_from_bytes(bytes) else {
log::error!(
"{}: inflate: invalid page_num bytes: {bytes:02x?}",
@ -154,7 +154,11 @@ impl Balloon {
continue;
};
let gpa = (page_num as u64) << 12;
log::info!("{}: TODO: inflating GPA {gpa:#x}", self.name);
if let Err(e) = ram.madvise(gpa, 1 << 12, libc::MADV_DONTNEED) {
log::error!("{}: inflate at GPA {gpa:#x}: {e:?}", self.name);
} else {
log::trace!("{}: freed GPA {gpa:#x}", self.name);
}
}
}
}