diff --git a/src/libos/src/fs/procfs/meminfo.rs b/src/libos/src/fs/procfs/meminfo.rs index 69fce5f2..6419cf0e 100644 --- a/src/libos/src/fs/procfs/meminfo.rs +++ b/src/libos/src/fs/procfs/meminfo.rs @@ -14,7 +14,7 @@ impl MemInfoINode { impl ProcINode for MemInfoINode { fn generate_data_in_bytes(&self) -> vfs::Result> { let total_ram = USER_SPACE_VM_MANAGER.get_total_size(); - let free_ram = current!().vm().get_free_size(); + let free_ram = USER_SPACE_VM_MANAGER.get_precise_free_size(); Ok(format!( "MemTotal: {} kB\n\ MemFree: {} kB\n\ diff --git a/src/libos/src/misc/sysinfo.rs b/src/libos/src/misc/sysinfo.rs index 1ed15273..f8969d6d 100644 --- a/src/libos/src/misc/sysinfo.rs +++ b/src/libos/src/misc/sysinfo.rs @@ -26,7 +26,7 @@ pub fn do_sysinfo() -> Result { let info = sysinfo_t { uptime: time::up_time::get().unwrap().as_secs() as i64, // Duration can't be negative totalram: USER_SPACE_VM_MANAGER.get_total_size() as u64, - freeram: current!().vm().get_free_size() as u64, + freeram: USER_SPACE_VM_MANAGER.get_precise_free_size() as u64, procs: table::get_all_processes().len() as u16, mem_unit: 1, ..Default::default() diff --git a/src/libos/src/vm/vm_manager.rs b/src/libos/src/vm/vm_manager.rs index e9b6aaae..1b2680e8 100644 --- a/src/libos/src/vm/vm_manager.rs +++ b/src/libos/src/vm/vm_manager.rs @@ -46,6 +46,15 @@ impl VMManager { self.internal().free_manager.free_size() } + pub fn get_precise_free_size(&self) -> usize { + let internal = self.internal(); + internal.free_manager.free_size() + + internal + .chunks + .iter() + .fold(0, |acc, chunks| acc + chunks.free_size()) + } + pub fn verified_clean_when_exit(&self) -> bool { let internal = self.internal(); internal.chunks.len() == 0 && internal.free_manager.free_size() == self.range.size()