Chamadas de sistema set_robust_list2 do Linux voltam na v7 para o FEX-Emu
A Igalia publicou em 25 de setembro de 2026 a v7 das chamadas futex set_robust_list2, 10 meses após a v6, para ajudar o FEX-Emu a rodar código x86 de 32 bits em Arm64.
4 min de leitura

André Almeida, da consultoria Igalia, publicou em 25 de setembro de 2026 a versão 7 de duas novas chamadas de sistema do Linux, set_robust_list2() e get_robust_list2(). Elas corrigem uma lacuna que impede emuladores como o FEX-Emu de lidar corretamente com travas quando rodam programas x86 de 32 bits em máquinas Arm64. É a primeira revisão nova desde a v6, de 22 de novembro de 2025.
Uma chamada de sistema, ou syscall, é a porta fixa que um programa usa para pedir algo ao kernel. Essa dupla já está na sétima versão.
Para que serve uma lista de futex robustos
Um futex é uma trava que fica na própria memória de um programa. A documentação do kernel descreve os futex como travas que, quando ninguém mais as quer, «podem ser adquiridas e liberadas a partir do espaço do usuário sem entrar no kernel». Isso as torna rápidas, e elas ficam por baixo de travas de threads comuns, como os mutex do pthread.
O problema começa quando uma thread morre enquanto ainda segura uma trava. As outras threads poderiam então esperar para sempre. Uma lista de futex robustos resolve isso. Cada thread mantém uma lista das travas que segura e informa ao kernel onde essa lista fica. Normalmente, uma biblioteca como a glibc cuida dela.
Quando a thread termina, o kernel «percorre a lista com cuidado», segundo a documentação. Ele marca cada trava que pertencia à thread com a flag FUTEX_OWNER_DIED e acorda uma thread em espera. A próxima thread que pegar a trava fica sabendo que o dono anterior morreu no meio da tarefa.
Por que as chamadas antigas falham no Arm64
Hoje, uma thread registra sua lista com set_robust_list(). A cobertura da LWN sobre uma versão anterior deste trabalho explicou dois limites. A chamada permite só uma lista por thread. Ela também supõe que a lista usa o tamanho de ponteiro nativo da máquina, que é de 64 bits em um sistema Arm64 ou x86-64 moderno.
No x86-64, o kernel tem um segundo ponto de entrada de compatibilidade que entende as listas de 32 bits de programas x86 antigos. Como a LWN escreveu, «não existe esse ponto de entrada de compatibilidade para AArch64», o nome formal do Arm de 64 bits. Por isso, um programa x86 de 32 bits rodando em um emulador no Arm64 não tem onde registrar suas listas no formato que usa.
O FEX-Emu é um desses emuladores. Ele traduz programas Linux x86 e x86-64 para que rodem em hardware Arm64, e é o caso de uso citado pelos patches da v7. O Tech AI Wire publicou na semana passada a explicação do próprio projeto sobre por que emular x86 no Arm custa caro.
O que muda na v7
As novas chamadas permitem que uma thread tenha várias listas robustas, e cada lista declara se usa ponteiros de 32 ou de 64 bits. A principal mudança da v7, segundo a carta de apresentação, é que a interface «agora usa semântica CREATE/MODIFY em vez de SET». Almeida escreve que isso permite que «tanto a libc quanto o app» usem listas robustas «sem conflitos».
| Operação na v7 | O que faz |
|---|---|
| Create (32 ou 64) | Cria uma nova lista robusta e devolve seu índice |
| Modify (32 ou 64) | Substitui a cabeça de uma lista existente |
| Modify com cabeça nula | Libera o espaço dessa lista |
| List limit | Informa quantas listas uma thread pode ter |
A série tem 10 patches. Ela foi adaptada ao kernel mainline atual. Almeida escreve que ampliou os autotestes das listas robustas e portou a chamada antiga para os novos mecanismos internos. «Testado tanto em x86 quanto em arm64», diz a carta de apresentação.
O trabalho esperava outra correção. A carta de apresentação diz que ele foi retomado agora que «corrigimos em grande parte a condição de corrida do op_pending». Trata-se de uma falha na forma como um desbloqueio em andamento é registrado. A documentação do kernel chama o mecanismo antigo de desbloqueio de «racy». A carta de apresentação não cita nenhuma versão do kernel como alvo.
O que isso significa para desenvolvedores
A maior parte do código de aplicação nunca vai chamar essas syscalls diretamente. Bibliotecas C e emuladores vão. Se você mantém uma libc, um runtime de threads ou uma camada de tradução, leia agora a carta de apresentação da v7. O desenho de criar e modificar existe para que uma libc e um aplicativo possam ter cada um sua lista sem atropelar o outro. É exatamente dessa coordenação que o seu código dependeria.
Se você distribui software que as pessoas rodam sob o FEX-Emu ou um tradutor Arm64 parecido, acompanhe quando esta série chegar a uma versão publicada do kernel. Até lá, código x86 de 32 bits no Arm64 continua sem forma de registrar listas robustas no formato que usa.
Trate os detalhes como provisórios. Isto é uma proposta em uma lista de discussão, não código incorporado, e a interface já mudou de forma entre a v6 e a v7. Não desenvolva em cima dela até que uma versão do kernel a inclua.
Fontes
- [PATCH v7 00/10] futex: Create {set,get}_robust_list2() syscalls - Linux kernel mailing list
- futex: Create set_robust_list2 - LWN.net
- Robust futexes - The Linux Kernel documentation
Artigos relacionados

Linux quer remover 247 mil linhas de código ARM antigo
Um branch do kernel apagaria cerca de 247 mil linhas ao retirar plataformas ARM de 32 bits descontinuadas e os drivers que só elas usavam.

ARCTIC adiciona uma segunda licença ao seu driver de ventoinhas para os BSDs
O driver arctic_fan_controller passa de GPLv2+ para GPLv2+ e BSD-2-Clause no Linux 7.4, para que outros sistemas reaproveitem o código do aparelho de US$ 8,99.

Snapdragon X2 ganha prévia antecipada de Linux para desenvolvedores
A prévia de Linux da Qualcomm para o Snapdragon X2 chegou em 23 de setembro de 2026, com suporte oficial do kernel previsto para novembro de 2026.