From patchwork Fri Mar 15 12:24:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 87243 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 060C83857013 for ; Fri, 15 Mar 2024 12:26:20 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by sourceware.org (Postfix) with ESMTPS id AF1543858416 for ; Fri, 15 Mar 2024 12:24:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AF1543858416 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org AF1543858416 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::635 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710505473; cv=none; b=VBKQnBHuq+Ih0N3MkAi0YfMtiHkKifPh3ABg05lvhh1lu/UqU0SHsOjDEZSlpeNBWPn/73uhqvrCSDxPOqxid3v5Y+Ez+CIWF+ecD5FIpjKCQoN08ofe5K+Gc7C/mG4nx9Lbu+bNDaoCbVrC99ATZPem+nbBbz9fwy9xYCTIdEs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710505473; c=relaxed/simple; bh=UGYdpfo91LFO3Xw1UH2k1Ncn8vEigZGI7lZZNctGAPc=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=samq/6sWFiWzwMNEjf6loqT0CkFplqTRYbjXGi+B9oxyovBSbxJ+BlgRkMUZXphAzdyu4dnGWEd2bCyRRwebgw7+iYsdvc+TKnS7dTl8NVq5/9RoJICKGWrCnsn0/urIt39vRVdFT7RX4ju08cTbMTfxDCFMHCObRZIF29Ie79k= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-1dca3951ad9so14582975ad.3 for ; Fri, 15 Mar 2024 05:24:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710505465; x=1711110265; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jYg/paNegawZNW6w5LmDcI67brT6zIfhOxiHJZbT5ss=; b=IFJuBdTOThDnsVHIyxjum33OBpnLA9ZIAHSginjj4i8IhzZ4v78mwA5+u/UDlH9OU5 RanD8FDMy5vF1xXf37v1qsT9Qr2wvEA12fWBmpQ8G1Rriyp2XVjLMLdK2MOWOuM6vsOT pxx5ncL3Qs4vaG4GF6J35U7E8WIAtNsdH2miDk89BeT+S4p2GTWOSDGQGBFT31qmT3ta xE1btRpcY7yUrAlzKjAhK+N8Zj4/BGlDF5ItgnAIyyyPi6Hn3iU+Py2IrQ7H5y0Nx/PB d5dV7IfHBfkwSOUOHHmrSoD2TK/4cSbkGl+zRZ14Y5mnWlHux6EviPCVhZEF5KlW4ecF HolQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710505465; x=1711110265; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jYg/paNegawZNW6w5LmDcI67brT6zIfhOxiHJZbT5ss=; b=AENbjPTprDCRiA5P8S3vaoMYXLfKiGgOc5KHLvxCEncfV0gMmIfSoh11YWl0uHnBwM /RcXUF9uWfcMyicxUtT9bZ5DZbEb0l/0rB4EFO5UcxuVNkPe2nepJJ5a7qblJIDCxhRI g2evJjScjzdqlvwTeb9liOWkWj3TdZ+i6mNTwLYeYdxf0wumi0PoRoCGK6UaU173AlDy 0+LrSZyDGkdlUlbTE/JhmY/lumy+5IMoUjvHCZNsZ9zDO/ZJIXQ7cqo4+k6Ed/2rXPDp 4+PDQV44fG2IXxXeaB7NDp9b1IeWI2mUgTSrUTmFcE7QCFGKisYl+eWPU2xQEO1P4/Op bB/w== X-Gm-Message-State: AOJu0Yy1CVmQHJ75V4zIrV7MPUj/mL1io3EZOmCm+Ycu3SuDEiKfPplZ q9H761PKT9jRlVEZ7S9AFNFZRwliIp7SlaLQLptqxTZndvbgT6oh X-Google-Smtp-Source: AGHT+IEJM0tY6OxFu6KNmd9T0kKKnS9/sjnPZSjykZcHAiqP1PxP9sH53hxQeUNGoTlIW76rbN0zhg== X-Received: by 2002:a17:902:7c90:b0:1de:ea06:629f with SMTP id y16-20020a1709027c9000b001deea06629fmr2357633pll.51.1710505465599; Fri, 15 Mar 2024 05:24:25 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.58.89.72]) by smtp.gmail.com with ESMTPSA id w15-20020a1709026f0f00b001dd8ee1d7dfsm3739192plk.126.2024.03.15.05.24.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Mar 2024 05:24:24 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id AA60574066D; Fri, 15 Mar 2024 05:24:23 -0700 (PDT) From: "H.J. Lu" To: binutils@sourceware.org Cc: goldstein.w.n@gmail.com, sam@gentoo.org, amodra@gmail.com Subject: [PATCH v11 4/6] elf: Don't cache symbol nor relocation tables with mmap Date: Fri, 15 Mar 2024 05:24:21 -0700 Message-ID: <20240315122423.1963285-5-hjl.tools@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240315122423.1963285-1-hjl.tools@gmail.com> References: <20240315122423.1963285-1-hjl.tools@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3020.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_SBL_CSS, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces+patchwork=sourceware.org@sourceware.org During a "-j 8" LLVM 17 debug build on a machine with 32GB RAM and 16GB swap, ld was killed by kernel because of out of memory: [79437.949336] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-9.scope,task=ld,pid=797431,uid=1000 [79437.949349] Out of memory: Killed process 797431 (ld) total-vm:9219600kB, anon-rss:6558156kB, file-rss:1792kB, shmem-rss:0kB, UID:1000 pgtables:17552kB oom_score_adj:0 Don't cache symbol nor relocation tables if they are mapped in. Data to link the 3.5GB clang executable in LLVM 17 debug build on Linux/x86-64 with 32GB RAM is: stdio mmap improvement user 86.73 87.02 -0.3% system 9.55 9.21 3.6% total 100.40 97.66 0.7% maximum set(GB) 17.34 13.14 24% page faults 4047667 3042877 25% and data to link the 275M cc1plus executable in GCC 14 stage 1 build is: user 5.41 5.44 -0.5% system 0.80 0.76 5% total 6.25 6.26 -0.2% maximum set(MB) 1323 968 27% page faults 323451 236371 27% These improve the overall system performance for parallel build by reducing memory usage and page faults. Also rename _bfd_link_keep_memory to _bfd_elf_link_keep_memory. Since the --no-keep-memory linker option causes: https://sourceware.org/bugzilla/show_bug.cgi?id=31458 this is opt-in by each backend. bfd/ * elf-bfd.h (_bfd_elf_link_keep_memory): New. * elf32-i386.c (elf_i386_scan_relocs): Replace _bfd_link_keep_memory with _bfd_elf_link_keep_memory. * elf64-x86-64.c (elf_x86_64_scan_relocs): Likewise. * elflink.c (_bfd_elf_link_iterate_on_relocs): Likewise. (elf_link_add_object_symbols): Likewise. (init_reloc_cookie): Likewise. (init_reloc_cookie_rels): Likewise. (_bfd_elf_link_keep_memory): New. * libbfd-in.h (_bfd_link_keep_memory): Removed. * linker.c (_bfd_link_keep_memory): Likewise. * libbfd.h: Regenerated. --- bfd/elf-bfd.h | 3 ++ bfd/elf32-i386.c | 2 +- bfd/elf64-x86-64.c | 2 +- bfd/elflink.c | 69 ++++++++++++++++++++++++++++++++++++++-------- bfd/libbfd-in.h | 3 -- bfd/libbfd.h | 3 -- bfd/linker.c | 35 ----------------------- 7 files changed, 62 insertions(+), 55 deletions(-) diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index e7c2cd19bed..b9ec590cd4e 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -3144,6 +3144,9 @@ extern bool _bfd_elf_mmap_section_contents extern void _bfd_elf_munmap_section_contents (asection *, void *); +extern bool _bfd_elf_link_keep_memory + (struct bfd_link_info *); + /* Large common section. */ extern asection _bfd_elf_large_com_section; diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 0f963c373be..d1bd11094de 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1932,7 +1932,7 @@ elf_i386_scan_relocs (bfd *abfd, if (elf_section_data (sec)->this_hdr.contents != contents) { - if (!converted && !_bfd_link_keep_memory (info)) + if (!converted && !_bfd_elf_link_keep_memory (info)) _bfd_elf_munmap_section_contents (sec, contents); else { diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 2e3f86840e5..5e1fad069d1 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2590,7 +2590,7 @@ elf_x86_64_scan_relocs (bfd *abfd, struct bfd_link_info *info, if (elf_section_data (sec)->this_hdr.contents != contents) { - if (!converted && !_bfd_link_keep_memory (info)) + if (!converted && !_bfd_elf_link_keep_memory (info)) _bfd_elf_munmap_section_contents (sec, contents); else { diff --git a/bfd/elflink.c b/bfd/elflink.c index 9162df60bfa..877bb9874ae 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -4182,10 +4182,9 @@ _bfd_elf_link_iterate_on_relocs || bfd_is_abs_section (o->output_section)) continue; - internal_relocs = _bfd_elf_link_info_read_relocs (abfd, info, - o, NULL, - NULL, - _bfd_link_keep_memory (info)); + internal_relocs = _bfd_elf_link_info_read_relocs + (abfd, info, o, NULL, NULL, + _bfd_elf_link_keep_memory (info)); if (internal_relocs == NULL) return false; @@ -5551,10 +5550,9 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) && (s->flags & SEC_DEBUGGING) != 0)) continue; - internal_relocs = _bfd_elf_link_info_read_relocs (abfd, info, - s, NULL, - NULL, - _bfd_link_keep_memory (info)); + internal_relocs = _bfd_elf_link_info_read_relocs + (abfd, info, s, NULL, NULL, + _bfd_elf_link_keep_memory (info)); if (internal_relocs == NULL) goto error_free_vers; @@ -13614,7 +13612,7 @@ init_reloc_cookie (struct elf_reloc_cookie *cookie, info->callbacks->einfo (_("%P%X: can not read symbols: %E\n")); return false; } - if (_bfd_link_keep_memory (info) ) + if (_bfd_elf_link_keep_memory (info) ) { symtab_hdr->contents = (bfd_byte *) cookie->locsyms; info->cache_size += (cookie->locsymcount @@ -13651,9 +13649,9 @@ init_reloc_cookie_rels (struct elf_reloc_cookie *cookie, } else { - cookie->rels = _bfd_elf_link_info_read_relocs (abfd, info, sec, - NULL, NULL, - _bfd_link_keep_memory (info)); + cookie->rels = _bfd_elf_link_info_read_relocs + (abfd, info, sec, NULL, NULL, + _bfd_elf_link_keep_memory (info)); if (cookie->rels == NULL) return false; cookie->rel = cookie->rels; @@ -15583,3 +15581,50 @@ _bfd_elf_add_dynamic_tags (bfd *output_bfd, struct bfd_link_info *info, return true; } + +/* Return false if linker should avoid caching relocation information + and symbol tables of input files in memory. */ + +bool +_bfd_elf_link_keep_memory (struct bfd_link_info *info) +{ +#ifdef USE_MMAP + /* Don't cache symbol nor relocation tables if they are mapped in. + NB: Since the --no-keep-memory linker option causes: + + https://sourceware.org/bugzilla/show_bug.cgi?id=31458 + + this is opt-in by each backend. */ + const struct elf_backend_data *bed + = get_elf_backend_data (info->output_bfd); + if (bed->use_mmap) + return false; +#endif + bfd *abfd; + bfd_size_type size; + + if (!info->keep_memory) + return false; + + if (info->max_cache_size == (bfd_size_type) -1) + return true; + + abfd = info->input_bfds; + size = info->cache_size; + do + { + if (size >= info->max_cache_size) + { + /* Over the limit. Reduce the memory usage. */ + info->keep_memory = false; + return false; + } + if (!abfd) + break; + size += abfd->alloc_size; + abfd = abfd->link.next; + } + while (1); + + return true; +} diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index 889b221a950..7bfc58f12d8 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -848,9 +848,6 @@ extern bfd_byte * _bfd_write_unsigned_leb128 extern struct bfd_link_info *_bfd_get_link_info (bfd *) ATTRIBUTE_HIDDEN; -extern bool _bfd_link_keep_memory (struct bfd_link_info *) - ATTRIBUTE_HIDDEN; - extern uintptr_t _bfd_pagesize ATTRIBUTE_HIDDEN; extern uintptr_t _bfd_pagesize_m1 ATTRIBUTE_HIDDEN; extern uintptr_t _bfd_minimum_mmap_size ATTRIBUTE_HIDDEN; diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 876c1f223c7..36fe6c0ebd0 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -854,9 +854,6 @@ extern bfd_byte * _bfd_write_unsigned_leb128 extern struct bfd_link_info *_bfd_get_link_info (bfd *) ATTRIBUTE_HIDDEN; -extern bool _bfd_link_keep_memory (struct bfd_link_info *) - ATTRIBUTE_HIDDEN; - extern uintptr_t _bfd_pagesize ATTRIBUTE_HIDDEN; extern uintptr_t _bfd_pagesize_m1 ATTRIBUTE_HIDDEN; extern uintptr_t _bfd_minimum_mmap_size ATTRIBUTE_HIDDEN; diff --git a/bfd/linker.c b/bfd/linker.c index 36cca9624c2..eb42a78b622 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -3556,38 +3556,3 @@ _bfd_nolink_bfd_define_start_stop (struct bfd_link_info *info ATTRIBUTE_UNUSED, { return (struct bfd_link_hash_entry *) _bfd_ptr_bfd_null_error (sec->owner); } - -/* Return false if linker should avoid caching relocation infomation - and symbol tables of input files in memory. */ - -bool -_bfd_link_keep_memory (struct bfd_link_info * info) -{ - bfd *abfd; - bfd_size_type size; - - if (!info->keep_memory) - return false; - - if (info->max_cache_size == (bfd_size_type) -1) - return true; - - abfd = info->input_bfds; - size = info->cache_size; - do - { - if (size >= info->max_cache_size) - { - /* Over the limit. Reduce the memory usage. */ - info->keep_memory = false; - return false; - } - if (!abfd) - break; - size += abfd->alloc_size; - abfd = abfd->link.next; - } - while (1); - - return true; -}