[PATCH OLK-5.10] 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失败! 邮件列表地址:https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/NHK... 失败原因:应用补丁/补丁集失败,Patch failed at 0001 mm/shrinker: Implementation of register_shrinker() and unregister_shrinker() 建议解决方法:请查看失败原因, 确认补丁是否可以应用在当前期望分支的最新代码上 FeedBack: The patch(es) which you have sent to kernel@openeuler.org has been converted to PR failed! Mailing list address: https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/NHK... Failed Reason: apply patch(es) failed, Patch failed at 0001 mm/shrinker: Implementation of register_shrinker() and unregister_shrinker() Suggest Solution: please checkout if the failed patch(es) can work on the newest codes in expected branch
participants (2)
-
patchwork bot -
Zhang Qilong