lib/cpumask: add FORCE_NR_CPUS config option
authorYury Norov <yury.norov@gmail.com>
Mon, 5 Sep 2022 23:08:20 +0000 (16:08 -0700)
committerYury Norov <yury.norov@gmail.com>
Tue, 20 Sep 2022 23:11:44 +0000 (16:11 -0700)
commit6f9c07be9d020489326098801f0661f754c7c865
tree52765a3518cb50f032298878234c3e120b45398c
parent546a073d628111e3338af689938407e77d5dc38f
lib/cpumask: add FORCE_NR_CPUS config option

The size of cpumasks is hard-limited by compile-time parameter NR_CPUS,
but defined at boot-time when kernel parses ACPI/DT tables, and stored in
nr_cpu_ids. In many practical cases, number of CPUs for a target is known
at compile time, and can be provided with NR_CPUS.

In that case, compiler may be instructed to rely on NR_CPUS as on actual
number of CPUs, not an upper limit. It allows to optimize many cpumask
routines and significantly shrink size of the kernel image.

This patch adds FORCE_NR_CPUS option to teach the compiler to rely on
NR_CPUS and enable corresponding optimizations.

If FORCE_NR_CPUS=y, kernel will not set nr_cpu_ids at boot, but only check
that the actual number of possible CPUs is equal to NR_CPUS, and WARN if
that doesn't hold.

The new option is especially useful in embedded applications because
kernel configurations are unique for each SoC, the number of CPUs is
constant and known well, and memory limitations are typically harder.

For my 4-CPU ARM64 build with NR_CPUS=4, FORCE_NR_CPUS=y saves 46KB:
  add/remove: 3/4 grow/shrink: 46/729 up/down: 652/-46952 (-46300)

Signed-off-by: Yury Norov <yury.norov@gmail.com>
include/linux/cpumask.h
kernel/smp.c
lib/Kconfig