Message ID | 20230727080502.77895-17-zhengqi.arch@bytedance.com (mailing list archive) |
---|---|
State | Handled Elsewhere, archived |
Headers | show |
Series | use refcount+RCU method to implement lockless slab shrink | expand |
On 2023/7/27 16:04, Qi Zheng wrote: > Use new APIs to dynamically allocate the nfsd-filecache shrinker. > > Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> > Reviewed-by: Muchun Song <songmuchun@bytedance.com> > --- > fs/nfsd/filecache.c | 22 ++++++++++++---------- > 1 file changed, 12 insertions(+), 10 deletions(-) > > diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c > index ee9c923192e0..872eb9501965 100644 > --- a/fs/nfsd/filecache.c > +++ b/fs/nfsd/filecache.c > @@ -521,11 +521,7 @@ nfsd_file_lru_scan(struct shrinker *s, struct shrink_control *sc) > return ret; > } > > -static struct shrinker nfsd_file_shrinker = { > - .scan_objects = nfsd_file_lru_scan, > - .count_objects = nfsd_file_lru_count, > - .seeks = 1, > -}; > +static struct shrinker *nfsd_file_shrinker; > > /** > * nfsd_file_cond_queue - conditionally unhash and queue a nfsd_file > @@ -746,12 +742,18 @@ nfsd_file_cache_init(void) > goto out_err; > } > > - ret = register_shrinker(&nfsd_file_shrinker, "nfsd-filecache"); > - if (ret) { > - pr_err("nfsd: failed to register nfsd_file_shrinker: %d\n", ret); > + nfsd_file_shrinker = shrinker_alloc(0, "nfsd-filecache"); > + if (!nfsd_file_shrinker) { Here should set ret to -ENOMEM, will fix. > + pr_err("nfsd: failed to allocate nfsd_file_shrinker\n"); > goto out_lru; > } > > + nfsd_file_shrinker->count_objects = nfsd_file_lru_count; > + nfsd_file_shrinker->scan_objects = nfsd_file_lru_scan; > + nfsd_file_shrinker->seeks = 1; > + > + shrinker_register(nfsd_file_shrinker); > + > ret = lease_register_notifier(&nfsd_file_lease_notifier); > if (ret) { > pr_err("nfsd: unable to register lease notifier: %d\n", ret); > @@ -774,7 +776,7 @@ nfsd_file_cache_init(void) > out_notifier: > lease_unregister_notifier(&nfsd_file_lease_notifier); > out_shrinker: > - unregister_shrinker(&nfsd_file_shrinker); > + shrinker_free(nfsd_file_shrinker); > out_lru: > list_lru_destroy(&nfsd_file_lru); > out_err: > @@ -891,7 +893,7 @@ nfsd_file_cache_shutdown(void) > return; > > lease_unregister_notifier(&nfsd_file_lease_notifier); > - unregister_shrinker(&nfsd_file_shrinker); > + shrinker_free(nfsd_file_shrinker); > /* > * make sure all callers of nfsd_file_lru_cb are done before > * calling nfsd_file_cache_purge
diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c index ee9c923192e0..872eb9501965 100644 --- a/fs/nfsd/filecache.c +++ b/fs/nfsd/filecache.c @@ -521,11 +521,7 @@ nfsd_file_lru_scan(struct shrinker *s, struct shrink_control *sc) return ret; } -static struct shrinker nfsd_file_shrinker = { - .scan_objects = nfsd_file_lru_scan, - .count_objects = nfsd_file_lru_count, - .seeks = 1, -}; +static struct shrinker *nfsd_file_shrinker; /** * nfsd_file_cond_queue - conditionally unhash and queue a nfsd_file @@ -746,12 +742,18 @@ nfsd_file_cache_init(void) goto out_err; } - ret = register_shrinker(&nfsd_file_shrinker, "nfsd-filecache"); - if (ret) { - pr_err("nfsd: failed to register nfsd_file_shrinker: %d\n", ret); + nfsd_file_shrinker = shrinker_alloc(0, "nfsd-filecache"); + if (!nfsd_file_shrinker) { + pr_err("nfsd: failed to allocate nfsd_file_shrinker\n"); goto out_lru; } + nfsd_file_shrinker->count_objects = nfsd_file_lru_count; + nfsd_file_shrinker->scan_objects = nfsd_file_lru_scan; + nfsd_file_shrinker->seeks = 1; + + shrinker_register(nfsd_file_shrinker); + ret = lease_register_notifier(&nfsd_file_lease_notifier); if (ret) { pr_err("nfsd: unable to register lease notifier: %d\n", ret); @@ -774,7 +776,7 @@ nfsd_file_cache_init(void) out_notifier: lease_unregister_notifier(&nfsd_file_lease_notifier); out_shrinker: - unregister_shrinker(&nfsd_file_shrinker); + shrinker_free(nfsd_file_shrinker); out_lru: list_lru_destroy(&nfsd_file_lru); out_err: @@ -891,7 +893,7 @@ nfsd_file_cache_shutdown(void) return; lease_unregister_notifier(&nfsd_file_lease_notifier); - unregister_shrinker(&nfsd_file_shrinker); + shrinker_free(nfsd_file_shrinker); /* * make sure all callers of nfsd_file_lru_cb are done before * calling nfsd_file_cache_purge