On 8/7/2025 11:11 PM, Catalin Marinas wrote:
@@ -433,8 +439,15 @@ static struct kmemleak_object *mem_pool_alloc(gfp_t gfp) list_del(&object->object_list); else if (mem_pool_free_count) object = &mem_pool[--mem_pool_free_count];
- else
- else {
/*
* Printk deferring due to the kmemleak_lock held.
* This is done to avoid deadlock.
*/
pr_warn_once("Memory pool empty, consider increasing CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE\n");printk_deferred_enter();
printk_deferred_exit();
- } raw_spin_unlock_irqrestore(&kmemleak_lock, flags);
I wouldn't bother with printk deferring here, just set a bool warn variable and report it after unlocking. We recently merged another patch that does this.
That's fine, I will send another patch that does not include this part.
return object; @@ -632,6 +645,11 @@ static struct kmemleak_object *create_object(unsigned long ptr, size_t size, else if (parent->pointer + parent->size <= ptr) link = &parent->rb_node.rb_right; else {
/*
* Printk deferring due to the kmemleak_lock held.
* This is done to avoid deadlock.
*/
printk_deferred_enter(); kmemleak_stop("Cannot insert 0x%lx into the object search tree (overlaps existing)\n", ptr); /*
@@ -639,6 +657,7 @@ static struct kmemleak_object *create_object(unsigned long ptr, size_t size, * be freed while the kmemleak_lock is held. */ dump_object_info(parent);
printk_deferred_exit();
This is part of __link_object(), called with the lock held, so easier to defer the printing as above.
BTW, the function names in the diff don't match mainline. Which kernel version is this patch based on?
The kernel version of this patch is stable-5.10. This part of the code exists in function __link_object() in the mainline.