linux/scripts
Rasmus Villemoes 523f3dbc18 setlocalversion: work around "git describe" performance
Contrary to expectations, passing a single candidate tag to "git
describe" is slower than not passing any --match options.

  $ time git describe --debug
  ...
  traversed 10619 commits
  ...
  v6.12-rc5-63-g0fc810ae3ae1

  real    0m0.169s

  $ time git describe --match=v6.12-rc5 --debug
  ...
  traversed 1310024 commits
  v6.12-rc5-63-g0fc810ae3ae1

  real    0m1.281s

In fact, the --debug output shows that git traverses all or most of
history. For some repositories and/or git versions, those 1.3s are
actually 10-15 seconds.

This has been acknowledged as a performance bug in git [1], and a fix
is on its way [2]. However, no solution is yet in git.git, and even
when one lands, it will take quite a while before it finds its way to
a release and for $random_kernel_developer to pick that up.

So rewrite the logic to use plumbing commands. For each of the
candidate values of $tag, we ask: (1) is $tag even an annotated
tag? (2) Is it eligible to describe HEAD, i.e. an ancestor of
HEAD? (3) If so, how many commits are in $tag..HEAD?

I have tested that this produces the same output as the current script
for ~700 random commits between v6.9..v6.10. For those 700 commits,
and in my git repo, the 'make -s kernelrelease' command is on average
~4 times faster with this patch applied (geometric mean of ratios).

For the commit mentioned in Josh's original report [3], the
time-consuming part of setlocalversion goes from

$ time git describe --match=v6.12-rc5 c1e939a21e
v6.12-rc5-44-gc1e939a21eb1

real    0m1.210s

to

$ time git rev-list --count --left-right v6.12-rc5..c1e939a21eb1
0       44

real    0m0.037s

[1] https://lore.kernel.org/git/20241101113910.GA2301440@coredump.intra.peff.net/
[2] https://lore.kernel.org/git/20241106192236.GC880133@coredump.intra.peff.net/
[3] https://lore.kernel.org/lkml/309549cafdcfe50c4fceac3263220cc3d8b109b2.1730337435.git.jpoimboe@kernel.org/

