On Wed, May 15, 2019 at 05:35:15PM +0200, Oleg Nesterov wrote: > On 05/15, Oleg Nesterov wrote: > > > > On 05/15, Christian Brauner wrote: > > > > > > +SYSCALL_DEFINE2(pidfd_open, pid_t, pid, unsigned int, flags) > > > +{ > > > + int fd, ret; > > > + struct pid *p; > > > + struct task_struct *tsk; > > > + > > > + if (flags) > > > + return -EINVAL; > > > + > > > + if (pid <= 0) > > > + return -EINVAL; > > > + > > > + p = find_get_pid(pid); > > > + if (!p) > > > + return -ESRCH; > > > + > > > + rcu_read_lock(); > > > + tsk = pid_task(p, PIDTYPE_PID); > > > > You do not need find_get_pid() before rcu_lock and put_pid() at the end. > > You can just do find_vpid() under rcu_read_lock(). > > Ah, sorry. Somehow I forgot you need to call pidfd_create(pid), you can't > do this under rcu_read_lock(). > > So I was wrong, you can't avoid get/put_pid. Yeah, I haven't made any changes yet. Christian