From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793816448; b=zfhKWVmYgK29DNhqsqXU+byXzbYt4sAgEnF+a/dbtnRyqefhvH/0xGGyfjD2g1TXdVmh ErwNZEA1ByMQUbU0znbbSdsAtJz7YeDatYcZK0+HOFpURq95vwPd0UyBMP6+1Il5wB2eM 6R79M0Hlz0PVEatH6xmWbWkkqxZi7U1KxD42NMpM8TS8JoFo0kbJb+o+1xknYNw8Vk5Tg tfVFTRC5XPOERd4mDhTvRLQojs5Y373xGBGcLFov9nVPREXrrvdAQUn8QVk5KJCKRhKP9 IcRgqpKBTM1dlOGstix+mup7uwvsblgXP0umMGA5Y/ZgxBH/MZimBfVJqu6FDkbkiBw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793816448; h=Received:DKIM-Signature:From:Date:Subject:MIME-Version:Content-Type: Content-Transfer-Encoding:Message-Id:References:In-Reply-To:To:Cc: X-Mailer:X-Developer-Signature:X-Developer-Key; bh=6g309lbgrjn1xo7S7Qg30lg+sesaJzFdJJRQn0HeciQ=; b=Cb5ZlXuVwWozftY/E1C/DM68ypIw8ad8y5cYMJkqF9U+dQaFuavamGibfmgsz2DHyZZb WEEt0HykuYvzXbrt6hzxHxVZS67oOp96dlrStmY9QuIvhnNmZn9+DGsIfBIhbQgDt2OU0 S4L7zEN1Tuk+frp3bOpNV119FNGkHTUhsT6j2qnKYf3CuDLsaOoTrjCXW+d8z/OSljWiG UUqATqPjQ8pnN6Hb/kGGbivFf3GXK9GzpPI4sTW4VP+hoy+l/hIJm/QvIzWn44n8OEEK/ zkMVsDsWJJq+kweJM+40WEnIMWqZHAPS5zgoHixi2M+s6jeWWRMmpwMjYoMVlm9o7yA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=WO9YXiyF; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 399F8606A32C; Wed, 4 Nov 2026 18:20:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=WO9YXiyF Received: by smtp.kernel.org (Postfix) with ESMTPSA id A76651F00919; Wed, 4 Nov 2026 18:20:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793816447; bh=6g309lbgrjn1xo7S7Qg30lg+sesaJzFdJJRQn0HeciQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=WO9YXiyF9tYltRZHW+0ChWCqG/bjdRvuKguJubpmiRX7latYpOeUWOptwFj27nTx8 fz55YXZOftfJnEQgpn7dBv6wZIkqUJSzH3oLHWe7qUvf2SKDO5LRZfS8OrqJQrimnz AFFXtYmvlb75LMrGD5P4BY+MxVIWRCcgieq3nnzbX+pIwEIsbE5KNW6xRllAxCzk48 WimC62c5uVhpVXcEe9BPNTMIONtBro4tt5eUFuo/G+ZYADpTmTFCnISkVaTdvl2gqS WorgASYhze7DJcwhX2ciapWrwixqVJozZLrhSj2Q8wLb050Fj+xkrRTnJ3+caYN2gy sna5x3I1Jt2sA== From: "Lorenzo Stoakes (ARM)" Date: Wed, 04 Nov 2026 18:20:19 +0000 Subject: [PATCH v5 01/11] kbuild: calculate list, composite object state per object X-Mailing-List: linux-modules@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261104-build-speedup-v5-1-0f6018be8dae@kernel.org> References: <20261104-build-speedup-v5-0-0f6018be8dae@kernel.org> In-Reply-To: <20261104-build-speedup-v5-0-0f6018be8dae@kernel.org> To: Linus Torvalds , Nathan Chancellor , Nicolas Schier , Nick Desaulniers , Bill Wendling , Justin Stitt , Geert Uytterhoeven , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , 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?= Cc: ljs@kernel.org, linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, llvm@lists.linux.dev, linux-m68k@lists.linux-m68k.org, linux-modules@vger.kernel.org, rust-for-linux@vger.kernel.org, Nicolas Schier , Kees Cook X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3555; i=ljs@kernel.org; h=from:subject:message-id; bh=L0mXwIfHKqIgNhyape3/3FrLOaLztN+izspx78XSqYE=; b=owGbwMvMwCV2fu7ZrsZH9SKMp9WSGLJel+dkL7xqJfv/np4m85Qlwt65HIb+vOpcHUnHWNcbr fxQfEO7o5SFQYyLQVZMkeX5F/H9QSJh8zov+LvBzGFlAhnCwMUpABOJNWNkmCIgdNh9Wcbl3teZ gvliunn+RtqSu6pKJX5MOvCsc91Xf0aGy08dslOXOpxn4FjY+6zul8FGgUjuNwWmyWsMr0/6esO cBQA= X-Developer-Key: i=ljs@kernel.org; a=openpgp; fpr=E7F417BF5214569E89D04F46CF9DCD8A81E27F14 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 calculating this data once and looking it up thereafter instead of recomputing 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 1.1s 1.1s -0.02s (-2%) x86 defconfig, no-op make, clang 1.3s 1.3s -0.01s (-1%) x86 allmodconfig, no-op make, gcc 15.3s 14.5s -0.83s (-5%) x86 allmodconfig, no-op make, clang 16.2s 15.5s -0.65s (-4%) x86 allmodconfig, touch mm/vma.c, gcc 35.0s 34.3s -0.77s (-2%) x86 allmodconfig, touch mm/vma.c, clang 33.7s 33.2s -0.51s (-2%) Reviewed-by: Nicolas Schier Reviewed-by: Kees Cook 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 6127feb970c6..bbe9555c47a8 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 19e96b30a122..8936925d4d50 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.56.0