| From d0a6ab9e81dcbeeca0e2fe852a64cc99914a251e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 11 Jun 2022 21:06:34 +0800 |
| Subject: lib/debugobjects: fix stat count and optimize debug_objects_mem_init |
| |
| From: wuchi <wuchi.zero@gmail.com> |
| |
| [ Upstream commit eabb7f1ace53e127309407b2b5e74e8199e85270 ] |
| |
| 1. Var debug_objects_allocated tracks valid kmem_cache_alloc calls, so |
| track it in debug_objects_replace_static_objects. Do similar things in |
| object_cpu_offline. |
| |
| 2. In debug_objects_mem_init, there is no need to call function |
| cpuhp_setup_state_nocalls when debug_objects_enabled = 0 (out of |
| memory). |
| |
| Link: https://lkml.kernel.org/r/20220611130634.99741-1-wuchi.zero@gmail.com |
| Fixes: 634d61f45d6f ("debugobjects: Percpu pool lookahead freeing/allocation") |
| Fixes: c4b73aabd098 ("debugobjects: Track number of kmem_cache_alloc/kmem_cache_free done") |
| Signed-off-by: wuchi <wuchi.zero@gmail.com> |
| Reviewed-by: Waiman Long <longman@redhat.com> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Christoph Hellwig <hch@lst.de> |
| Cc: Kees Cook <keescook@chromium.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| lib/debugobjects.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| diff --git a/lib/debugobjects.c b/lib/debugobjects.c |
| index 337d797a7141..6f8e5dd1dcd0 100644 |
| --- a/lib/debugobjects.c |
| +++ b/lib/debugobjects.c |
| @@ -437,6 +437,7 @@ static int object_cpu_offline(unsigned int cpu) |
| struct debug_percpu_free *percpu_pool; |
| struct hlist_node *tmp; |
| struct debug_obj *obj; |
| + unsigned long flags; |
| |
| /* Remote access is safe as the CPU is dead already */ |
| percpu_pool = per_cpu_ptr(&percpu_obj_pool, cpu); |
| @@ -444,6 +445,12 @@ static int object_cpu_offline(unsigned int cpu) |
| hlist_del(&obj->node); |
| kmem_cache_free(obj_cache, obj); |
| } |
| + |
| + raw_spin_lock_irqsave(&pool_lock, flags); |
| + obj_pool_used -= percpu_pool->obj_free; |
| + debug_objects_freed += percpu_pool->obj_free; |
| + raw_spin_unlock_irqrestore(&pool_lock, flags); |
| + |
| percpu_pool->obj_free = 0; |
| |
| return 0; |
| @@ -1318,6 +1325,8 @@ static int __init debug_objects_replace_static_objects(void) |
| hlist_add_head(&obj->node, &objects); |
| } |
| |
| + debug_objects_allocated += i; |
| + |
| /* |
| * debug_objects_mem_init() is now called early that only one CPU is up |
| * and interrupts have been disabled, so it is safe to replace the |
| @@ -1386,6 +1395,7 @@ void __init debug_objects_mem_init(void) |
| debug_objects_enabled = 0; |
| kmem_cache_destroy(obj_cache); |
| pr_warn("out of memory.\n"); |
| + return; |
| } else |
| debug_objects_selftest(); |
| |
| -- |
| 2.35.1 |
| |