diff options
author | Zhen Lei <thunder.leizhen@huawei.com> | 2024-10-07 19:49:53 +0300 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2024-10-15 18:30:30 +0300 |
commit | 813fd07858cfb410bc9574c05b7922185f65989b (patch) | |
tree | 9329934c73bad7983824db149369173f185d698f /lib/debugobjects.c | |
parent | a0ae95040853aa05dc006f4b16f8c82c6f9dd9e4 (diff) | |
download | linux-813fd07858cfb410bc9574c05b7922185f65989b.tar.xz |
debugobjects: Collect newly allocated objects in a list to reduce lock contention
Collect the newly allocated debug objects in a list outside the lock, so
that the lock held time and the potential lock contention is reduced.
Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20240911083521.2257-3-thunder.leizhen@huawei.com
Link: https://lore.kernel.org/all/20241007164913.073653668@linutronix.de
Diffstat (limited to 'lib/debugobjects.c')
-rw-r--r-- | lib/debugobjects.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/lib/debugobjects.c b/lib/debugobjects.c index df48acc5d4b3..798ce5ac1ffe 100644 --- a/lib/debugobjects.c +++ b/lib/debugobjects.c @@ -161,23 +161,25 @@ static void fill_pool(void) return; while (READ_ONCE(obj_pool_free) < debug_objects_pool_min_level) { - struct debug_obj *new[ODEBUG_BATCH_SIZE]; + struct debug_obj *new, *last = NULL; + HLIST_HEAD(head); int cnt; for (cnt = 0; cnt < ODEBUG_BATCH_SIZE; cnt++) { - new[cnt] = kmem_cache_zalloc(obj_cache, gfp); - if (!new[cnt]) + new = kmem_cache_zalloc(obj_cache, gfp); + if (!new) break; + hlist_add_head(&new->node, &head); + if (!last) + last = new; } if (!cnt) return; raw_spin_lock_irqsave(&pool_lock, flags); - while (cnt) { - hlist_add_head(&new[--cnt]->node, &obj_pool); - debug_objects_allocated++; - WRITE_ONCE(obj_pool_free, obj_pool_free + 1); - } + hlist_splice_init(&head, &last->node, &obj_pool); + debug_objects_allocated += cnt; + WRITE_ONCE(obj_pool_free, obj_pool_free + cnt); raw_spin_unlock_irqrestore(&pool_lock, flags); } } |