On Sat, Feb 19, 2022 at 05:58:13AM +0000, Al Viro wrote: > On Sat, Feb 19, 2022 at 05:53:37AM +0000, Al Viro wrote: > > On Fri, Feb 18, 2022 at 01:31:13PM -0500, Rik van Riel wrote: > > > > > struct super_block; > > > struct vfsmount; > > > @@ -73,6 +74,7 @@ struct vfsmount { > > > struct super_block *mnt_sb; /* pointer to superblock */ > > > int mnt_flags; > > > struct user_namespace *mnt_userns; > > > + struct rcu_work free_rwork; > > > } __randomize_layout; > > > > Wait, what? First of all, that has no business being in vfsmount - > > everything that deeply internal belongs in struct mount, not in > > its public part. Moreover, there's already mount->mnt_rcu, so what's > > the point duplicating that? > > Argh... You need rcu_work there... > > OK, so make that a member of the same union mnt_rcu is. In struct mount, > please. And I'm not sure I like the idea of shoving that much into > struct mount, TBH... We might have a plenty of struct mount instances. Very few of them will ever be internal, in the first place. Fewer yet - using kern_unmount_rcu(). And it's not small. If anything, I would consider something like call_rcu(&m->mnt_rcu, callback) with callback adding struct mount to llist and doing schedule_delayed_work() on that. With work consisting of doing mntput on everything in it. I'll get some sleep and put together something along those lines tomorrow morning.