On Fri, May 22, 2020 at 03:52:39PM +0800, Muchun Song wrote: > On Fri, May 22, 2020 at 12:47 AM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > > @@ -160,14 +168,23 @@ static int proc_fd_link(struct dentry *dentry, struct path *path) > > > unsigned int fd = proc_fd(d_inode(dentry)); > > > struct file *fd_file; > > > > > > - spin_lock(&files->file_lock); > > > + rcu_read_lock(); > > > +again: > > > fd_file = fcheck_files(files, fd); > > > if (fd_file) { > > > + if (!get_file_rcu(fd_file)) { > > > + /* > > > + * we loop to catch the new file > > > + * (or NULL pointer). > > > + */ > > > + goto again; > > > + } > > > *path = fd_file->f_path; > > > path_get(&fd_file->f_path); > > > + fput(fd_file); > > > ret = 0; > > > } > > > - spin_unlock(&files->file_lock); > > > + rcu_read_unlock(); > > > > Why is it an improvement to increment/decrement the refcount on the > > struct file here, rather than take/release the spinlock? > > > > lock-free vs spinlock. bananas vs oranges. How do you think refcounts work? How do you think spinlocks work? > Do you think spinlock would be better than the lock-free method? > Actually I prefer the rcu lock. Why? You don't seem to understand the tradeoffs.