From patchwork Wed Dec 10 00:07:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 885 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1765325406; bh=kHrhzwoxV9aBksHClZxvsil5mPp3VHGiS0AYnX0p0uE=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=EhTT0y65GOY8xcWa6HBEVTTAsFwKgkOcWoxs61Qg+wkRtnNn7ZoZLR7VAEKKvLDcH SJiUCUANBjlrionOITMTHcB46SeCRkWeSsj7C2VZtcrBgF2AoAFHqTD2ofiTknAMqA /q/us5DqjPo4wE6F0wpkXt6eaSlHqS8HPwgRNUGTjBuNyp9KnGRu7bvF+xFsRUkr3e 4ganV1IIh7dpfDBmy6kUWXAaE/5qg1j3Ub4zrax02cPdWEQ9HsGNwiSuMwtBO7AmOv CVKv52XQ2Oqj+DRV3ZEkV1F6zUY2FKZ55pW9LCMPdVNHoTPvpWlAEqMm0mbw5SVIlE 4sbMxb9g53Ybw== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id E603F68A47 for ; Tue, 9 Dec 2025 17:10:06 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id uEb6ixN4-khs for ; Tue, 9 Dec 2025 17:10:06 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1765325406; bh=kHrhzwoxV9aBksHClZxvsil5mPp3VHGiS0AYnX0p0uE=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=EhTT0y65GOY8xcWa6HBEVTTAsFwKgkOcWoxs61Qg+wkRtnNn7ZoZLR7VAEKKvLDcH SJiUCUANBjlrionOITMTHcB46SeCRkWeSsj7C2VZtcrBgF2AoAFHqTD2ofiTknAMqA /q/us5DqjPo4wE6F0wpkXt6eaSlHqS8HPwgRNUGTjBuNyp9KnGRu7bvF+xFsRUkr3e 4ganV1IIh7dpfDBmy6kUWXAaE/5qg1j3Ub4zrax02cPdWEQ9HsGNwiSuMwtBO7AmOv CVKv52XQ2Oqj+DRV3ZEkV1F6zUY2FKZ55pW9LCMPdVNHoTPvpWlAEqMm0mbw5SVIlE 4sbMxb9g53Ybw== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id D38CE68A3E for ; Tue, 9 Dec 2025 17:10:06 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1765325404; bh=Tgx77gVCplz3z9OpR9ZTrQTfjV4Z7qUcIF0SAn5nQ8U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OwOKMmqoZ0Rvo1pPJ38bjdTvo7JNGBAlPXBAkkfQfwyFbahNh4NBAHr9OCp1UA+SF FU1H9UmSvkKXeJ8Eq20gErWXaS6bvgKCQBxbsFmGX0eaf5v3Ho0kKrMW1oA2ht5k0N ktHofxzJSPAlYJgPMo4N40QmBCCqbQEX6Gfnr4SufYgl7r/yktdnpTUzn964aUUOnu 8Bz+Qhxr0flCSZSmcm89oefj27sIyo55lN5IqHUydNjXVc4VqxlrDjuSXT61KARpYS Hv1qX08oEcUYPmGfID1fDf3VFvHZSNk8/McTtCtWtFC+UEc/bWi5uEBjMG1Wd7fmf/ HpRcuTE93HYqg== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 906B768A44; Tue, 9 Dec 2025 17:10:04 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id jqpFr5OOJwnY; Tue, 9 Dec 2025 17:10:04 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1765325399; bh=EBpqMy4b8tyAgIvrp/wnATpEtC6q3pYlQEi7/nHp5ho=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Mus/WCPv9JpRlyxLh3xdbSSXknWI8Sbs5SXMZll1ty1vrN1L01ZublqE65A3m0r3R 47R1W8+dQQhMJu3Ugmflpmmhb7OlXA0X21DTE+Lb3Fuw4CimjMKnK8tB1/HIItwOGe vRZyqVYhORS9rduNaajZ7qpSwDiKhre2Zi1ZGpr4vRTIJ2rNL+uKqACr02txIZdeoi LPNew8yRtblHj6o7CtQHVfey6LbQnRkoD6gY24T7+3VHVfdSZV3B3aYj2Mjng2J0tz HFDcJbUCoK0WSshCcRsIfZA6JLN8PA5jRUn4eKAXjUala1VyS92m5szxHBekfVGReA w61jKHb5do8gA== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id B712B6884F; Tue, 9 Dec 2025 17:09:58 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Tue, 9 Dec 2025 17:07:19 -0700 Message-ID: <20251210000737.180797-29-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251210000737.180797-1-sjg@u-boot.org> References: <20251210000737.180797-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: PUBAZWZFGCRH4IL6OIZKDQQZENJKGYG6 X-Message-ID-Hash: PUBAZWZFGCRH4IL6OIZKDQQZENJKGYG6 X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , Claude X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 28/35] malloc: Add a caller-info parameter to dlmalloc_impl() List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass When CONFIG_MALLOC_DEBUG is enabled, add an optional caller string parameter to dlmalloc_impl(). This allows tracking where allocations originate from when debugging memory issues. The CALLER_PARAM, CALLER_ARG, and CALLER_NULL macros hide the parameter when MALLOC_DEBUG is not enabled, keeping the non-debug code path clean. When MALLOC_DEBUG is enabled (with or without MCHECK), the _impl functions must be separate from the public API functions since they have different signatures. Add simple pass-through wrappers for this case. Co-developed-by: Claude Signed-off-by: Simon Glass --- common/dlmalloc.c | 54 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/common/dlmalloc.c b/common/dlmalloc.c index 706c12d9b9a..420bed1c480 100644 --- a/common/dlmalloc.c +++ b/common/dlmalloc.c @@ -570,6 +570,13 @@ MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP #if CONFIG_IS_ENABLED(MALLOC_DEBUG) #define DEBUG 1 +#define CALLER_PARAM , const char *caller +#define CALLER_ARG , caller +#define CALLER_NULL , NULL +#else +#define CALLER_PARAM +#define CALLER_ARG +#define CALLER_NULL #endif #define LACKS_FCNTL_H @@ -626,12 +633,14 @@ MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP DECLARE_GLOBAL_DATA_PTR; -#if CONFIG_IS_ENABLED(MCHECK_HEAP_PROTECTION) +#if CONFIG_IS_ENABLED(MCHECK_HEAP_PROTECTION) || CONFIG_IS_ENABLED(MALLOC_DEBUG) #define STATIC_IF_MCHECK static +#ifdef CONFIG_MCHECK_HEAP_PROTECTION #undef MALLOC_COPY #undef MALLOC_ZERO static inline void MALLOC_ZERO(void *p, size_t sz) { memset(p, 0, sz); } static inline void MALLOC_COPY(void *dest, const void *src, size_t sz) { memcpy(dest, src, sz); } +#endif #else #define STATIC_IF_MCHECK #define dlmalloc_impl dlmalloc @@ -4097,7 +4106,7 @@ static void unlink_large_chunk(mstate M, tchunkptr X) { * to avoid going through the mcheck wrappers which expect user pointers. */ #if CONFIG_IS_ENABLED(MCHECK_HEAP_PROTECTION) -#define internal_malloc(m, b) dlmalloc_impl(b) +#define internal_malloc(m, b) dlmalloc_impl(b CALLER_NULL) #define internal_free(m, mem) dlfree_impl(mem) #else #define internal_malloc(m, b) dlmalloc(b) @@ -4940,7 +4949,7 @@ static void* tmalloc_small(mstate m, size_t nb) { #if !ONLY_MSPACES STATIC_IF_MCHECK -void* dlmalloc_impl(size_t bytes) { +void *dlmalloc_impl(size_t bytes CALLER_PARAM) { #ifdef __UBOOT__ #if CONFIG_IS_ENABLED(SYS_MALLOC_F) if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) @@ -5247,7 +5256,7 @@ void* dlcalloc_impl(size_t n_elements, size_t elem_size) { (req / n_elements != elem_size)) req = MAX_SIZE_T; /* force downstream failure on overflow */ } - mem = dlmalloc_impl(req); + mem = dlmalloc_impl(req CALLER_NULL); #ifdef __UBOOT__ #if CONFIG_IS_ENABLED(SYS_MALLOC_F) /* For pre-reloc simple malloc, just zero the memory directly */ @@ -5702,7 +5711,7 @@ void* dlrealloc_impl(void* oldmem, size_t bytes) { #endif void* mem = 0; if (oldmem == 0) { - mem = dlmalloc_impl(bytes); + mem = dlmalloc_impl(bytes CALLER_NULL); } else if (bytes >= MAX_REQUEST) { MALLOC_FAILURE_ACTION; @@ -5755,7 +5764,7 @@ void* dlrealloc_impl(void* oldmem, size_t bytes) { } } #else /* defined(__UBOOT__) && NO_REALLOC_IN_PLACE */ - mem = dlmalloc_impl(bytes); + mem = dlmalloc_impl(bytes CALLER_NULL); if (mem != 0) { size_t oc = chunksize(oldp) - overhead_for(oldp); memcpy(mem, oldmem, (oc < bytes)? oc : bytes); @@ -5821,7 +5830,7 @@ void* dlmemalign_impl(size_t alignment, size_t bytes) { * The base pointer must still be properly aligned for this to work. */ if (alignment <= MALLOC_ALIGNMENT) - return dlmalloc_impl(bytes); + return dlmalloc_impl(bytes CALLER_NULL); return internal_memalign(gm, alignment, bytes); } @@ -5950,7 +5959,7 @@ void *dlmalloc(size_t bytes) { mcheck_pedantic_prehook(); size_t fullsz = mcheck_alloc_prehook(bytes); - void *p = dlmalloc_impl(fullsz); + void *p = dlmalloc_impl(fullsz CALLER_NULL); if (!p) return p; @@ -6023,6 +6032,35 @@ int mcheck(mcheck_abortfunc_t f) void mcheck_check_all(void) { mcheck_pedantic_check(); } enum mcheck_status mprobe(void *__ptr) { return mcheck_mprobe(__ptr); } +#elif CONFIG_IS_ENABLED(MALLOC_DEBUG) +/* + * Simple wrappers when MALLOC_DEBUG is enabled but not MCHECK. + * These just forward to the _impl functions. + */ +void *dlmalloc(size_t bytes) +{ + return dlmalloc_impl(bytes CALLER_NULL); +} + +void dlfree(void *mem) +{ + dlfree_impl(mem); +} + +void *dlrealloc(void *oldmem, size_t bytes) +{ + return dlrealloc_impl(oldmem, bytes); +} + +void *dlmemalign(size_t alignment, size_t bytes) +{ + return dlmemalign_impl(alignment, bytes); +} + +void *dlcalloc(size_t n, size_t elem_size) +{ + return dlcalloc_impl(n, elem_size); +} #endif /* MCHECK_HEAP_PROTECTION */ #endif /* !ONLY_MSPACES */