Messages in this thread | | | From | (Eric W. Biederman) | Date | Wed, 12 Feb 2020 13:16:38 -0600 | Subject | Re: [PATCH v8 07/11] proc: flush task dcache entries from all procfs instances |
| |
Linus Torvalds <torvalds@linux-foundation.org> writes:
> On Wed, Feb 12, 2020 at 7:01 AM Eric W. Biederman <ebiederm@xmission.com> 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
| |