aboutsummaryrefslogtreecommitdiffstats
path: root/lib/debugobjects.c
diff options
context:
space:
mode:
authorThomas Gleixner <[email protected]>2024-10-07 16:50:20 +0000
committerThomas Gleixner <[email protected]>2024-10-15 15:30:33 +0000
commit13f9ca723900ae3ae8e0a1e76ba86e7786e60645 (patch)
treea0fbb89d81fe72f4a02fd1cbc8de3ac8cebd4307 /lib/debugobjects.c
parentdebugobjects: Double the per CPU slots (diff)
downloadkernel-13f9ca723900ae3ae8e0a1e76ba86e7786e60645.tar.gz
kernel-13f9ca723900ae3ae8e0a1e76ba86e7786e60645.zip
debugobjects: Refill per CPU pool more agressively
Right now the per CPU pools are only refilled when they become empty. That's suboptimal especially when there are still non-freed objects in the to free list. Check whether an allocation from the per CPU pool emptied a batch and try to allocate from the free pool if that still has objects available. kmem_cache_alloc() kmem_cache_free() Baseline: 295k 245k Refill: 225k 173k Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Zhen Lei <[email protected]> Link: https://lore.kernel.org/all/[email protected]
Diffstat (limited to 'lib/debugobjects.c')
-rw-r--r--lib/debugobjects.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/debugobjects.c b/lib/debugobjects.c
index fc9397de5534..cc32844ca18d 100644
--- a/lib/debugobjects.c
+++ b/lib/debugobjects.c
@@ -255,6 +255,24 @@ static struct debug_obj *pcpu_alloc(void)
if (likely(obj)) {
pcp->cnt--;
+ /*
+ * If this emptied a batch try to refill from the
+ * free pool. Don't do that if this was the top-most
+ * batch as pcpu_free() expects the per CPU pool
+ * to be less than ODEBUG_POOL_PERCPU_SIZE.
+ */
+ if (unlikely(pcp->cnt < (ODEBUG_POOL_PERCPU_SIZE - ODEBUG_BATCH_SIZE) &&
+ !(pcp->cnt % ODEBUG_BATCH_SIZE))) {
+ /*
+ * Don't try to allocate from the regular pool here
+ * to not exhaust it prematurely.
+ */
+ if (pool_count(&pool_to_free)) {
+ guard(raw_spinlock)(&pool_lock);
+ pool_move_batch(pcp, &pool_to_free);
+ pcpu_refill_stats();
+ }
+ }
return obj;
}