On Tue, Apr 14, 2026 at 1:34 PM Nathan Chancellor <[email protected]> wrote: > > On Fri, Apr 10, 2026 at 03:13:29PM +0200, Petr Pavlu wrote: > > Commit 5f9ae91f7c0d ("kbuild: Build kernel module BTFs if BTF is enabled > > and pahole supports it") in 2020 introduced CONFIG_DEBUG_INFO_BTF_MODULES > > to enable generation of split BTF for kernel modules. This change required > > the %.ko Makefile rule to additionally depend on vmlinux, which is used as > > a base for deduplication. The regular ld_ko_o command executed by the rule > > was then modified to be skipped if only vmlinux changes. This was done by > > introducing a new if_changed_except command and updating the original call > > to '+$(call if_changed_except,ld_ko_o,vmlinux)'. > > > > Later, commit 214c0eea43b2 ("kbuild: add $(objtree)/ prefix to some > > in-kernel build artifacts") in 2024 updated the rule's reference to vmlinux > > from 'vmlinux' to '$(objtree)/vmlinux'. This accidentally broke the > > previous logic to skip relinking modules if only vmlinux changes. The issue > > is that '$(objtree)' is typically '.' and GNU Make normalizes the resulting > > prerequisite './vmlinux' to just 'vmlinux', while the exclusion logic > > retains the raw './vmlinux'. As a result, if_changed_except doesn't > > correctly filter out vmlinux. Consequently, with > > CONFIG_DEBUG_INFO_BTF_MODULES=y, modules are relinked even if only vmlinux > > changes. > > > > It is possible to fix this Makefile issue. However, having the %.ko rule > > update the resulting file in place without starting from the original > > inputs is rather fragile. The logic is harder to debug if something breaks > > during a subsequent .ko update because the old input is lost due to the > > overwrite. Additionally, it requires that the BTF processing is idempotent. > > For example, sorting id+flags BTF_SET8 pairs in .BTF_ids by resolve_btfids > > currently doesn't have this property. > > > > One option is to split the %.ko target into two rules: the first for > > partial linking and the second one for generating the BTF data. However, > > this approach runs into an issue with requiring additional intermediate > > files, which increases the size of the build directory. On my system, when > > using a large distribution config with ~5500 modules, the size of the build > > directory with debuginfo enabled is already ~25 GB, with .ko files > > occupying ~8 GB. Duplicating these .ko files doesn't seem practical. > > > > Measuring the speed of the %.ko processing shows that the link step is > > actually relatively fast. It takes about 20% of the overall rule time, > > while the BTF processing accounts for 80%. Moreover, skipping the link part > > becomes relevant only during local development. In such cases, developers > > typically use configs that enable a limited number of modules, so having > > the %.ko rule slightly slower doesn't significantly impact the total > > rebuild time. This is supported by the fact that no one has complained > > about this optimization being broken for the past two years. > > > > Therefore, remove the logic that prevents module relinking when only > > vmlinux changes and simplify Makefile.modfinal. > > > > Signed-off-by: Petr Pavlu <[email protected]> > > If the BPF folks want to take this since it deals with BTF: > > Acked-by: Nathan Chancellor <[email protected]> > > Otherwise, either Nicolas can take this for 7.1 or I will pick it up for > 7.2 when 7.1-rc1 is out.
Alan, Ihor, As resident btf gen experts, Please take a look.

