mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-21 00:06:34 +00:00
Refactor RLimit64 to atomic
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
96d83e43b4
commit
eca3c8fb59
@ -60,7 +60,6 @@ fn do_dup3(
|
||||
>= ctx
|
||||
.process
|
||||
.resource_limits()
|
||||
.lock()
|
||||
.get_rlimit(ResourceType::RLIMIT_NOFILE)
|
||||
.get_cur() as FileDesc
|
||||
{
|
||||
|
@ -48,7 +48,7 @@ fn check_offset_and_len(offset: i64, len: i64, ctx: &Context) -> Result<()> {
|
||||
}
|
||||
|
||||
let max_file_size = {
|
||||
let resource_limits = ctx.process.resource_limits().lock();
|
||||
let resource_limits = ctx.process.resource_limits();
|
||||
resource_limits
|
||||
.get_rlimit(ResourceType::RLIMIT_FSIZE)
|
||||
.get_cur() as usize
|
||||
|
@ -3,15 +3,17 @@
|
||||
use super::SyscallReturn;
|
||||
use crate::{
|
||||
prelude::*,
|
||||
process::{rlimit::RLimit64, Pid, ResourceType},
|
||||
process::{rlimit::RawRLimit64, Pid, ResourceType},
|
||||
};
|
||||
|
||||
pub fn sys_getrlimit(resource: u32, rlim_addr: Vaddr, ctx: &Context) -> Result<SyscallReturn> {
|
||||
let resource = ResourceType::try_from(resource)?;
|
||||
debug!("resource = {:?}, rlim_addr = 0x{:x}", resource, rlim_addr);
|
||||
let resource_limits = ctx.process.resource_limits().lock();
|
||||
let resource_limits = ctx.process.resource_limits();
|
||||
let rlimit = resource_limits.get_rlimit(resource);
|
||||
ctx.user_space().write_val(rlim_addr, rlimit)?;
|
||||
let (cur, max) = rlimit.get_cur_and_max();
|
||||
let rlimit_raw = RawRLimit64 { cur, max };
|
||||
ctx.user_space().write_val(rlim_addr, &rlimit_raw)?;
|
||||
Ok(SyscallReturn::Return(0))
|
||||
}
|
||||
|
||||
@ -21,12 +23,11 @@ pub fn sys_setrlimit(resource: u32, new_rlim_addr: Vaddr, ctx: &Context) -> Resu
|
||||
"resource = {:?}, new_rlim_addr = 0x{:x}",
|
||||
resource, new_rlim_addr
|
||||
);
|
||||
let new_rlimit: RLimit64 = ctx.user_space().read_val(new_rlim_addr)?;
|
||||
if !new_rlimit.is_valid() {
|
||||
return_errno_with_message!(Errno::EINVAL, "invalid rlimit");
|
||||
}
|
||||
let mut resource_limits = ctx.process.resource_limits().lock();
|
||||
*resource_limits.get_rlimit_mut(resource) = new_rlimit;
|
||||
let new_raw: RawRLimit64 = ctx.user_space().read_val(new_rlim_addr)?;
|
||||
let resource_limits = ctx.process.resource_limits();
|
||||
resource_limits
|
||||
.get_rlimit(resource)
|
||||
.set_cur_and_max(new_raw.cur, new_raw.max)?;
|
||||
Ok(SyscallReturn::Return(0))
|
||||
}
|
||||
|
||||
@ -42,18 +43,19 @@ pub fn sys_prlimit64(
|
||||
"pid = {}, resource = {:?}, new_rlim_addr = 0x{:x}, old_rlim_addr = 0x{:x}",
|
||||
pid, resource, new_rlim_addr, old_rlim_addr
|
||||
);
|
||||
let mut resource_limits = ctx.process.resource_limits().lock();
|
||||
let resource_limits = ctx.process.resource_limits();
|
||||
if old_rlim_addr != 0 {
|
||||
let rlimit = resource_limits.get_rlimit(resource);
|
||||
ctx.user_space().write_val(old_rlim_addr, rlimit)?;
|
||||
let (cur, max) = rlimit.get_cur_and_max();
|
||||
let rlimit_raw = RawRLimit64 { cur, max };
|
||||
ctx.user_space().write_val(old_rlim_addr, &rlimit_raw)?;
|
||||
}
|
||||
if new_rlim_addr != 0 {
|
||||
let new_rlimit: RLimit64 = ctx.user_space().read_val(new_rlim_addr)?;
|
||||
debug!("new_rlimit = {:?}", new_rlimit);
|
||||
if !new_rlimit.is_valid() {
|
||||
return_errno_with_message!(Errno::EINVAL, "invalid rlimit");
|
||||
}
|
||||
*resource_limits.get_rlimit_mut(resource) = new_rlimit;
|
||||
let new_raw: RawRLimit64 = ctx.user_space().read_val(new_rlim_addr)?;
|
||||
debug!("new_rlimit = {:?}", new_raw);
|
||||
resource_limits
|
||||
.get_rlimit(resource)
|
||||
.set_cur_and_max(new_raw.cur, new_raw.max)?;
|
||||
}
|
||||
Ok(SyscallReturn::Return(0))
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ fn check_length(len: isize, ctx: &Context) -> Result<()> {
|
||||
}
|
||||
|
||||
let max_file_size = {
|
||||
let resource_limits = ctx.process.resource_limits().lock();
|
||||
let resource_limits = ctx.process.resource_limits();
|
||||
resource_limits
|
||||
.get_rlimit(ResourceType::RLIMIT_FSIZE)
|
||||
.get_cur() as usize
|
||||
|
Reference in New Issue
Block a user