From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 66C84C79F82 for ; Tue, 8 Sep 2026 20:57:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References:Message-Id :MIME-Version:Subject:Date:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=3jnAGn9LRXkGZjqS2hr0p8ptDJtxFat23eEiC44XD4U=; b=sGDlMaIA6aoxkW 6IKOoHEj1TpGNJCa5Iu1RUrNzR8cZqQuIciK2l2UevjlUXkjUTHS/kXhO6dipeY3kPb4lRE1I8btk rusMu/qMS3fto2e6lOQaEo33sxpUki+ihjQSxobCQqGNH20yx0Iv093dPHalRXkeV80f1YilebYUR qQmrbU4rXCLYjhuZ6JSPXxSPWkKkipJi4rj/DUVn+C42rirTAsUWaTySyGfiXOusXq6PCJSrR3pbD 3yHeAlw8nJADl1W7WcNw8xFte8k7TYEXTo4UaAhYqAL4T7fQ0atOudhBSkMfha1CTdnV2sSiF0C1a 6K4gL6wJqwGBT54fU6Xw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x42sh-0000000AFWu-0QmN; Tue, 08 Sep 2026 20:57:27 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1x42sf-0000000AFVn-1sFc; Tue, 08 Sep 2026 20:57:25 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 345E0419D6; Tue, 8 Sep 2026 20:57:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4FC6D1F00A3A; Tue, 8 Sep 2026 20:57:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788901045; bh=Zp+1QGtqTWMKHztfUixkIr/p7k1hkTe9DSbsity3M/E=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=EUt/Q2g+NKaQ6S9lFZONrRdJapaT1x9rVJ0A9T48zaQRh1S544VNiCfglDSAJxYOe 0VJfwfGqdWhSMhOtk3C+HRU0yiUsplApEb3u1NGmEb/A447ROZaiCvc7jGZJSxxQ0i 57CIJfVZLHcZ2u8R4p7iBirtj7QRoylDHEfSmUnJ25duqw5thHuFFDqwSgasODWmYe KhqeJ7XNBet3kWpmY8O6OQOUthcFVEZiFWdFZ0mhrigAf1m3KihCiOekibd8CjQekA /B+299FwQ65IAfJ02Mme2/7KTRNgDDpVdxacj6iHcv/EfqS1JiQXdrk8q1fk02QGli 4vfQMWnG3EfdQ== From: "Lorenzo Stoakes (ARM)" Date: Tue, 08 Sep 2026 21:55:10 +0100 Subject: [PATCH 10/23] kbuild: cache list, composite object state per object MIME-Version: 1.0 Message-Id: <20260908-build-speedup-v1-10-5dc1ac01672d@kernel.org> References: <20260908-build-speedup-v1-0-5dc1ac01672d@kernel.org> In-Reply-To: <20260908-build-speedup-v1-0-5dc1ac01672d@kernel.org> To: Linus Torvalds , Nathan Chancellor , Nicolas Schier , Nick Desaulniers , Bill Wendling , Justin Stitt , Masahiro Yamada , Alexey Gladkov , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Arnd Bergmann , Catalin Marinas , Will Deacon , Mark Rutland , Ard Biesheuvel , Ilias Apalodimas , Josh Poimboeuf , Peter Zijlstra , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Jonathan Corbet , Randy Dunlap Cc: linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, llvm@lists.linux.dev, linux-riscv@lists.infradead.org, linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-efi@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, Jens Axboe , "Lorenzo Stoakes (ARM)" X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3457; i=ljs@kernel.org; h=from:subject:message-id; bh=TtGzRcvdpH1o/Q/maX3eAqRdjLYh9rcQLyvEGgPc5lo=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLIWlJlf+Pln5qwZhy76pPI49jarLjh5M5ZvurHztdCMS SsP9jy71lHKwiDGxSArpsjy/Iv4/iCRsHmdF/zdYOawMoEMYeDiFICJ/HjByHAyt/PJ57JakwfH fQXXqjz6pHfwseSa+DMnwn5m//vOn83HyHB+Thzvs+ALT57z2jRyv/Uq6tktxSN/0PrlyzLbFT9 2nGEAAA== X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org When each object's command line is expanded, kbuild has to figure out on multiple occasions whether it's built-in or part of a module and which composite object it belongs to. This causes the time spent on each directory in the kernel tree to grow O(n^2) with its object count, which is especially problematic for instance in drivers/gpu/drm/amd/amdgpu with 310 objects. No-op builds (i.e. make -j $(nproc) when nothing has changed) are particularly impacted by this. Fix the issue by caching this data and looking it up instead of getting it over and over again. This has a particularly large impact on allmodconfig builds. Whole build, 128-thread Threadripper 9980X, best of N runs: before after delta ------------------------------- x86 defconfig, no-op make, gcc 0.94s 0.92s -0.02s (-2%) x86 defconfig, no-op make, clang 1.1s 1.1s -0.01s (-1%) x86 allmodconfig, no-op make, gcc 13.0s 12.3s -0.64s (-5%) x86 allmodconfig, no-op make, clang 13.8s 13.2s -0.64s (-5%) x86 allmodconfig, touch mm/vma.c, gcc 41.6s 40.9s -0.70s (-2%) x86 allmodconfig, touch mm/vma.c, clang 38.1s 37.6s -0.52s (-1%) Assisted-by: LLM Signed-off-by: Lorenzo Stoakes (ARM) --- scripts/Makefile.build | 8 ++++++++ scripts/Makefile.lib | 7 +++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 4349108e75e1..2cabfe85b798 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -122,6 +122,14 @@ multi-obj-m := $(addprefix $(obj)/, $(multi-obj-m)) subdir-ym := $(addprefix $(obj)/, $(subdir-ym)) endif +# Cache which list each object is in and which composite objects it belongs to, +# once per object for $(part-of-builtin), $(part-of-module) and $(modname-multi). +$(foreach o, $(real-obj-y) $(lib-y), $(eval part-of-builtin_$o := y)) +$(foreach o, $(real-obj-m), $(eval part-of-module_$o := y)) +$(foreach m, $(multi-obj-ym), \ + $(foreach o, $(call suffix-search, $m, .o, -objs -y -m), \ + $(eval modname-multi_$o += $(m:.o=)))) + ifndef obj $(warning kbuild: Makefile.build is included improperly) endif diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 0a4fdd8bd975..2f447bc25e7b 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -2,8 +2,7 @@ # Finds the multi-part object the current object will be linked into. # If the object belongs to two or more multi-part objects, list them all. -modname-multi = $(sort $(foreach m,$(multi-obj-ym),\ - $(if $(filter $*.o, $(call suffix-search, $m, .o, -objs -y -m)),$(m:.o=)))) +modname-multi = $(sort $(modname-multi_$*.o)) __modname = $(or $(modname-multi),$(basetarget)) @@ -149,8 +148,8 @@ endif # If $(is-kernel-object) is 'y', this object will be linked to vmlinux or modules is-kernel-object = $(or $(part-of-builtin),$(part-of-module)) -part-of-builtin = $(if $(filter $(basename $@).o, $(real-obj-y) $(lib-y)),y) -part-of-module = $(if $(filter $(basename $@).o, $(real-obj-m)),y) +part-of-builtin = $(part-of-builtin_$(basename $@).o) +part-of-module = $(part-of-module_$(basename $@).o) quiet_modtag = $(if $(part-of-module),[M], ) modkern_cflags = \ -- 2.55.0 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv