Messages in this thread | | | Date | Wed, 26 Jul 2023 14:49:05 +0800 | Subject | Re: [PATCH v2 11/47] gfs2: dynamically allocate the gfs2-qd shrinker | From | Muchun Song <> |
| |
On 2023/7/24 17:43, Qi Zheng wrote: > Use new APIs to dynamically allocate the gfs2-qd shrinker. > > Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> > --- > fs/gfs2/main.c | 6 +++--- > fs/gfs2/quota.c | 26 ++++++++++++++++++++------ > fs/gfs2/quota.h | 3 ++- > 3 files changed, 25 insertions(+), 10 deletions(-) > > diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c > index afcb32854f14..e47b1cc79f59 100644 > --- a/fs/gfs2/main.c > +++ b/fs/gfs2/main.c > @@ -147,7 +147,7 @@ static int __init init_gfs2_fs(void) > if (!gfs2_trans_cachep) > goto fail_cachep8; > > - error = register_shrinker(&gfs2_qd_shrinker, "gfs2-qd"); > + error = gfs2_qd_shrinker_init(); > if (error) > goto fail_shrinker; > > @@ -196,7 +196,7 @@ static int __init init_gfs2_fs(void) > fail_wq2: > destroy_workqueue(gfs_recovery_wq); > fail_wq1: > - unregister_shrinker(&gfs2_qd_shrinker); > + gfs2_qd_shrinker_exit(); > fail_shrinker: > kmem_cache_destroy(gfs2_trans_cachep); > fail_cachep8: > @@ -229,7 +229,7 @@ static int __init init_gfs2_fs(void) > > static void __exit exit_gfs2_fs(void) > { > - unregister_shrinker(&gfs2_qd_shrinker); > + gfs2_qd_shrinker_exit(); > gfs2_glock_exit(); > gfs2_unregister_debugfs(); > unregister_filesystem(&gfs2_fs_type); > diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c > index 704192b73605..bc9883cea847 100644 > --- a/fs/gfs2/quota.c > +++ b/fs/gfs2/quota.c > @@ -186,13 +186,27 @@ static unsigned long gfs2_qd_shrink_count(struct shrinker *shrink, > return vfs_pressure_ratio(list_lru_shrink_count(&gfs2_qd_lru, sc)); > } > > -struct shrinker gfs2_qd_shrinker = { > - .count_objects = gfs2_qd_shrink_count, > - .scan_objects = gfs2_qd_shrink_scan, > - .seeks = DEFAULT_SEEKS, > - .flags = SHRINKER_NUMA_AWARE, > -}; > +static struct shrinker *gfs2_qd_shrinker; > + > +int gfs2_qd_shrinker_init(void)
It's better to declare this as __init.
> +{ > + gfs2_qd_shrinker = shrinker_alloc(SHRINKER_NUMA_AWARE, "gfs2-qd"); > + if (!gfs2_qd_shrinker) > + return -ENOMEM; > + > + gfs2_qd_shrinker->count_objects = gfs2_qd_shrink_count; > + gfs2_qd_shrinker->scan_objects = gfs2_qd_shrink_scan; > + gfs2_qd_shrinker->seeks = DEFAULT_SEEKS; > + > + shrinker_register(gfs2_qd_shrinker); > > + return 0; > +} > + > +void gfs2_qd_shrinker_exit(void) > +{ > + shrinker_unregister(gfs2_qd_shrinker); > +} > > static u64 qd2index(struct gfs2_quota_data *qd) > { > diff --git a/fs/gfs2/quota.h b/fs/gfs2/quota.h > index 21ada332d555..f9cb863373f7 100644 > --- a/fs/gfs2/quota.h > +++ b/fs/gfs2/quota.h > @@ -59,7 +59,8 @@ static inline int gfs2_quota_lock_check(struct gfs2_inode *ip, > } > > extern const struct quotactl_ops gfs2_quotactl_ops; > -extern struct shrinker gfs2_qd_shrinker; > +int gfs2_qd_shrinker_init(void); > +void gfs2_qd_shrinker_exit(void); > extern struct list_lru gfs2_qd_lru; > extern void __init gfs2_quota_hash_init(void); >
| |