Linus Torvalds rebaixa a opção "FORCE_NR_CPUS" do Linux incorporado para evitar confusão

Problemas na memória RAM atrasam desenvolvimento do kernel Linux
Linus Torvalds garante que a linguagem Rust entrará no Linux 6.1

O desenvolvedor Linus Torvalds rebaixa a opção “FORCE_NR_CPUS” do Linux incorporado para evitar confusão.

A opção “FORCE_NR_CPUS” Kconfig do kernel Linux existe há algum tempo para forçar o número de núcleos de CPU que o kernel espera, a fim de permitir melhores otimizações do compilador.

Ao construir um kernel direcionado para um dispositivo/plataforma específico com um determinado número de núcleos de CPU, o compilador pode otimizar as rotinas de máscara de CPU e reduzir o tamanho da imagem de kernel resultante, em vez de ter que acomodar até um limite superior dinâmico para o número de núcleos de CPU a serem encontrados no momento da inicialização. O próprio Linus Torvalds rebaixou ainda mais essa opção CONFIG_FORCE_NR_CPUS para evitar confusão.

A opção FORCE_NR_CPUS de tempo de compilação do Kconfig tem sido realmente sobre aqueles que fazem compilações direcionadas do kernel Linux para plataformas específicas e realmente querem otimizar o tamanho do kernel resultante.

Linus Torvalds rebaixa a opção “FORCE_NR_CPUS” do Linux incorporado para evitar confusão

Em 2022, quando introduzida ao usar FORCE_NR_CPUS=y com um valor padrão NR_CPUS=4 para segmentar uma plataforma de 4 núcleos, a imagem do kernel salvou… 46KB. Não muito, exceto para cenários incorporados extremos com recursos limitados.

Mas quando o número de CPUs do sistema não corresponde ao número forçado de CPUs para tais compilações do kernel, problemas podem surgir. Foi relatado hoje uma falha no kernel quando o número forçado de CPUs não corresponde ao número inicializado de CPUs.

O que levou Linus Torvalds a refletir:

Sim, esse aviso significa muito “você não está executando uma configuração válida”.

Dito isso, acho que FORCE_NR_CPUS foi um erro. Ele melhora um pouco a geração de código operacional bitmask (bastante na verdade em um nível micro, mas não necessariamente extremamente perceptível no panorama geral) tornando nr_cpu_ids uma constante de tempo de compilação, mas é uma opção tão especial incorporada (ou “ajustada para minha máquina particular”) que simplesmente não vale a pena.

Ele está atrás de “EXPERT”, e embora isso deva significar que ele não é habilitado por padrão, acho que o fato de muitas distros habilitarem EXPERT em sua configuração de distro padrão significa que a coisa toda perdeu todo o sentido.

Se você começar com a configuração da distro, você é magicamente um especialista. E quando todo mundo é especialista, ninguém é.”

Por sua vez, Torvalds então empurrou esse compromisso para restringir ainda mais FORCE_NR_CPUS:

Codificar o número de CPUs em tempo de compilação melhora a geração de código, mas se você errar o resultado será confusão.

Nós já limitamos isso anteriormente a apenas “especialistas” (veja commit fe5759d5bfda “cpumask: limit visibility of FORCE_NR_CPUS”), mas com as configurações do kernel da distro muitas vezes tendo o EXPERT ativado, isso acaba não sendo muito limite.

Para citar os filósofos da Disney: “Todo mundo pode ser um especialista. E quando todo mundo for especialista, ninguém será”.

Há um aviso de tempo de execução se você definir nr_cpus para qualquer coisa além do número forçado, mas aparentemente isso também pode ser ignorado e, até lá, é praticamente tarde demais de qualquer maneira.

Se tivéssemos alguma maneira real de limitar isso a “somente incorporado”, talvez valesse a pena, mas vamos ver se alguém percebe que a opção acabou. Precisamos simplificar a configuração do kernel de qualquer maneira.

Esta mudança está agora no Linux 6.10 Git antes do Linux 6.10-rc5 no próximo domingo.

Então, por enquanto, o CONFIG_FORCE_NR_CPUS está ainda mais restrito enquanto espera para ver se alguém se opõe à mudança… Se nenhuma preocupação for levantada, essa opção pode eventualmente ser removida do kernel Linux principal ou encontrar uma abordagem para lidar melhor com as opções de compilação do kernel incorporadas para aqueles que desejam economizar kilobytes em seus tamanhos de imagem do kernel.