Re: [PATCH 19/23] objtool: decode instructions and resolve branch targets in parallel
From: Josh Poimboeuf
Date: Sat Sep 12 2026 - 19:40:56 EST
On Tue, Sep 08, 2026 at 09:55:19PM +0100, Lorenzo Stoakes (ARM) wrote:
> +/* Only an object this large, e.g. vmlinux.o, is decoded on several threads. */
> +#define DECODE_THREADED_MIN_TEXT SZ_8M
> +/* Only decoding and the branch passes are threaded, so more gains nothing. */
> +#define DECODE_MAX_THREADS 16
> +#define DECODE_RANGES_PER_THREAD 4
> +
> +/*
> + * sec_offset_hash() keys on OFFSET_STRIDE windows, so the instructions of a
> + * window share a chain and buckets beyond one per window would sit empty.
> + */
> +#define INSN_HASH_BYTES_PER_BUCKET OFFSET_STRIDE
> +#define INSN_HASH_MIN_BITS 10
> +
> +static unsigned long total_text_size(struct objtool_file *file)
> +{
> + unsigned long size = 0;
> + struct section *sec;
> +
> + for_each_sec(file->elf, sec)
> + if (is_text_sec(sec))
> + size += sec_size(sec);
> +
> + return size;
> +}
> +
> +static int alloc_insn_hash(struct objtool_file *file, unsigned long text_size)
> +{
> + const unsigned long nr_buckets = text_size / INSN_HASH_BYTES_PER_BUCKET;
> + const int bits = ilog2(nr_buckets);
> +
> + file->insn_hash_bits = max(INSN_HASH_MIN_BITS, bits);
> + file->insn_hash = calloc(1UL << file->insn_hash_bits,
> + sizeof(*file->insn_hash));
> + if (!file->insn_hash) {
> + ERROR_GLIBC("calloc");
> + return -1;
> + }
> +
> + if (opts.stats)
> + printf("insn_hash_bits: %d\n", file->insn_hash_bits);
> +
> + return 0;
> +}
The dynamic insn hash sizing should probably be its own patch. It's a
standalone improvement, and much more obviously correct compared to the
rest of patch. I suspect it will make a big difference on allyesconfig.
The rest of the patch looks ok to me, though it needs to be reviewed
very carefully (which I haven't done yet). I'd like to see a Sashiko
review (I wasn't able to find these patches on sashiko.dev for some
reason).
--
Josh