mirror of
https://github.com/google/alioth.git
synced 2024-10-22 22:46:38 +00:00
feat(balloon): implement inflate queue
Signed-off-by: Changyuan Lyu <changyuanl@google.com>
This commit is contained in:
parent
4313406fa0
commit
f2dd1f9f79
2 changed files with 18 additions and 6 deletions
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue