Após dois meses de desenvolvimento, Linus Torvalds apresentou o lançamento do núcleo Linux 7.2. Entre as mudanças mais notáveis: o mecanismo de transmissão de dados USB4STREAM, otimizações de desempenho para btrfs, xfs e ext4, a continuação da remoção de código para suporte a CPU i486, a possibilidade de criação de planejadores aninhados SCHED_EXT, redução do consumo de memória no subsistema de troca, aceleração de canais nomeados, suporte a extensões Intel MBEC e AMD GMET no KVM, remoção do protocolo AppleTalk, e suporte inicial para HDMI 2.1 FRL no driver AMDGPU.
Principais novidades no núcleo 7.2 (1, 2, 3):
- Subsistema de disco, entrada/saída e sistemas de arquivos
- No mecanismo iomap, foi removida a chamada desnecessária da função memset para iterações já concluídas na função iomap_iter(), o que, em testes realizados sob alta intensidade de entrada/saída em dispositivos NVMe rápidos, aumentou o número de operações de entrada/saída por segundo (IOPS) em 5% com o uso dos sistemas de arquivos ext4 e xfs.
- No XFS, foi anunciada a estabilidade do suporte a dispositivos de armazenamento zonificados (divisão em zonas de grupos de blocos ou setores, nos quais é permitido apenas a adição sequencial de dados com atualização de todo o grupo de blocos).
- No Btrfs, o suporte a grandes fôlios de páginas de memória (large folios) foi habilitado por padrão, permitindo reduzir a sobrecarga e aumentar o desempenho durante operações de entrada/saída sequenciais intensivas. Foi adicionado suporte experimental a enormes fôlios (“huge folios”), com tamanhos de até 2 MB. Um novo ioctl GET_CSUMS foi adicionado para obter informações sobre somas de verificação no espaço do usuário, por exemplo, para a utilidade mkfs e otimização de deduplicação. O desempenho da gravação sequencial de dados aumentou em 15% e o de entrada/saída direta em 59%.
- No sistema de arquivos Ext4, a implementação do mecanismo de "fast commit" foi significativamente reformulada para evitar a ocorrência de bloqueios concorrentes e mútuos. A estatística sobre snapshots de inode foi exportada através de /proc/fs/ext4/*/fc_info. O desempenho do cálculo de hashes de diretórios foi otimizado (para nomes com 255 caracteres, a aceleração foi quase o dobro, 64 caracteres em 27%, e 32 caracteres em 11%).
- No F2FS, foi adicionada a capacidade de relatar erros fserror, permitindo que problemas com o sistema de arquivos sejam monitorados a partir do espaço do usuário. O tempo gasto no contexto de tratamento de interrupções foi reduzido.
- No Device Mapper (DM), foi adicionado um novo manipulador dm-inlinecrypt para facilitar a criptografia e descriptografia transparentes de dispositivos de bloco, utilizando dispositivos de hardware com a função de criptografia inline.
- Foi proposta a documentação para a adição de novos sistemas de arquivos ao núcleo.
- No NFS, o tamanho do bloco padrão foi aumentado para 4 MB em sistemas com pelo menos 16 GB de RAM (para alterar manualmente o tamanho do bloco, utilize /proc/fs/nfsd/max_block_size). Foi adicionada a suporte para delegação de diretório ao cliente, permitindo que operações sejam realizadas nessa diretório por um determinado tempo sem verificar a alteração do estado. servidor.
- No servidor SMB, foi adicionada a suporte para arquivos armazenados de forma compactada, assim como a compressão de dados durante a transmissão pela rede.
- Na nova implementação do NTFS (ntfsplus), foi adicionada a suporte a links simbólicos do Windows e garantida a correta manipulação de muitos tipos de corrupção de metadados.
- Foi removido o backend fscache para o cache de dados do sistema de arquivos EROFS (Enhanced Read-Only File System), que foi declarado obsoleto há dois anos.
- No sistema de arquivos Ceph, foi adicionada a suporte para a redefinição manual de sessões de clientes.
- No sistema de arquivos 9P, foram feitas otimizações que aceleraram o desempenho em cenários como construção de projetos.
- Na chamada de sistema file_getattr(), foram adicionados flags para obter informações sobre a distinção de maiúsculas e minúsculas no sistema de arquivos. O flag FS_XFLAG_CASEFOLD indica que a verificação dos nomes de arquivos é feita sem considerar letras maiúsculas e minúsculas, enquanto o flag FS_XFLAG_CASENONPRESERVING indica que, ao criar novos nomes de arquivos, a informação de maiúsculas e minúsculas não é preservada. Esses flags podem ser aplicados em clientes NFS que operam sem considerar maiúsculas e minúsculas.
- Na chamada de sistema openat2(), foi adicionado o flag O_EMPTYPATH, permitindo a passagem de um caminho de arquivo vazio. Nesse caso, o caminho do arquivo aberto é determinado com base no descritor de arquivo passado.
- Na chamada de sistema openat2(), foi adicionado o flag OPENAT2_REGULAR, permitindo a abertura apenas de arquivos regulares (ao tentar abrir um arquivo especial, como um soquete, canal ou dispositivo, será retornado um erro EFTYPE).
- Memória e serviços do sistema
- Implementado o mecanismo USB4STREAM para a transmissão de dados entre computadores conectados por cabos através das portas USB4. Um dispositivo /dev/tbstreamX foi adicionado, através do qual é possível ler e gravar dados utilizando as funções nativas read() e write(), similar à leitura e escrita em arquivos. Por exemplo, em um host, é possível enviar informações com o comando "echo hello > /dev/tbstream0", e em outro, ler com o comando "cat /dev/tbstream0". O mecanismo USB4STREAM pode ser combinado com a capacidade de estabelecer uma conexão de rede via cabo USB4 (thunderbolt_net) ou utilizado separadamente quando necessário para a transferência de dados entre aplicações que não suportam sockets de rede.
- Incluída a segunda série de alterações para descontinuar o suporte a processadores i486. Mais de 13 linhas de código foram removidas, relacionadas à emulação de um bloco para cálculos com ponto flutuante para processadores sem FPU. O suporte a processadores i486 sem operações de hardware CX8 (comparar e trocar 8 bytes) e TSC (contador de ciclos da CPU, utilizado no escalonador de tarefas) foi removido, junto com o código para a emulação dos mesmos.
- Anunciado o suporte aos processadores AMD Geode, que ficou sem manutenção (orphaned), utilizados no computador OLPC XO-1.
- Adicionada a atualização do mecanismo Intel TDX (Trusted Domain Extensions), que é usado para criptografar a memória RAM de sistemas convidados. O TDX é implementado na forma de um módulo especial de runtime de software, que durante o boot inicial é transferido do BIOS da memória Flash para a memória RAM. O núcleo recebeu funcionalidades para gerenciar esse módulo e substituí-lo por uma nova versão em um sistema em funcionamento, sem a necessidade de reinicialização.
- Foi implementado um novo planejador de distribuição de recursos de GPU (Fair GPU scheduler), utilizado para determinar a ordem de execução de trabalhos na GPU enviados por processos que utilizam GPU. Em vez de aplicar a tradicional fila de pedidos FIDO para a GPU, o novo planejador utiliza mecanismos de distribuição justa de recursos, implementados com base no planejador de tarefas CFS (Completely Fair Scheduler), que usa um esquema de programação com um tempo de transição para a execução do próximo processo. O efeito mais perceptível do uso do novo planejador é observado durante a execução paralela de tarefas interativas que utilizam intensamente a GPU. No último momento antes do lançamento do kernel 7.2, a inclusão do Fair GPU scheduler foi cancelada e o antigo planejador FIFO foi reinstaurado devido à necessidade de depuração de uma regressão que causava diminuição de desempenho e 100% de carga na GPU ao iniciar jogos individuais no Proton.
- Mudanças no subsistema eBPF: foi adicionada a possibilidade de anexar um programa BPF a vários pontos de rastreamento (tracepoint). Ferramentas BPF conectadas a pontos de rastreamento agora têm acesso à memória de componentes que operam no espaço do usuário, com tratamento adequado para acessos a páginas de memória não alocadas (page fault). A chamada de sistema bpf() agora suporta atributos padrão (log_buf, log_size, log_level e log_true_size), permitindo padronizar a transmissão de metadados em todos os comandos BPF, sem se limitar apenas aos comandos BPF_PROG_LOAD, BPF_BTF_LOAD e BPF_MAP_CREATE. A restrição de passar não mais do que 5 parâmetros nas funções BPF foi removida. Acesso seguro à memória compartilhada bpf_arena foi possibilitado sem o temor de acessar páginas de memória não alocadas (page fault). Uma nova variante da estrutura BPF hash map foi implementada, permitindo alteração dinâmica de tamanho.
- Optimizou-se a formação da saída «/proc/interrupts» com estatísticas de interrupções, bem como as estruturas para armazenar contadores de interrupções, e foi adicionado o cache.
- A geração do arquivo «/proc/filesystems» utilizado no libselinux foi acelerada.
- O planejador de tarefas agora suporta balanceamento de carga entre núcleos de CPU, levando em conta o estado do cache interno do processador. O planejador tenta agrupar processos que utilizam recursos comuns, como as threads de um único processo, para que eles possam ser usados no contexto do mesmo cache de nível superior, aumentando a eficácia do acesso aos dados devido à maior probabilidade de encontrar os dados necessários no cache.
- No mecanismo SCHED_EXT, que permite usar BPF para criar planejadores de CPU, foi continuada a implementação de um recurso para criar planejadores aninhados (sub-scheduler), através do qual cada cgroup pode ter seu próprio planejador de tarefas.
- Foi prosseguido o transporte de alterações da branch Rust-for-Linux relacionadas ao uso da linguagem Rust como segunda linguagem para desenvolver drivers e módulos do núcleo (o suporte a Rust não está ativo por padrão e não resulta na inclusão do Rust como uma dependência obrigatória para compilar o núcleo). A possibilidade de usar Rust no núcleo foi implementada para a arquitetura s390. O pacote "zerocopy" foi incluído com primitivas rápidas para manipulação de memória em código em modo "unsafe".
- A versão mínima do conjunto de ferramentas LLVM necessária para compilar o núcleo foi elevada para 17.0.1.
- Na biblioteca C minimalista nolibc, fornecida com os fontes do núcleo Linux e oferecendo uma camada sobre as chamadas de sistema básicas, foi implementado suporte para as arquiteturas OpenRISC e PA-RISC de 32 bits.
- A subsistema de swap recebeu otimizações que aumentam o desempenho e reduzem o consumo de memória na própria subsistema ao eliminar custos ao armazenar metadados estáticos e unificando o trabalho com memória anônima e compartilhada ao utilizar foliant. A redução do consumo de memória é bastante significativa, por exemplo, ao montar uma partição de swap de 1 TB, observa-se uma diminuição do consumo de memória de cerca de 512 MB.
- A eficiência do mecanismo de exclusão de memória, que remove ou move para a partição de swap áreas de memória para liberar memória quando ela está escassa no sistema, foi aprimorada. Em alguns tipos de carga, como ao testar o MongoDB usando YCSB (Yahoo! Cloud Serving Benchmark), foi observado um ganho de desempenho de até 30%.
- Foi adicionada o comando "make sbom" ao sistema de montagem para gerar listas SBOM (Software Bill Of Materials), refletindo os componentes, bibliotecas e dependências utilizados na construção atual do núcleo, bem como informações sobre suas licenças obtidas dos cabeçalhos SPDX nos arquivos de código.
- Na implementação de canais anônimos (pipe), foi otimizada a operação com bloqueios (operações de alocação de memória foram movidas para fora do alcance do bloqueio), o que aumentou a capacidade de processamento de canais anônimos em 21-48% e reduziu a latência em 17-33%.
- Virtualização e segurança
- No mecanismo de alocação de memória slab (slab allocator), foi adicionada a capacidade de usar tokens de alocação de memória (Allocation Token), implementados no compilador Clang 22. Os tokens permitem marcar operações de alocação de memória com identificadores únicos e organizar alocações separadas para diferentes tipos de objetos, dificultando a exploração de vulnerabilidades causadas por estouros de buffer (no particionamento, é mais difícil explorar um estouro de buffer em um tipo de objeto para corromper outros tipos de objetos).
- O mecanismo AF_ALG, explorado na vulnerabilidade Copy Fail para modificar dados no cache de páginas, foi declarado obsoleto e programado para remoção em uma das futuras versões. AF_ALG permite utilizar aceleradores de hardware para cálculos criptográficos na Crypto API do núcleo, mas é aplicado em situações bastante específicas. No núcleo 7.2, o AF_ALG removeu o suporte para entrada/saída assíncrona, drivers antigos e o mecanismo zero-copy na implementação skcipher e aead. Apenas implementações de software de algoritmos criptográficos foram mantidas, e o suporte a aceleradores criptográficos de hardware na crypto API do núcleo foi removido, uma vez que o AF_ALG expande significativamente a superfície de ataque, sem ganho de desempenho em comparação com a implementação de criptografia no espaço do usuário. O AF_ALG foi usado no conjunto de ferramentas Cryptsetup, mas seu suporte foi removido na recente versão 2.8.7.
- No mecanismo IMA (Integrity Measurement Architecture), que permite a um serviço externo verificar o estado das subsistemas do núcleo para garantir sua autenticidade, foi adicionada a capacidade de exportar tabelas internas com resultados de medições para o espaço do usuário, com a remoção dos buffers do núcleo para economizar memória.
- No módulo Landlock, que oferece a programas não privilegiados recursos para limitar o uso de objetos do núcleo Linux (hierarquias de arquivos, sockets de rede, ioctl, etc.), foi adicionada a capacidade de gerenciar o acesso a sockets UDP, bem como a possibilidade de desativar de forma seletiva a saída de logs de informações sobre bloqueios de objetos para evitar a saturação dos logs com informações irrelevantes.
- O núcleo foi desfeito do uso da função strncpy(), que copia um número específico de bytes de uma string de entrada. O uso de strncpy() cria riscos de erros devido à possibilidade de omitir o caractere nulo no final da string ou de preencher com zeros. Em vez de strncpy(), é recomendado usar as funções strscpy() e strscpy_pad() para copiar strings que terminam com um caractere nulo, assim como strtomem_pad(), memcpy_and_pad() e memcpy() para copiar strings de tamanho fixo conhecido. O trabalho para eliminar o uso de strncpy() no núcleo começou em 2020 e exigiu a aceitação de 362 alterações por 70 desenvolvedores.
- No hipervisor KVM foi adicionada a suporte para as extensões Intel MBEC (Mode-Based Execution Control) e AMD GMET (Guest-Mode Execution Trap), que permitem gerenciar separadamente os direitos de execução de código para o núcleo e o espaço do usuário nos sistemas convidados nas tabelas de tradução de memória. Anteriormente, as extensões de virtualização de hardware da Intel e AMD permitiam rotular as páginas de memória como executáveis com um único bit, com a divisão dos direitos para o núcleo e o espaço do usuário ocorrendo no nível do hipervisor. A utilização do MBEC e GMET permite eliminar as verificações de autorização do lado do hipervisor e reduzir significativamente a intensidade do recurso envolvido na transferência de controle do sistema convidado para o hipervisor VMexit.
- Subsistema de Rede
- A implementação da extensão TCP-AO (TCP Authentication Option, RFC 5925) foi alterada para usar a nova biblioteca criptográfica libcrypto, o que simplificou o código e aumentou a eficiência do trabalho. O TCP-AO permite verificar os cabeçalhos TCP com códigos MAC (Message Authentication Code), utilizando algoritmos mais modernos HMAC-SHA-1-96 e AES-128-CMAC-96 em vez da opção anterior TCP-MD5 baseado no obsoleto algoritmo MD5.
- O número de subfluxos suportados para conexões Multipath TCP (MPTCP) foi aumentado de 8 para 64.
- Continuou o trabalho na redução do uso de bloqueios globais rtnl_lock na pilha de rede do núcleo.
- Foi removida do núcleo a implementação da pilha de protocolos AppleTalk, que era utilizada em computadores Apple desde 1985 e foi substituída pelo TCP/IP na década de 1990. Além disso, foram removidos componentes da tecnologia de transmissão de dados ATM que não estão relacionados ao PPPoATM, bem como interfaces de rede ARCnet baseadas em barramentos ISA e PCMCIA, adaptadores Bluetooth com interface PCMCIA, aceleradores TLS Chelsea, código para integração de TLS com sockmap e suporte a faixas de frequência de 5/10 MHz na pilha sem fio cfg80211/mac80211. Devido à presença de problemas insolúveis com bloqueios e à falta de suporte, foi removida a implementação específica da aceleração do processamento de TLS baseada em TCP Offload Engine (uma implementação mais comum de TLS offload foi mantida). O código de compatibilidade com x_tables de 32 bits em sistemas de 64 bits foi desativado e planejado para remoção.
- O driver pppoe foi atualizado para suportar mecanismos GRO (Generic Receive Offload) e GSO (Generic Segmentation Offload) para aceleração de hardware na remontagem e segmentação de pacotes. O uso de GRO e GSO pode aumentar significativamente a capacidade de processamento para tráfego de entrada; por exemplo, em dispositivos MediaTek MT7621 configurados como tradutores de endereços, a taxa máxima de transferência aumentou de 130 Mbit/s para 630 Mbit/s.
- Hardware
- O driver AMDGPU agora oferece suporte inicial para a tecnologia HDMI 2.1 FRL (Fixed Rate Link), permitindo a transmissão de vídeo não comprimido em qualidade 4K/120Hz e 8K/60Hz. Anteriormente, a implementação do HDMI 2.1 não foi bem-sucedida em drivers de código aberto devido a requisitos de licenciamento do HDMI Forum, mas agora a AMD conseguiu formalizar tal implementação.
- No driver i915, foi adicionada a capacidade de configurar a cor de fundo exibida pelo controlador de exibição. O parâmetro pin_params.needs_low_address foi implementado.
- O trabalho no driver drm (Direct Rendering Manager) Xe para GPUs baseadas na arquitetura Intel Xe, utilizada nas placas de vídeo Intel da família Arc e na gráfica integrada a partir dos processadores Tiger Lake, continua. O suporte inicial para a plataforma CRI (Crescent Island) foi adicionado. Um controlador de sistema foi implementado para plataformas dGPU Xe3p.
- O driver Nouveau resolveu problemas relacionados ao GPU NVIDIA GA100.
- No driver v3d, foi adicionada a capacidade de gerenciar o consumo de energia do GPU v3D em placas Raspberry Pi.
- A integração dos componentes do driver Nova para GPUs NVIDIA, equipados com firmware GSP, foi continuada, utilizada desde a série NVIDIA GeForce RTX 2000 baseada na microarquitetura Turing. O driver foi escrito na linguagem Rust. O suporte para GPU NVIDIA GA100 e as séries Hopper e Blackwell foi adicionado.
- Suporte adicionado para plataformas ARM, SoCs e dispositivos: Apple t8122 (M3), Motorola Edge 30, Nothing Phone 3a, Google Pixel 3a XL, Qualcomm Dragonwing IPQ9650, Huawei Hawi, ZTE zx297520v3, Renesas R-Car M3Le, ASPEED AST27xx, Cortina Gemini, NXP i.MX6/8/9, NXP LX2160A, TI K3 AM62x.
Simultaneamente, a Fundação de Software Livre da América Latina formou uma versão completamente livre do núcleo 7.2 — Linux-libre 7.2-gnu, limpa de elementos de firmware e drivers que contêm componentes ou trechos de código não livres, cuja área de aplicação é limitada pelo fabricante. No lançamento 7.2, houve a limpeza de blobs dos novos drivers rt722-sdca e tac5xx2. O código de limpeza nos drivers amdgpu, nova core, qcom iris, q6v5, iwlwifi, amdxnda, adreno, r8152 e mt792x foi atualizado. Ajustes nas interfaces para carregamento de firmwares foram realizados. A limpeza dos nomes dos blobs em arquivos dts (devicetree) para chips ARM foi executada.
Fonte: opennet.ru
