diff --git a/kernel/src/vm/vmar/vmar_impls/access_remote.rs b/kernel/src/vm/vmar/vmar_impls/access_remote.rs index 2a5a4cfe2..97bc70c05 100644 --- a/kernel/src/vm/vmar/vmar_impls/access_remote.rs +++ b/kernel/src/vm/vmar/vmar_impls/access_remote.rs @@ -2,9 +2,7 @@ use align_ext::AlignExt; use ostd::{ - mm::{ - HasSize, PAGE_SIZE, PageFlags, UFrame, io_util::HasVmReaderWriter, vm_space::VmQueriedItem, - }, + mm::{PAGE_SIZE, PageFlags, UFrame, io_util::HasVmReaderWriter, vm_space::VmQueriedItem}, task::disable_preempt, }; @@ -76,14 +74,11 @@ impl Vmar { ) -> core::result::Result { let mut remain = len; let write = |frame: UFrame, skip_offset: usize| { - let frame_size = frame.size(); - let mut writer = frame.writer().to_fallible(); + let mut writer = frame.writer(); writer.skip(skip_offset); - let to_write = remain.min(frame_size - skip_offset); - let res = writer.fill_zeros(to_write); - let (Ok(n) | Err((_, n))) = &res; - remain -= *n; - res + let res = writer.fill_zeros(remain); + remain -= res; + Ok(res) }; self.access_remote(vaddr, len, PageFlags::W, write) diff --git a/kernel/src/vm/vmar/vmar_impls/mod.rs b/kernel/src/vm/vmar/vmar_impls/mod.rs index a0e348458..9759593de 100644 --- a/kernel/src/vm/vmar/vmar_impls/mod.rs +++ b/kernel/src/vm/vmar/vmar_impls/mod.rs @@ -157,17 +157,13 @@ impl VmarInner { return Ok(()); }; - let rlimt_as = process + let rlimit_as = process .resource_limits() .get_rlimit(ResourceType::RLIMIT_AS) .get_cur(); - let new_total_vm = self - .total_vm - .checked_add(expand_size) - .ok_or(Errno::ENOMEM)?; - if new_total_vm > rlimt_as as usize { - return_errno_with_message!(Errno::ENOMEM, "address space limit overflow"); + if rlimit_as.saturating_sub(self.total_vm as u64) < expand_size as u64 { + return_errno_with_message!(Errno::ENOMEM, "the address space size limit is reached"); } Ok(()) }