From patchwork Wed Dec 31 22:29:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1144 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=1767220257; bh=FeXATdr8DDASgB29ipqNA0ZMfOU0lNW+nAW5oJRIBbo=; 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=w4R8g6z6xhcXKgzDWBT1GwU5t6nInLPlM14+Od15gS9W/mMfMSBXpJW19unp9WnES DjeugWae0kU3DsYVHozoKErB5FnxO105DlqkKCF+UphdICBZOqZsw70HL4GAvWs7YH YEVzdy3JRq2V0ZRTi2ai8iGDSOVJbxL93eZf865naKwyxp6lRzrsmz9RspB+xC3xgG lOfSwJvN+EXNwDgLSAHFJd1/gpDWJUP4OwIHVUagDeXvs7axrS8bTwvvlx7pLfJUk2 cpIWXjgjSrqQnf7hZAGejmDFGlWIM+M4mtLsRGxkdHKoljwvbNUGLi3eTbESBxtRDG eQC8ds4JN9Xmw== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 2441E68FC2 for ; Wed, 31 Dec 2025 15:30:57 -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 p2S-XH2Fn_UJ for ; Wed, 31 Dec 2025 15:30:57 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767220257; bh=FeXATdr8DDASgB29ipqNA0ZMfOU0lNW+nAW5oJRIBbo=; 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=w4R8g6z6xhcXKgzDWBT1GwU5t6nInLPlM14+Od15gS9W/mMfMSBXpJW19unp9WnES DjeugWae0kU3DsYVHozoKErB5FnxO105DlqkKCF+UphdICBZOqZsw70HL4GAvWs7YH YEVzdy3JRq2V0ZRTi2ai8iGDSOVJbxL93eZf865naKwyxp6lRzrsmz9RspB+xC3xgG lOfSwJvN+EXNwDgLSAHFJd1/gpDWJUP4OwIHVUagDeXvs7axrS8bTwvvlx7pLfJUk2 cpIWXjgjSrqQnf7hZAGejmDFGlWIM+M4mtLsRGxkdHKoljwvbNUGLi3eTbESBxtRDG eQC8ds4JN9Xmw== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 08A3D68FCB for ; Wed, 31 Dec 2025 15:30:57 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767220255; bh=9xgCdJWlgeG70GTLTrnMHgOqNLuPrR8e3e7gRaRpPOo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vZG1FLy7FPeW3Iq3jCKVSF5nC62EjFxBBNgmNIr6sBFZVV0LmqJsBbuMUJmKSE/lh f6uM6XR+CAroX7FGk5nkBQEVngT9aVhXzRVnJwbbnU1FavxFOyqDYPlZHOXMJD9Csk P1tf+d58safvpgsqAodZjNzNuNZfAW3A4YUdgXNe1kgC5AKKjlHsixzP7auyWeiZVa zbHoVRnUWLrTriHvfdwdASeYgz581sHDlk/ORYIWYQ8lNYVgkoWzypIz4U/JEEpAGq qja6HCCGqtEPha8+vtdb84bocnBkVpd8O4E97Jr/gnAfgphZ7v/qmI9bXwoTdQQ+xJ rqKUkR+p345cQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 9B73268C5D; Wed, 31 Dec 2025 15:30:55 -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 Fgs5RFAs_Q_4; Wed, 31 Dec 2025 15:30:55 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767220251; bh=gWl8QKzAWQoDuLev28HsH8Y8oPSe6cKsgR1uwA8uOsQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lJ65W2lC+U61hjIat9bxQrV9CIZIG5edeV5lzHmgjFLhD3MqbNUgPLE0QERXRVZHo 5GOU3V3cXnFUg1SO1GyaDyEKLErf1gQlJIPVAWkopyMJRB9blYyL0XyNtOtYNRTdHa JKk1bttMXhNeqnZiA6WoQ9jqiHfcX+7Uk7TS4Wccfub7E6maSzmL0rnJV+sB4Zcl3h 5QWQinOJZdsl1ySoSWhIEqpm2qbqWIRGqbRG0FBivdelPWhZ+7l4fFLrMkpGM62P61 SgZ3X6R2vvwuKWbnzYiocOPKAIk1P8UBPsNifBVn1EnDgrzn1ehyH20pAsC5JZ/OIM bkM2ZVjmC51HQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 2C73168F65; Wed, 31 Dec 2025 15:30:51 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Wed, 31 Dec 2025 15:29:39 -0700 Message-ID: <20251231223008.3251711-7-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251231223008.3251711-1-sjg@u-boot.org> References: <20251231223008.3251711-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: HHQUO4QNESFMHMROTWQBVZI775TAVP5X X-Message-ID-Hash: HHQUO4QNESFMHMROTWQBVZI775TAVP5X 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 Opus 4 . 5" X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 06/26] mcheck: Skip mcheck overhead for pre-relocation allocations 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 mcheck heap-protection is enabled, each allocation adds quite a bit of overhead for headers and canaries. While this is needed for the full allocator, it serves no purpose for pre-relocation allocations, since: 1. Simple malloc is a bump allocator that cannot free memory 3. Mcheck's corruption-detection provides no benefit for non-freeable memory Since the pre-relocation heap space is limited (typically <16KB), this overhead can exhaust the heap, causing boot failures. Fix this by bypassing mcheck hooks in dlmalloc(), dlfree(), dlmemalign() and dlcalloc() when called before relocation, directly calling the simple malloc functions instead. Co-developed-by: Claude Opus 4.5 Signed-off-by: Simon Glass --- common/dlmalloc.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/common/dlmalloc.c b/common/dlmalloc.c index 62e1e0a77da..5069a95d9b3 100644 --- a/common/dlmalloc.c +++ b/common/dlmalloc.c @@ -5984,6 +5984,15 @@ static const char *mcheck_caller(void) void *dlmalloc(size_t bytes) { + /* + * Skip mcheck for simple malloc (pre-relocation). Simple malloc is a + * bump allocator that can't free, so mcheck overhead is useless and + * wastes the limited pre-relocation heap space. + */ + if (CONFIG_IS_ENABLED(SYS_MALLOC_F) && + !(gd->flags & GD_FLG_FULL_MALLOC_INIT)) + return malloc_simple(bytes); + mcheck_pedantic_prehook(); size_t fullsz = mcheck_alloc_prehook(bytes); void *p = dlmalloc_impl(fullsz CALLER_NULL); @@ -5993,7 +6002,15 @@ void *dlmalloc(size_t bytes) return mcheck_alloc_posthook(p, bytes, mcheck_caller()); } -void dlfree(void *mem) { dlfree_impl(mcheck_free_prehook(mem)); } +void dlfree(void *mem) +{ + if (CONFIG_IS_ENABLED(SYS_MALLOC_F) && + !(gd->flags & GD_FLG_FULL_MALLOC_INIT)) { + dlfree_impl(mem); + return; + } + dlfree_impl(mcheck_free_prehook(mem)); +} void *dlrealloc(void *oldmem, size_t bytes) { @@ -6020,6 +6037,10 @@ void *dlrealloc(void *oldmem, size_t bytes) void *dlmemalign(size_t alignment, size_t bytes) { + if (CONFIG_IS_ENABLED(SYS_MALLOC_F) && + !(gd->flags & GD_FLG_FULL_MALLOC_INIT)) + return memalign_simple(alignment, bytes); + mcheck_pedantic_prehook(); size_t fullsz = mcheck_memalign_prehook(alignment, bytes); void *p = dlmemalign_impl(alignment, fullsz); @@ -6033,6 +6054,16 @@ void *dlmemalign(size_t alignment, size_t bytes) void *dlcalloc(size_t n, size_t elem_size) { + if (CONFIG_IS_ENABLED(SYS_MALLOC_F) && + !(gd->flags & GD_FLG_FULL_MALLOC_INIT)) { + size_t sz = n * elem_size; + void *p = malloc_simple(sz); + + if (p) + memset(p, '\0', sz); + return p; + } + mcheck_pedantic_prehook(); /* NB: no overflow check here */ size_t fullsz = mcheck_alloc_prehook(n * elem_size);