On Wed, Aug 21, 2019 at 5:09 PM Khazhismel Kumykov <khazhy@xxxxxxxxxx> wrote: > > Implements the optimization noted in f75fdf22b0a8 ("fuse: don't use > ->d_time"), as the additional memory can be significant. (In particular, > on SLAB configurations this 8-byte alloc becomes 32 bytes). Per-dentry, > this can consume significant memory. > > Signed-off-by: Khazhismel Kumykov <khazhy@xxxxxxxxxx> Actually we are seeing this in production where a job creating a lot of fuse files cause a lot of extra system level overhead. Reviewed-by: Shakeel Butt <shakeelb@xxxxxxxxxx> > --- > fs/fuse/dir.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c > index dd0f64f7bc06..f9c59a296568 100644 > --- a/fs/fuse/dir.c > +++ b/fs/fuse/dir.c > @@ -24,6 +24,18 @@ static void fuse_advise_use_readdirplus(struct inode *dir) > set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state); > } > > +#if BITS_PER_LONG >= 64 > +static inline void fuse_dentry_settime(struct dentry *entry, u64 time) > +{ > + entry->d_fsdata = (void *) time; > +} > + > +static inline u64 fuse_dentry_time(struct dentry *entry) > +{ > + return (u64)entry->d_fsdata; > +} > + > +#else > union fuse_dentry { > u64 time; > struct rcu_head rcu; > @@ -38,6 +50,7 @@ static inline u64 fuse_dentry_time(struct dentry *entry) > { > return ((union fuse_dentry *) entry->d_fsdata)->time; > } > +#endif > > /* > * FUSE caches dentries and attributes with separate timeout. The > @@ -242,6 +255,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) > goto out; > } > > +#if BITS_PER_LONG < 64 > static int fuse_dentry_init(struct dentry *dentry) > { > dentry->d_fsdata = kzalloc(sizeof(union fuse_dentry), GFP_KERNEL); > @@ -254,16 +268,21 @@ static void fuse_dentry_release(struct dentry *dentry) > > kfree_rcu(fd, rcu); > } > +#endif > > const struct dentry_operations fuse_dentry_operations = { > .d_revalidate = fuse_dentry_revalidate, > +#if BITS_PER_LONG < 64 > .d_init = fuse_dentry_init, > .d_release = fuse_dentry_release, > +#endif > }; > > const struct dentry_operations fuse_root_dentry_operations = { > +#if BITS_PER_LONG < 64 > .d_init = fuse_dentry_init, > .d_release = fuse_dentry_release, > +#endif > }; > > int fuse_valid_type(int m) > -- > 2.23.0.187.g17f5b7556c-goog >