On Wed, Apr 08, 2020 at 04:25:29PM -0700, Yonghong Song wrote: > + > + spin_lock(&files->file_lock); > + for (; sfd < files_fdtable(files)->max_fds; sfd++) { > + struct file *f; > + > + f = fcheck_files(files, sfd); > + if (!f) > + continue; > + > + *fd = sfd; > + get_file(f); > + spin_unlock(&files->file_lock); > + return f; > + } > + > + /* the current task is done, go to the next task */ > + spin_unlock(&files->file_lock); > + put_files_struct(files); I think spin_lock is unnecessary. It's similarly unnecessary in bpf_task_fd_query(). Take a look at proc_readfd_common() in fs/proc/fd.c. It only needs rcu_read_lock() to iterate fd array.