[PATCH 2/3] debugobjects: Show the state of debug_objects_enabled

Waiman Long posted 3 patches 6 months, 2 weeks ago
There is a newer version of this series
[PATCH 2/3] debugobjects: Show the state of debug_objects_enabled
Posted by Waiman Long 6 months, 2 weeks ago
In the rare case that debug_objects got disabled because we are running
out of free debug objects, it is not easy to figure this out. 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@redhat.com>
---
 lib/debugobjects.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/lib/debugobjects.c b/lib/debugobjects.c
index 52bc77b41f48..0e9f44db9043 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;
+	pr_warn("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_object_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
Re: [PATCH 2/3] debugobjects: Show the state of debug_objects_enabled
Posted by kernel test robot 6 months, 2 weeks ago
Hi Waiman,

kernel test robot noticed the following build errors:

[auto build test ERROR on tip/timers/core]
[also build test ERROR on akpm-mm/mm-everything tip/core/debugobjects linus/master v6.15 next-20250605]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Waiman-Long/debugobjects-Add-ODEBUG_FLAG_NO_ALLOC-to-disable-memory-allocation/20250605-061211
base:   tip/timers/core
patch link:    https://lore.kernel.org/r/20250604220926.870760-3-longman%40redhat.com
patch subject: [PATCH 2/3] debugobjects: Show the state of debug_objects_enabled
config: arm-randconfig-002-20250606 (https://download.01.org/0day-ci/archive/20250606/202506060634.mQtyT7cN-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 11.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250606/202506060634.mQtyT7cN-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202506060634.mQtyT7cN-lkp@intel.com/

All errors (new ones prefixed by >>):

   lib/debugobjects.c: In function 'check_results':
>> lib/debugobjects.c:1325:17: error: implicit declaration of function 'debug_object_disable'; did you mean 'debug_objects_disable'? [-Werror=implicit-function-declaration]
    1325 |                 debug_object_disable("selftest");
         |                 ^~~~~~~~~~~~~~~~~~~~
         |                 debug_objects_disable
   cc1: some warnings being treated as errors


vim +1325 lib/debugobjects.c

  1288	
  1289	static int __init
  1290	check_results(void *addr, enum debug_obj_state state, int fixups, int warnings)
  1291	{
  1292		struct debug_bucket *db;
  1293		struct debug_obj *obj;
  1294		unsigned long flags;
  1295		int res = -EINVAL;
  1296	
  1297		db = get_bucket((unsigned long) addr);
  1298	
  1299		raw_spin_lock_irqsave(&db->lock, flags);
  1300	
  1301		obj = lookup_object(addr, db);
  1302		if (!obj && state != ODEBUG_STATE_NONE) {
  1303			WARN(1, KERN_ERR "ODEBUG: selftest object not found\n");
  1304			goto out;
  1305		}
  1306		if (obj && obj->state != state) {
  1307			WARN(1, KERN_ERR "ODEBUG: selftest wrong state: %d != %d\n",
  1308			       obj->state, state);
  1309			goto out;
  1310		}
  1311		if (fixups != debug_objects_fixups) {
  1312			WARN(1, KERN_ERR "ODEBUG: selftest fixups failed %d != %d\n",
  1313			       fixups, debug_objects_fixups);
  1314			goto out;
  1315		}
  1316		if (warnings != debug_objects_warnings) {
  1317			WARN(1, KERN_ERR "ODEBUG: selftest warnings failed %d != %d\n",
  1318			       warnings, debug_objects_warnings);
  1319			goto out;
  1320		}
  1321		res = 0;
  1322	out:
  1323		raw_spin_unlock_irqrestore(&db->lock, flags);
  1324		if (res)
> 1325			debug_object_disable("selftest");
  1326		return res;
  1327	}
  1328	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki