Re: [PATCH v8 07/11] proc: flush task dcache entries from all procfs instances
From: Eric W. Biederman <hidden>
Date: 2020-02-12 19:18:42
Also in:
linux-fsdevel, linux-security-module, lkml
Linus Torvalds [off-list ref] writes:
On Wed, Feb 12, 2020 at 7:01 AM Eric W. Biederman [off-list ref] wrote:quoted
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.quoted
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