| From: Qi Zheng <zhengqi.arch@bytedance.com> |
| Subject: mm: shrinker: some cleanup |
| Date: Tue, 19 Sep 2023 10:46:07 +0800 |
| |
| Link: https://lkml.kernel.org/r/20230919024607.65463-1-zhengqi.arch@bytedance.com |
| Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> |
| Reviewed-by: Muchun Song <songmuchun@bytedance.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| include/linux/shrinker.h | 14 ++++++++------ |
| mm/internal.h | 17 ++++++++++++++--- |
| mm/shrinker.c | 20 ++++++++++++-------- |
| mm/shrinker_debug.c | 16 ---------------- |
| 4 files changed, 34 insertions(+), 33 deletions(-) |
| |
| --- a/include/linux/shrinker.h~mm-shrinker-add-infrastructure-for-dynamically-allocating-shrinker-fix |
| +++ a/include/linux/shrinker.h |
| @@ -88,16 +88,18 @@ struct shrinker { |
| }; |
| #define DEFAULT_SEEKS 2 /* A good number if you don't know better. */ |
| |
| -/* Flags */ |
| -#define SHRINKER_REGISTERED (1 << 0) |
| -#define SHRINKER_NUMA_AWARE (1 << 1) |
| -#define SHRINKER_MEMCG_AWARE (1 << 2) |
| +/* Internal flags */ |
| +#define SHRINKER_REGISTERED BIT(0) |
| +#define SHRINKER_ALLOCATED BIT(1) |
| + |
| +/* Flags for users to use */ |
| +#define SHRINKER_NUMA_AWARE BIT(2) |
| +#define SHRINKER_MEMCG_AWARE BIT(3) |
| /* |
| * It just makes sense when the shrinker is also MEMCG_AWARE for now, |
| * non-MEMCG_AWARE shrinker should not have this flag set. |
| */ |
| -#define SHRINKER_NONSLAB (1 << 3) |
| -#define SHRINKER_ALLOCATED (1 << 4) |
| +#define SHRINKER_NONSLAB BIT(4) |
| |
| struct shrinker *shrinker_alloc(unsigned int flags, const char *fmt, ...); |
| void shrinker_register(struct shrinker *shrinker); |
| --- a/mm/internal.h~mm-shrinker-add-infrastructure-for-dynamically-allocating-shrinker-fix |
| +++ a/mm/internal.h |
| @@ -1161,10 +1161,21 @@ unsigned long shrink_slab(gfp_t gfp_mask |
| int priority); |
| |
| #ifdef CONFIG_SHRINKER_DEBUG |
| +static inline int shrinker_debugfs_name_alloc(struct shrinker *shrinker, |
| + const char *fmt, va_list ap) |
| +{ |
| + shrinker->name = kvasprintf_const(GFP_KERNEL, fmt, ap); |
| + |
| + return shrinker->name ? 0 : -ENOMEM; |
| +} |
| + |
| +static inline void shrinker_debugfs_name_free(struct shrinker *shrinker) |
| +{ |
| + kfree_const(shrinker->name); |
| + shrinker->name = NULL; |
| +} |
| + |
| extern int shrinker_debugfs_add(struct shrinker *shrinker); |
| -extern int shrinker_debugfs_name_alloc(struct shrinker *shrinker, |
| - const char *fmt, va_list ap); |
| -extern void shrinker_debugfs_name_free(struct shrinker *shrinker); |
| extern struct dentry *shrinker_debugfs_detach(struct shrinker *shrinker, |
| int *debugfs_id); |
| extern void shrinker_debugfs_remove(struct dentry *debugfs_entry, |
| --- a/mm/shrinker.c~mm-shrinker-add-infrastructure-for-dynamically-allocating-shrinker-fix |
| +++ a/mm/shrinker.c |
| @@ -572,18 +572,23 @@ struct shrinker *shrinker_alloc(unsigned |
| |
| if (flags & SHRINKER_MEMCG_AWARE) { |
| err = prealloc_memcg_shrinker(shrinker); |
| - if (err == -ENOSYS) |
| + if (err == -ENOSYS) { |
| + /* Memcg is not supported, fallback to non-memcg-aware shrinker. */ |
| shrinker->flags &= ~SHRINKER_MEMCG_AWARE; |
| - else if (err == 0) |
| - goto done; |
| - else |
| + goto non_memcg; |
| + } |
| + |
| + if (err) |
| goto err_flags; |
| + |
| + return shrinker; |
| } |
| |
| +non_memcg: |
| /* |
| * The nr_deferred is available on per memcg level for memcg aware |
| * shrinkers, so only allocate nr_deferred in the following cases: |
| - * - non memcg aware shrinkers |
| + * - non-memcg-aware shrinkers |
| * - !CONFIG_MEMCG |
| * - memcg is disabled by kernel command line |
| */ |
| @@ -595,7 +600,6 @@ struct shrinker *shrinker_alloc(unsigned |
| if (!shrinker->nr_deferred) |
| goto err_flags; |
| |
| -done: |
| return shrinker; |
| |
| err_flags: |
| @@ -634,10 +638,10 @@ void shrinker_free(struct shrinker *shri |
| list_del(&shrinker->list); |
| debugfs_entry = shrinker_debugfs_detach(shrinker, &debugfs_id); |
| shrinker->flags &= ~SHRINKER_REGISTERED; |
| - } else { |
| - shrinker_debugfs_name_free(shrinker); |
| } |
| |
| + shrinker_debugfs_name_free(shrinker); |
| + |
| if (shrinker->flags & SHRINKER_MEMCG_AWARE) |
| unregister_memcg_shrinker(shrinker); |
| up_write(&shrinker_rwsem); |
| --- a/mm/shrinker_debug.c~mm-shrinker-add-infrastructure-for-dynamically-allocating-shrinker-fix |
| +++ a/mm/shrinker_debug.c |
| @@ -193,20 +193,6 @@ int shrinker_debugfs_add(struct shrinker |
| return 0; |
| } |
| |
| -int shrinker_debugfs_name_alloc(struct shrinker *shrinker, const char *fmt, |
| - va_list ap) |
| -{ |
| - shrinker->name = kvasprintf_const(GFP_KERNEL, fmt, ap); |
| - |
| - return shrinker->name ? 0 : -ENOMEM; |
| -} |
| - |
| -void shrinker_debugfs_name_free(struct shrinker *shrinker) |
| -{ |
| - kfree_const(shrinker->name); |
| - shrinker->name = NULL; |
| -} |
| - |
| int shrinker_debugfs_rename(struct shrinker *shrinker, const char *fmt, ...) |
| { |
| struct dentry *entry; |
| @@ -255,8 +241,6 @@ struct dentry *shrinker_debugfs_detach(s |
| |
| lockdep_assert_held(&shrinker_rwsem); |
| |
| - shrinker_debugfs_name_free(shrinker); |
| - |
| *debugfs_id = entry ? shrinker->debugfs_id : -1; |
| shrinker->debugfs_entry = NULL; |
| |
| _ |