Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> writes: > On Wed, Feb 12, 2020 at 7:01 AM Eric W. Biederman <ebiederm@xxxxxxxxxxxx> wrote: >> >> Fundamentally proc_flush_task is an optimization. Just getting rid of >> dentries earlier. At least at one point it was an important >> optimization because the old process dentries would just sit around >> doing nothing for anyone. > > I'm pretty sure it's still important. It's very easy to generate a > _ton_ of dentries with /proc. > >> I wonder if instead of invalidating specific dentries we could instead >> fire wake up a shrinker and point it at one or more instances of proc. > > It shouldn't be the dentries themselves that are a freeing problem. > They're being RCU-free'd anyway because of lookup. It's the > proc_mounts list that is the problem, isn't it? > > So it's just fs_info that needs to be rcu-delayed because it contains > that list. Or is there something else? The fundamental dcache thing we are playing with is: dentry = d_hash_and_lookup(proc_root, &name); if (dentry) { d_invalidate(dentry); dput(dentry); } As Al pointed out upthread dput and d_invalidate can both sleep. The dput can potentially go away if we use __d_lookup_rcu instead of d_lookup. The challenge is d_invalidate. It has the fundamentally sleeping detach_mounts loop. Even shrink_dcache_parent has a cond_sched() in there to ensure it doesn't live lock the system. We could and arguabley should set DCACHE_CANT_MOUNT on the proc pid dentries. Which will prevent having to deal with mounts. But I don't see an easy way of getting shrink_dcache_parent to run without sleeping. Ideas? Eric