Voltar à lista
Linux x86_64Processos & threads#334

rseq

Registra uma área de memória por-thread usada para implementar sequências restartable, uma técnica de sincronização sem locks nem syscalls no caminho comum.

Descrição

Permite que bibliotecas (ex.: alocadores de memória por-CPU, contadores de estatísticas per-CPU) executem uma sequência de instruções que é garantidamente reiniciada pelo kernel caso a thread seja preemptada ou migrada de CPU no meio dela — evitando o custo de locks tradicionais para essa classe de algoritmos.

Header: linux/rseq.hman 2Desde o kernel 4.18

Nota

Praticamente sempre usada através de libc/liburcu, não diretamente — a validação por assinatura existe para dificultar abuso malicioso do mecanismo de reinício.

Assinatura

int rseq(struct rseq * rseq, uint32_t rseq_len, int flags, uint32_t sig);

Parâmetros

ParâmetroTipoDescrição
rseqstruct rseq *Área de memória a registrar para a thread chamadora.
rseq_lenuint32_tTamanho da estrutura `rseq`.
flagsint0 para registrar, RSEQ_FLAG_UNREGISTER para cancelar o registro.
siguint32_tAssinatura esperada antes do endereço de reinício, validada pelo kernel por segurança.

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1rseqstruct rseq *
rsiargumento 2rseq_lenuint32_t
rdxargumento 3flagsint
r10argumento 4siguint32_t

Valor de retorno

0 em sucesso; -1 em erro, com errno definido.

Códigos de erro (errno)

EINVAL(22)
Argumento inválido.
ENOSYS(38)
Chamada de sistema não implementada nesta versão do kernel.
EFAULT(14)
Endereço de memória inválido (ponteiro fora do espaço de endereçamento válido).
EBUSY(16)
Dispositivo ou recurso ocupado.

Relacionadas