On Tue, Dec 08, 2020 at 10:24:57PM -0600, Eric W. Biederman wrote: > Al Viro <viro@xxxxxxxxxxxxxxxxxx> writes: > > > On Tue, Dec 08, 2020 at 04:38:09PM -0600, Eric W. Biederman wrote: > > > >> Is there any reason we don't simply rcu free the files_struct? > >> That would remove the need for the task_lock entirely. > > > > Umm... Potentially interesting part here is the interaction with > > close_files(); currently that can't overlap with any of those > > 3rd-party accesses to descriptor table, but with your changes > > here it's very much possible. > > Good point. > > I was worried there might have been a concern about the overhead > introduced by always rcu freeing files table. > > > OTOH, it's not like close_files() did much beyond the effects of already > > possible close(2) done by one of the threads sharing that sucker. > > It's _probably_ safe (at least for proc_readfd_common()), but I'll need > > to look at the other places doing that kind of access. Especially the > > BPF foulness... Still digging, unfortunately ;-/ > > Oh, and in any case, the trick with repurposing ->rcu of embedded > > fdtable deserves a comment. It's not hard to explain, so... > > Agreed. Something like fdtable.rcu isn't used so use it so by reusing > it we keep from wasting memory in files_struct to have a dedicated > rcu_head. I'd probably go for something along the lines of "we can avoid adding a separate rcu_head into files_struct, since rcu_head in struct fdtable is only used for separately allocated instances, allowing us to repurpose files_struct->fdtab.rcu for RCU-delayed freeing of files_struct"...