[Concept,05/26] mcheck: Add Kconfig option for caller string length

Message ID 20251231223008.3251711-6-sjg@u-boot.org
State New
Headers
Series ext4l: Add write support (part L) |

Commit Message

Simon Glass Dec. 31, 2025, 10:29 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

The mcheck heap protection stores a caller string in each allocation
header for debugging purposes. The length is hard-coded to 48 bytes in
mcheck_core.inc.h

Add a CONFIG_MCHECK_CALLER_LEN Kconfig option to make this configurable,
allowing users to adjust the trade-off between the amount of debugging
context and the memory overhead per allocation.

Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 Kconfig                  | 11 +++++++++++
 common/mcheck_core.inc.h |  5 ++---
 2 files changed, 13 insertions(+), 3 deletions(-)
  

Patch

diff --git a/Kconfig b/Kconfig
index c28fddf5016..3b89f2c48dd 100644
--- a/Kconfig
+++ b/Kconfig
@@ -355,6 +355,17 @@  config MCHECK_HEAP_PROTECTION
 	  significantly increases memory overhead and should only be used for
 	  debugging.
 
+config MCHECK_CALLER_LEN
+	int "Length of caller string in mcheck header"
+	depends on MCHECK_HEAP_PROTECTION
+	default 48
+	help
+	  Sets the maximum length of the caller string stored in each
+	  allocation header. This string records the function/file/line
+	  that allocated the memory, useful for debugging memory leaks.
+	  Larger values provide more context but increase memory overhead
+	  per allocation.
+
 config SPL_SYS_MALLOC_F
 	bool "Enable malloc() pool in SPL"
 	depends on SPL_FRAMEWORK && SYS_MALLOC_F && SPL
diff --git a/common/mcheck_core.inc.h b/common/mcheck_core.inc.h
index 598a5d018ab..fa152790d45 100644
--- a/common/mcheck_core.inc.h
+++ b/common/mcheck_core.inc.h
@@ -73,7 +73,6 @@ 
 // Full test suite can exceed 10000 concurrent allocations
 #define REGISTRY_SZ	12000
 #define CANARY_DEPTH	2
-#define MCHECK_CALLER_LEN	48
 
 // avoid problems with BSS at early stage:
 static char mcheck_pedantic_flag __section(".data") = 0;
@@ -89,7 +88,7 @@  struct mcheck_hdr {
 	size_t size; /* Exact size requested by user.  */
 	size_t aln_skip; /* Ignored bytes, before the mcheck_hdr, to fulfill alignment */
 	mcheck_canary canary; /* Magic number to check header integrity.  */
-	char caller[MCHECK_CALLER_LEN]; /* caller info for debugging */
+	char caller[CONFIG_MCHECK_CALLER_LEN]; /* caller info for debugging */
 };
 
 static void mcheck_default_abort(enum mcheck_status status, const void *p)
@@ -212,7 +211,7 @@  static void *mcheck_allocated_helper(void *altoghether_ptr, size_t customer_sz,
 	for (i = 0; i < CANARY_DEPTH; ++i)
 		hdr->canary.elems[i] = MAGICWORD;
 	if (caller)
-		strlcpy(hdr->caller, caller, MCHECK_CALLER_LEN);
+		strlcpy(hdr->caller, caller, CONFIG_MCHECK_CALLER_LEN);
 	else
 		hdr->caller[0] = '\0';