[PATCH OLK-6.6] mm/shrinker: Implementation of register_shrinker() and unregister_shrinker()
hulk inclusion category: feature bugzilla: https://atomgit.com/openeuler/kernel/issues/8743 -------------------------------- The commit 6a317cb001d1 ("mm: shrinker: remove old APIs") removed old shrinker API. In order to maintain the compatibility of the KABI interface, it is necessary to adapt the old interface to connect to the new shrinking function. Signed-off-by: Zhang Qilong <zhangqilong3@huawei.com> --- include/linux/shrinker.h | 5 +++-- mm/vmscan.c | 44 +++++++++++++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h index 7091c5d21a9f..3467b18a8dbb 100644 --- a/include/linux/shrinker.h +++ b/include/linux/shrinker.h @@ -72,10 +72,11 @@ struct shrink_control { }; #define SHRINK_STOP (~0UL) #define SHRINK_EMPTY (~0UL - 1) +struct shrinker; /* * A callback you can register to apply pressure to ageable caches. * * @count_objects should return the number of freeable items in the cache. If * there are no objects to free, it should return SHRINK_EMPTY, while 0 is @@ -118,11 +119,11 @@ struct shrinker_v2 { struct dentry *debugfs_entry; #endif /* objs pending delete, per node */ atomic_long_t *nr_deferred; - KABI_RESERVE(1) + KABI_USE(1, struct shrinker *v1) KABI_RESERVE(2) /* * The reference count of this shrinker. Registered shrinker have an * initial refcount of 1, then the lookup operations are now allowed @@ -161,11 +162,11 @@ struct shrinker { const char *name; struct dentry *debugfs_entry; #endif atomic_long_t *nr_deferred; - KABI_RESERVE(1) + KABI_USE(1, struct shrinker_v2 *v2) KABI_RESERVE(2) }; #define DEFAULT_SEEKS 2 /* A good number if you don't know better. */ diff --git a/mm/vmscan.c b/mm/vmscan.c index 9e4aedbfd85e..cf6b9e6dc8cd 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -7608,22 +7608,56 @@ void check_move_unevictable_folios(struct folio_batch *fbatch) count_vm_events(UNEVICTABLE_PGSCANNED, pgscanned); } } EXPORT_SYMBOL_GPL(check_move_unevictable_folios); +static unsigned long shrinker_v2_to_v1_count_objects(struct shrinker_v2 *shk_v2, + struct shrink_control *sc) +{ + if (shk_v2->v1) + return shk_v2->v1->count_objects(shk_v2->v1, sc); + + return 0; +} + +static unsigned long shrinker_v2_to_v1_scan_objects(struct shrinker_v2 *shk_v2, + struct shrink_control *sc) +{ + if (shk_v2->v1) + return shk_v2->v1->count_objects(shk_v2->v1, sc); + + return SHRINK_EMPTY; +} + int register_shrinker(struct shrinker *shrinker, const char *fmt, ...) { - pr_warn_once("%s interface is deprecated. Please use instead shrinker_register()\n", - __func__); - return -ENOSYS; + struct shrinker_v2 *shk_v2; + + shk_v2 = shrinker_alloc(shrinker->flags, fmt); + if (!shk_v2) + return -ENOMEM; + + shk_v2->count_objects = shrinker_v2_to_v1_count_objects; + shk_v2->scan_objects = shrinker_v2_to_v1_scan_objects; + shk_v2->batch = shrinker->batch; + shk_v2->seeks = shrinker->seeks; + shk_v2->flags |= shrinker->flags; + shk_v2->v1 = shrinker; + + shrinker_register(shk_v2); + shrinker->v2 = shk_v2; + + return 0; } EXPORT_SYMBOL(register_shrinker); void unregister_shrinker(struct shrinker *shrinker) { - pr_warn_once("%s interface is deprecated. Please use instead shrinker_free()\n", - __func__); + if (shrinker->v2) { + shrinker_free(shrinker->v2); + shrinker->v2 = NULL; + } } EXPORT_SYMBOL(unregister_shrinker); void synchronize_shrinkers(void) { -- 2.43.0
反馈: 您发送到kernel@openeuler.org的补丁/补丁集,已成功转换为PR! PR链接地址: https://atomgit.com/openeuler/kernel/merge_requests/21311 邮件列表地址:https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/WL3... FeedBack: The patch(es) which you have sent to kernel@openeuler.org mailing list has been converted to a pull request successfully! Pull request link: https://atomgit.com/openeuler/kernel/merge_requests/21311 Mailing list address: https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/WL3...
participants (2)
-
patchwork bot -
Zhang Qilong