On Wed, 9 Jun 2021 at 10:50, Ian Kent <raven@xxxxxxxxxx> wrote: > > If there are many lookups for non-existent paths these negative lookups > can lead to a lot of overhead during path walks. > > The VFS allows dentries to be created as negative and hashed, and caches > them so they can be used to reduce the fairly high overhead alloc/free > cycle that occurs during these lookups. > > Use the kernfs node parent revision to identify if a change has been > made to the containing directory so that the negative dentry can be > discarded and the lookup redone. > > Signed-off-by: Ian Kent <raven@xxxxxxxxxx> > --- > fs/kernfs/dir.c | 52 ++++++++++++++++++++++++++++++++-------------------- > 1 file changed, 32 insertions(+), 20 deletions(-) > > diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c > index b3d1bc0f317d0..4f037456a8e17 100644 > --- a/fs/kernfs/dir.c > +++ b/fs/kernfs/dir.c > @@ -1039,9 +1039,28 @@ static int kernfs_dop_revalidate(struct dentry *dentry, unsigned int flags) > if (flags & LOOKUP_RCU) > return -ECHILD; > > - /* Always perform fresh lookup for negatives */ > - if (d_really_is_negative(dentry)) > - goto out_bad_unlocked; > + /* Negative hashed dentry? */ > + if (d_really_is_negative(dentry)) { > + struct dentry *d_parent = dget_parent(dentry); > + struct kernfs_node *parent; > + > + /* If the kernfs parent node has changed discard and > + * proceed to ->lookup. > + */ > + parent = kernfs_dentry_node(d_parent); > + if (parent) { > + if (kernfs_dir_changed(parent, dentry)) { Perhaps add a note about this being dependent on parent of a negative dentry never changing. If this was backported to a kernel where this assumption doesn't hold, there would be a mathematical chance of a false negative. Thanks, Miklos