On Tue, 2024-06-18 at 10:35 +0200, Michal Hocko wrote: > On Mon 17-06-24 11:04:41, Tim Chen wrote: > > diff --git a/kernel/sys.c b/kernel/sys.c > > index 3a2df1bd9f64..b4e523728c3e 100644 > > --- a/kernel/sys.c > > +++ b/kernel/sys.c > > @@ -1471,6 +1471,7 @@ static int do_prlimit(struct task_struct *tsk, unsigned int resource, > > return -EINVAL; > > resource = array_index_nospec(resource, RLIM_NLIMITS); > > > > + task_lock(tsk->group_leader); > > if (new_rlim) { > > if (new_rlim->rlim_cur > new_rlim->rlim_max) > > return -EINVAL; > > This is clearly broken as it leaves the lock behind on the error, no? Thanks for pointing that out. Need unlock before return. I don't like adding task_lock in alloc_fd path if there are multiple alloc_fd going on causing contention. The race with rlimit change should be a very rare thing. Should be sufficient that patch one check for fd not going beyond the observed rlimit. Tim