Pular para o conteúdo

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.

Por Tech AI Wire Team

4 min de leitura

XLinkedIn
An Arm64 single-board computer wired to a monitor and a game controller on a desk, the monitor showing an out-of-focus 3D game scene.

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 v7O 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 nulaLibera o espaço dessa lista
List limitInforma 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

  1. [PATCH v7 00/10] futex: Create {set,get}_robust_list2() syscalls - Linux kernel mailing list
  2. futex: Create set_robust_list2 - LWN.net
  3. Robust futexes - The Linux Kernel documentation

Artigos relacionados