Reported-by: Sean Christopherson <seanjc@google.com>
Closes: https://lore.kernel.org/lkml/ZPtlxmdIJXOe0sEy@google.com/
Reported-by: Josh Poimboeuf <jpoimboe@kernel.org>
Closes: https://lore.kernel.org/lkml/309549cafdcfe50c4fceac3263220cc3d8b109b2.1730337435.git.jpoimboe@kernel.org/
Tested-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2024-11-28 08:11:56 +09:00
..
atomic
basic fixdep: use xmalloc() 2024-09-01 20:34:49 +09:00
clang-tools
coccinelle Reduce Coccinelle choices in string_choices.cocci 2024-09-28 21:33:11 +02:00
dtc dt: dt-extract-compatibles: Extract compatibles from function parameters 2024-09-05 10:17:03 -05:00
dummy-tools
gcc-plugins gcc-plugins: randstruct: Remove GCC 4.7 or newer requirement 2024-08-05 14:34:23 -07:00
gdb scripts/gdb: add 'lx-kasan_mem_to_shadow' command 2024-09-01 20:43:29 -07:00
genksyms
include scripts: import more list macros 2024-10-07 02:12:27 +09:00
ipe scripts: add boot policy generation program 2024-08-20 14:03:39 -04:00
kconfig kconfig: document the positional argument in the help message 2024-11-06 08:46:35 +09:00
ksymoops
mod modpost: fix input MODULE_DEVICE_TABLE() built for 64-bit on 32-bit host 2024-11-03 23:58:56 +09:00
package kbuild: change working directory to external module directory with M= 2024-11-28 08:10:23 +09:00
selinux
tracing
.gitignore
Kbuild.include kbuild: add $(objtree)/ prefix to some in-kernel build artifacts 2024-11-27 09:38:27 +09:00
Kconfig.include kbuild: rust: add `CONFIG_RUSTC_LLVM_VERSION` 2024-10-13 22:22:28 +02:00
Lindent
Makefile scripts: add boot policy generation program 2024-08-20 14:03:39 -04:00
Makefile.asm-headers
Makefile.autofdo AutoFDO: Enable machine function split optimization for AutoFDO 2024-11-27 09:38:27 +09:00
Makefile.btf
Makefile.build kbuild: enable objtool for *.mod.o and additional kernel objects 2024-11-28 08:11:55 +09:00
Makefile.clang
Makefile.clean kbuild: change working directory to external module directory with M= 2024-11-28 08:10:23 +09:00
Makefile.compiler kbuild: change working directory to external module directory with M= 2024-11-28 08:10:23 +09:00
Makefile.debug
Makefile.defconf
Makefile.dtbinst
Makefile.dtbs kbuild: move non-boot built-in DTBs to .rodata section 2024-09-30 20:42:52 +09:00
Makefile.extrawarn
Makefile.gcc-plugins
Makefile.headersinst
Makefile.host kbuild: support building external modules in a separate build directory 2024-11-28 08:11:55 +09:00
Makefile.kasan kbuild: rust: Enable KASAN support 2024-09-16 18:04:37 +02:00
Makefile.kcov
Makefile.kcsan
Makefile.kmsan
Makefile.lib kbuild: switch from lz4c to lz4 for compression 2024-11-28 08:11:56 +09:00
Makefile.modfinal kbuild: re-enable KCSAN for autogenerated *.mod.c intermediaries 2024-11-28 08:11:55 +09:00
Makefile.modinst kbuild: remove extmod_prefix, MODORDER, MODULES_NSDEPS variables 2024-11-28 08:11:55 +09:00
Makefile.modpost kbuild: remove extmod_prefix, MODORDER, MODULES_NSDEPS variables 2024-11-28 08:11:55 +09:00
Makefile.package kbuild: rpm-pkg: disable kernel-devel package when cross-compiling 2024-10-31 21:40:46 +09:00
Makefile.propeller kbuild: Fix Propeller build option 2024-11-27 09:38:27 +09:00
Makefile.randstruct
Makefile.ubsan
Makefile.userprogs
Makefile.vdsoinst
Makefile.vmlinux kbuild: enable objtool for *.mod.o and additional kernel objects 2024-11-28 08:11:55 +09:00
Makefile.vmlinux_o kbuild: generate offset range data for builtin modules 2024-09-20 09:21:43 +09:00
as-version.sh
asn1_compiler.c
bloat-o-meter
bootgraph.pl
bpf_doc.py
build-version
cc-can-link.sh
cc-version.sh
check-git
check-sysctl-docs
check-uapi.sh
check-variable-fonts.sh
check_extable.sh
checkdeclares.pl
checkincludes.pl
checkkconfigsymbols.py
checkpatch.pl net: drop special comment style 2024-08-23 10:21:02 +01:00
checkstack.pl
checksyscalls.sh
checktransupdate.py scripts: fix all issues reported by pylint 2024-07-29 15:34:22 -06:00
checkversion.pl
cleanfile
cleanpatch
coccicheck kbuild: change working directory to external module directory with M= 2024-11-28 08:10:23 +09:00
config
const_structs.checkpatch
decode_stacktrace.sh scripts/decode_stacktrace.sh: add '-h' flag 2024-09-01 20:43:41 -07:00
decodecode
depmod.sh kbuild: add $(objtree)/ prefix to some in-kernel build artifacts 2024-11-27 09:38:27 +09:00
dev-needs.sh
diffconfig
documentation-file-ref-check
export_report.pl
extract-ikconfig
extract-module-sig.pl
extract-sys-certs.pl
extract-vmlinux
extract_xc3028.pl
faddr2line
file-size.sh
find-unused-docs.sh
gcc-x86_32-has-stack-protector.sh kbuild: Fix '-S -c' in x86 stack protector scripts 2024-07-29 03:47:00 +09:00
gcc-x86_64-has-stack-protector.sh kbuild: Fix '-S -c' in x86 stack protector scripts 2024-07-29 03:47:00 +09:00
gen-randstruct-seed.sh
generate_builtin_ranges.awk kbuild: generate offset range data for builtin modules 2024-09-20 09:21:43 +09:00
generate_initcall_order.pl
generate_rust_analyzer.py rust: Support latest version of `rust-analyzer` 2024-08-07 01:16:52 +02:00
generate_rust_target.rs kbuild: rust: Enable KASAN support 2024-09-16 18:04:37 +02:00
get_abi.pl
get_dvb_firmware
get_feat.pl
get_maintainer.pl get_maintainer: add --bug option to print bug reporting info 2024-08-26 16:10:12 -06:00
gfp-translate scripts: fix gfp-translate after ___GFP_*_BITS conversion to an enum 2024-09-01 17:59:01 -07:00
git.orderFile
head-object-list.txt MIPS: Place __kernel_entry at the beginning of text section 2024-11-27 09:36:01 +09:00
headerdep.pl
headers_install.sh
insert-sys-cert.c
install.sh
jobserver-exec
kallsyms.c kallsyms: change overflow variable to bool type 2024-09-20 09:21:52 +09:00
kernel-doc
ld-version.sh
leaking_addresses.pl
link-vmlinux.sh kbuild: add generic support for built-in boot DTBs 2024-11-04 17:53:09 +09:00
macro_checker.py scripts: add macro_checker script to check unused parameters in macros 2024-09-01 20:43:28 -07:00
make_fit.py
makelst
markup_oops.pl
min-tool-version.sh
misc-check
mkcompile_h
mksysmap
mkuboot.sh
module-common.c kbuild: compile constant module information only once 2024-09-07 17:24:08 +09:00
module.lds.S
modules-check.sh
nsdeps kbuild: remove extmod_prefix, MODORDER, MODULES_NSDEPS variables 2024-11-28 08:11:55 +09:00
objdiff
objdump-func
orc_hash.sh
pahole-version.sh
parse-maintainers.pl
patch-kernel
profile2linkerlist.pl
prune-kernel
recordmcount.c
recordmcount.h
recordmcount.pl
relocs_check.sh
remove-stale-files fortify: refactor test_fortify Makefile to fix some build problems 2024-08-15 09:26:02 -07:00
rust_is_available.sh
rust_is_available_bindgen_0_66.h
rust_is_available_bindgen_libclang.h
rust_is_available_test.py
rustc-llvm-version.sh kbuild: rust: avoid errors with old `rustc`s without LLVM patch version 2024-10-28 00:27:16 +01:00
rustc-version.sh kbuild: rust: add `CONFIG_RUSTC_VERSION` 2024-09-05 22:44:18 +02:00
rustdoc_test_builder.rs
rustdoc_test_gen.rs
setlocalversion setlocalversion: work around "git describe" performance 2024-11-28 08:11:56 +09:00
show_delta
sign-file.c sign-file,extract-cert: use pkcs11 provider for OPENSSL MAJOR >= 3 2024-09-20 19:52:48 +03:00
sorttable.c
sorttable.h
spdxcheck-test.sh
spdxcheck.py
spdxexclude
spelling.txt
sphinx-pre-install scripts: sphinx-pre-install: remove unnecessary double check for $cur_version 2024-09-05 14:32:36 -06:00
split-man.pl
ssl-common.h sign-file,extract-cert: avoid using deprecated ERR_get_error_line() 2024-09-20 19:49:52 +03:00
stackdelta
stackusage
subarch.include scripts: subarch.include: fix SUBARCH on macOS hosts 2024-09-10 13:56:37 +09:00
syscall.tbl syscalls: add back legacy __NR_nfsservctl macro 2024-08-06 08:57:02 +02:00
syscallhdr.sh
syscallnr.sh
syscalltbl.sh
tags.sh
tools-support-relr.sh
unifdef.c
ver_linux
verify_builtin_ranges.awk scripts: add verifier script for builtin module range data 2024-09-20 09:21:52 +09:00
xen-hypercalls.sh
xz_wrap.sh xz: adjust arch-specific options for better kernel compression 2024-09-01 20:43:27 -07:00