Turbostat recalibrado: correção restaura leitura de energia em CPUs AMD

Turbostat recalibrado: correção restaura leitura de energia em CPUs AMD

Linus Torvalds acabou de integrar uma correção urgente para o turbostat, a ferramenta oficial do kernel Linux para monitoramento de frequência, temperatura e consumo de energia do processador. O patch, enviado por Len Brown, resolve uma regressão recente que quebrou a leitura dos sensores de energia (RAPL) especificamente em processadores AMD.

O problema foi causado por uma “limpeza de código” anterior que, inadvertidamente, alterou a lógica de como o software identifica os núcleos do processador, resultando em dados incorretos ou ausentes para usuários da plataforma AMD.

Para o iniciante: o carteiro entregou no endereço errado?

Para entender esse bug, imagine que o processador é um prédio de apartamentos (o “Pacote”).

  • O Kernel (S.O.): Tem uma lista sequencial de moradores na sua prancheta: morador 1, morador 2, morador 3… (Isso é o cpu index).
  • O Hardware (AMD): Tem os números reais nas portas dos apartamentos: apto 101, apto 102, apto 205… (Isso é o core_id).

O turbostat precisa ler o relógio de luz (RAPL) de cada apartamento. O bug fazia o turbostat olhar para a prancheta do Kernel (índice 3) e tentar achar uma porta com o número “3”. Mas no prédio da AMD, não existe porta 3, existe a porta 102.

Como resultado, o inspetor (turbostat) tentava ler um relógio que não existia ou lia o relógio errado. A correção ensina o inspetor a olhar novamente para o número real na porta (core_id) em vez da ordem na prancheta.

Detalhes técnicos da correção

A falha residia na função get_rapl_domain_id dentro do código fonte do turbostat (tools/power/x86/turbostat/turbostat.c).

Em arquiteturas que suportam RAPL (Running Average Power Limit) por núcleo, é necessário gerar um ID único global para cada núcleo para rastrear seu consumo. O código incorreto fazia o seguinte:

C// Antes (Bug) return GLOBAL_CORE_ID(cpu, cpus[cpu].package_id);

Aqui, cpu é apenas o índice lógico do Linux. A correção substitui isso pelo ID físico do núcleo, que é o que o hardware espera para mapear a topologia corretamente:

C// Depois (Correção) return GLOBAL_CORE_ID(cpus[cpu].core_id, cpus[cpu].package_id);

Além disso, o patch removeu um cálculo redundante de topo.num_cores, que estava sendo calculado de forma simplista (max_core_id + 1) e poderia gerar valores errados em topologias complexas com “buracos” na numeração dos núcleos.

Curiosidades e bastidores da discussão

A análise deste commit revela um cenário clássico de desenvolvimento de software:

  • A “maldição” da limpeza: O commit de Len Brown menciona explicitamente que o erro foi causado por uma “errant code cleanup” (limpeza de código errada). Muitas vezes, desenvolvedores tentam simplificar o código para torná-lo mais bonito, mas acabam removendo nuances vitais que faziam o sistema funcionar em hardwares específicos.
  • Ferramentas no Kernel: É interessante notar que, embora estejamos falando do repositório do kernel Linux, o turbostat é uma ferramenta de espaço de usuário (userspace) que vive dentro da árvore do kernel (pasta tools/). Isso garante que a ferramenta de diagnóstico esteja sempre sincronizada com as definições mais recentes da arquitetura x86.

Status de lançamento

O patch 7ad54bb foi mesclado por Linus Torvalds em 18 de fevereiro de 2026.

  • Status atual: Integrado ao branch master.
  • Impacto: Usuários de processadores AMD (Ryzen/EPYC) que utilizam o turbostat para monitorar eficiência energética devem atualizar a ferramenta assim que a nova versão estiver disponível nas distribuições, ou compilar manualmente a partir da árvore do kernel.