From patchwork Wed Feb 1 16:26:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: tip-bot2 for Thomas Gleixner X-Patchwork-Id: 51462 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp376434wrn; Wed, 1 Feb 2023 08:30:24 -0800 (PST) X-Google-Smtp-Source: AK7set8f16SQza5HdWoPKNpgu39YhbhTZxG+qNoS3XaZ3iwYchF4Xvr7kHQpOF+ntUgob0VRHqWx X-Received: by 2002:a17:902:f392:b0:192:e4cf:ca64 with SMTP id f18-20020a170902f39200b00192e4cfca64mr2610765ple.28.1675269024043; Wed, 01 Feb 2023 08:30:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675269024; cv=none; d=google.com; s=arc-20160816; b=O/lL6uOt+xqHbzbSUAZzUzbwSQKBUbFM8HYI3WhBcLIIgsvgH5pUNep1ijNqPUYdgI s8Zbgn+vINLuNKSg7R1BoHw/GrrBHn/mAX8HaN5O0wDAdnQtsGe4HAUp4p5w90eMaSss sH+GA4NPw3BkzsB2vpXvBsE5VT55A6bRwA5vVPbuUjd1imhPgqWKg7d2y4RdERFMCc9K 3uCBEhPlZEUs/cVEXLq330QwoXo/vE9sE+hHQxtd2ob4VQL9pGewoP7kuyMTIbI4GJy4 C6a328BZ/NqNS023h4LRCeTx9o+73SRjkMS7yXO9FLwwTvz+Tk+OJfLNDkRHhgRue7WW OvkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:robot-unsubscribe :robot-id:message-id:mime-version:references:in-reply-to:cc:subject :to:reply-to:sender:from:dkim-signature:dkim-signature:date; bh=B4+9MRjbyPryliST4ziNeaeRQFdwuN+gN5p3+U2wj38=; b=HcI7dvCwo+wPD6+IZpEq3pRP4txezE2VeQXlKwVv34kKz4ZCHahXtVQZKvmo2nyH47 iygKiPlcwUyE2hfpOhrpfUku+EwciTTQaqQFJHnMbuk6aFKvHto6g7G/E1oyrAIlmstl XS9TM4fUIvEsdWRT6R8N0niVP/PN224fr7Akbj8FmcIpqxpW0X4bTVTL1d/uAFFQqypM x4P+4Oe+TKSjr2lGzASHX1B0RFHuswhZnAZRj/l9NVS/eqd03LCDj7m4vKhFXjbiALCL nvMasSxn9nRvllg/LupuCIf5NBSNr9OgB+/oB7UJ+eYtrEOWgIQs/+qxO3DeSZ42Ri+7 7Pdg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=Ld+U2Qyv; dkim=neutral (no key) header.i=@linutronix.de; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n3-20020a170903110300b0019515ca627fsi22269871plh.422.2023.02.01.08.30.11; Wed, 01 Feb 2023 08:30:24 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=Ld+U2Qyv; dkim=neutral (no key) header.i=@linutronix.de; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232193AbjBAQ0s (ORCPT + 99 others); Wed, 1 Feb 2023 11:26:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59496 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230460AbjBAQ0i (ORCPT ); Wed, 1 Feb 2023 11:26:38 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 78AFE77521; Wed, 1 Feb 2023 08:26:35 -0800 (PST) Date: Wed, 01 Feb 2023 16:26:33 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1675268794; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=B4+9MRjbyPryliST4ziNeaeRQFdwuN+gN5p3+U2wj38=; b=Ld+U2QyvY2hvxwW6GT3bRuzPWlUlL9AZRwuxKhpJsoHOwJmyxhLnKkAEwdEDO+srzwqM8e CSaeJzRa8eEX9kgKK/CcYx6gPReBFXRXLbjBgg/9IahIfJE2fyZx9ExC7K6l/DmFd+odtS cQU/3DnnGXyq+TGtVOfsQbYIbX/k2wz3HnCBch3Ui/+RTIjeBaU4xdY+cltnf68DNw/9Cv Zim8vQXuRrlNpanjp/3hubybt7J6WLAo+DHgV3I0dBV7XgHs+sNR2jGXICsEX4UAgaL/n7 4JDRCV1rIthr9dsTKSC/U6VzRsWk7TeDcG8DFbx9MkS6QLRI6f+o8CN55ediTw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1675268794; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=B4+9MRjbyPryliST4ziNeaeRQFdwuN+gN5p3+U2wj38=; b=EpRgPDDP2nOUSBe8Cc2XTQ4/p8HAPjkL0NHBVbs+f0GOpZWgKM6VXL4iB7ebGXAXEIelBv ENPD7mKY0iXRRlDA== From: tip-bot2 for Thomas =?utf-8?q?Wei=C3=9Fschuh?= Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: objtool/core] objtool: Allocate multiple structures with calloc() Cc: linux@weissschuh.net, Josh Poimboeuf , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20221216-objtool-memory-v2-3-17968f85a464@weissschuh.net> References: <20221216-objtool-memory-v2-3-17968f85a464@weissschuh.net> MIME-Version: 1.0 Message-ID: <167526879371.4906.8334879167449880399.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756646891905549620?= X-GMAIL-MSGID: =?utf-8?q?1756646891905549620?= The following commit has been merged into the objtool/core branch of tip: Commit-ID: 389244804db54977b9316f0dc027ab69b3c1e8bf Gitweb: https://git.kernel.org/tip/389244804db54977b9316f0dc027ab69b3c1e8bf Author: Thomas Weißschuh AuthorDate: Tue, 27 Dec 2022 16:00:59 Committer: Josh Poimboeuf CommitterDate: Mon, 30 Jan 2023 16:28:19 -08:00 objtool: Allocate multiple structures with calloc() By using calloc() instead of malloc() in a loop, libc does not have to keep around bookkeeping information for each single structure. This reduces maximum memory usage while processing vmlinux.o from 3153325 KB to 3035668 KB (-3.7%) on my notebooks "localmodconfig". Note this introduces memory leaks, because some additional structs get added to the lists later after reading the symbols and sections from the original object. Luckily we don't really care about memory leaks in objtool. Signed-off-by: Thomas Weißschuh Link: https://lore.kernel.org/r/20221216-objtool-memory-v2-3-17968f85a464@weissschuh.net Signed-off-by: Josh Poimboeuf --- tools/objtool/elf.c | 42 ++++++++++++++-------------- tools/objtool/include/objtool/elf.h | 4 +++- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index 64443a7..6806ce0 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -284,13 +284,13 @@ static int read_sections(struct elf *elf) !elf_alloc_hash(section_name, sections_nr)) return -1; + elf->section_data = calloc(sections_nr, sizeof(*sec)); + if (!elf->section_data) { + perror("calloc"); + return -1; + } for (i = 0; i < sections_nr; i++) { - sec = malloc(sizeof(*sec)); - if (!sec) { - perror("malloc"); - return -1; - } - memset(sec, 0, sizeof(*sec)); + sec = &elf->section_data[i]; INIT_LIST_HEAD(&sec->symbol_list); INIT_LIST_HEAD(&sec->reloc_list); @@ -422,13 +422,13 @@ static int read_symbols(struct elf *elf) !elf_alloc_hash(symbol_name, symbols_nr)) return -1; + elf->symbol_data = calloc(symbols_nr, sizeof(*sym)); + if (!elf->symbol_data) { + perror("calloc"); + return -1; + } for (i = 0; i < symbols_nr; i++) { - sym = malloc(sizeof(*sym)); - if (!sym) { - perror("malloc"); - return -1; - } - memset(sym, 0, sizeof(*sym)); + sym = &elf->symbol_data[i]; sym->idx = i; @@ -918,13 +918,13 @@ static int read_relocs(struct elf *elf) sec->base->reloc = sec; nr_reloc = 0; + sec->reloc_data = calloc(sec->sh.sh_size / sec->sh.sh_entsize, sizeof(*reloc)); + if (!sec->reloc_data) { + perror("calloc"); + return -1; + } for (i = 0; i < sec->sh.sh_size / sec->sh.sh_entsize; i++) { - reloc = malloc(sizeof(*reloc)); - if (!reloc) { - perror("malloc"); - return -1; - } - memset(reloc, 0, sizeof(*reloc)); + reloc = &sec->reloc_data[i]; switch (sec->sh.sh_type) { case SHT_REL: if (read_rel_reloc(sec, i, reloc, &symndx)) @@ -1453,16 +1453,16 @@ void elf_close(struct elf *elf) list_for_each_entry_safe(sym, tmpsym, &sec->symbol_list, list) { list_del(&sym->list); hash_del(&sym->hash); - free(sym); } list_for_each_entry_safe(reloc, tmpreloc, &sec->reloc_list, list) { list_del(&reloc->list); hash_del(&reloc->hash); - free(reloc); } list_del(&sec->list); - free(sec); + free(sec->reloc_data); } + free(elf->symbol_data); + free(elf->section_data); free(elf); } diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/objtool/elf.h index bb60fd4..1c90f0a 100644 --- a/tools/objtool/include/objtool/elf.h +++ b/tools/objtool/include/objtool/elf.h @@ -39,6 +39,7 @@ struct section { char *name; int idx; bool changed, text, rodata, noinstr, init, truncate; + struct reloc *reloc_data; }; struct symbol { @@ -104,6 +105,9 @@ struct elf { struct hlist_head *section_hash; struct hlist_head *section_name_hash; struct hlist_head *reloc_hash; + + struct section *section_data; + struct symbol *symbol_data; }; #define OFFSET_STRIDE_BITS 4