[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250617053527.1223411-2-longman@redhat.com>
Date: Tue, 17 Jun 2025 01:35:26 -0400
From: Waiman Long <longman@...hat.com>
To: Thomas Gleixner <tglx@...utronix.de>,
Andrew Morton <akpm@...ux-foundation.org>
Cc: linux-kernel@...r.kernel.org,
Waiman Long <longman@...hat.com>
Subject: [PATCH v3 1/2] debugobjects: Show the state of debug_objects_enabled
With a PREEMPT_RT kernel, there is a fair chance that debug_objects
could get disabled because we are running out of free debug objects as
debug object allocation is disabled in non-preemptible context. With
!PREEMPT_RT kernels, the chance of this should be minimal. When we
consider imposing restrictions on where debug object allocation can be
done, the chance of running out of them increases.
Currently, it is not easy to figure if debug objects tracking is
disabled. Fix that by showing the state of "debug_objects_enabled"
in the stats debugfs file as well as always printing a message in the
console log.
Signed-off-by: Waiman Long <longman@...hat.com>
---
lib/debugobjects.c | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/lib/debugobjects.c b/lib/debugobjects.c
index 7f50c4480a4e..5598105ecf0d 100644
--- a/lib/debugobjects.c
+++ b/lib/debugobjects.c
@@ -125,6 +125,12 @@ static int __init disable_object_debug(char *str)
}
early_param("no_debug_objects", disable_object_debug);
+static void debug_objects_disable(const char *msg)
+{
+ debug_objects_enabled = false;
+ printk_deferred(KERN_WARNING "debug_objects disabled: %s\n", msg);
+}
+
static const char *obj_states[ODEBUG_STATE_MAX] = {
[ODEBUG_STATE_NONE] = "none",
[ODEBUG_STATE_INIT] = "initialized",
@@ -690,7 +696,7 @@ static struct debug_obj *lookup_object_or_alloc(void *addr, struct debug_bucket
}
/* Out of memory. Do the cleanup outside of the locked region */
- debug_objects_enabled = false;
+ debug_objects_disable("out of memory");
return NULL;
}
@@ -1161,6 +1167,8 @@ static int debug_stats_show(struct seq_file *m, void *v)
seq_printf(m, "on_free_list : %u\n", pool_count(&pool_to_free));
seq_printf(m, "objs_allocated: %d\n", debug_objects_allocated);
seq_printf(m, "objs_freed : %d\n", debug_objects_freed);
+ seq_printf(m, "debug_objects : %s\n", debug_objects_enabled ? "enabled"
+ : "disabled");
return 0;
}
DEFINE_SHOW_ATTRIBUTE(debug_stats);
@@ -1314,7 +1322,7 @@ check_results(void *addr, enum debug_obj_state state, int fixups, int warnings)
out:
raw_spin_unlock_irqrestore(&db->lock, flags);
if (res)
- debug_objects_enabled = false;
+ debug_objects_disable("selftest");
return res;
}
@@ -1486,11 +1494,8 @@ void __init debug_objects_mem_init(void)
cache = kmem_cache_create("debug_objects_cache", sizeof (struct debug_obj), 0,
SLAB_DEBUG_OBJECTS | SLAB_NOLEAKTRACE, NULL);
- if (!cache || !debug_objects_replace_static_objects(cache)) {
- debug_objects_enabled = false;
- pr_warn("Out of memory.\n");
- return;
- }
+ if (!cache || !debug_objects_replace_static_objects(cache))
+ debug_objects_disable("out of memory");
/*
* Adjust the thresholds for allocating and freeing objects
--
2.49.0
Powered by blists - more mailing lists