Message ID | 20190822000933.180870-1-khazhy@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/3] fuse: on 64-bit store time in d_fsdata directly | expand |
On Wed, Aug 21, 2019 at 5:09 PM Khazhismel Kumykov <khazhy@google.com> 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@google.com> 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@google.com> > --- > 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 >
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)
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@google.com> --- fs/fuse/dir.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)