Após dois meses de desenvolvimento, Linus Torvalds apresentou o lançamento do núcleo Linux 5.16. Entre as mudanças mais notáveis estão: a chamada de sistema futex_waitv para melhorar o desempenho de jogos do Windows no Wine, rastreamento de erros no sistema de arquivos através do fanotify, a nova abordagem de foleantes na gestão de memória, suporte para instruções de processador AMX, a possibilidade de reserva de memória para sockets de rede, suporte em netfilter para classificação de pacotes na fase "egress", utilização do subsistema DAMON para pré-emprestar áreas de memória não utilizadas, melhorias no manuseio de sobrecargas durante operações de gravação em grande volume e suporte para discos rígidos de múltiplas unidades.
A nova versão incorpora 15415 correções de 2105 desenvolvedores, o tamanho do patch é de 45 MB (as mudanças afetaram 12023 arquivos, foram adicionadas 685198 linhas de código e removidas 263867 linhas). Cerca de 44% de todas as alterações apresentadas no 5.16 estão relacionadas a drivers de dispositivos, aproximadamente 16% dizem respeito a atualizações de código específico para arquiteturas de hardware, 16% estão relacionadas à pilha de rede, 4% às sistemas de arquivos e 4% aos subsistemas internos do núcleo.
Principais inovações no núcleo 5.16:
- Subsistema de disco, entrada/saída e sistemas de arquivos
- O mecanismo fanotify recebeu ferramentas para monitorar o estado do sistema de arquivos e rastrear a ocorrência de erros. As informações sobre erros são transmitidas por meio de um novo tipo de evento — FAN_FS_ERROR, que pode ser interceptado em sistemas de monitoramento no espaço do usuário para informar o administrador rapidamente ou iniciar processos de recuperação. Em caso de uma série de erros em cascata, o fanotify garante a entrega da mensagem da primeira falha junto com um contador geral de problemas, facilitando a análise posterior das causas da falha. O suporte para rastreamento de erros está atualmente implementado apenas para o sistema de arquivos Ext4.
- Melhorou o gerenciamento de congestionamentos durante operações de gravação (congestionamento de gravação), que ocorrem quando o volume de operações de gravação excede a capacidade do dispositivo e o sistema precisa bloquear os pedidos do processo de gravação até que a execução dos pedidos já enviados seja concluída. Na nova versão, o mecanismo do kernel utilizado para obter informações sobre o surgimento de congestionamentos e o bloqueio de tarefas foi completamente refeito, pois na implementação anterior foram observados problemas na interação entre o gerenciamento de congestionamento de gravação e a troca de páginas de memória para o espaço de troca em situações de falta de memória no sistema.
- O Btrfs implementou suporte para a tecnologia de zonamento de dispositivos (Zoned Namespace), aplicada em discos rígidos ou NVMe SSD para dividir o espaço de armazenamento em zonas, que consistem em grupos de blocos ou setores, onde apenas a adição sequencial de dados é permitida, atualizando todo o grupo de blocos de uma só vez. Além disso, foram feitas pequenas otimizações no registro de inodes, que resultaram em um aumento de 3% na capacidade de teste do dbench e uma redução de 11% nas latências. O mecanismo de registro de diretórios foi reformulado, reduzindo o número de operações de busca e bloqueios na árvore para aumentar a eficácia. A inserção de elementos na estrutura btree em modo de lote foi acelerada (o tempo de inserção em massa de elementos diminuiu em 4% e a remoção em 12%). Foi adicionado suporte limitado para uso de compressão ao gravar páginas incompletas, assim como a possibilidade de desfragmentação de subpáginas.
- No sistema de arquivos XFS, houve uma redução no consumo de memória pela utilização de caches slab separados para elementos frequentemente utilizados e pela redução de algumas estruturas de dados.
- No sistema de arquivos Ext4, foram registradas apenas correções de bugs e um cálculo mais preciso dos parâmetros de inicialização tardia da tabela de Inode.
- No nível dos dispositivos de bloco, foram implementadas otimizações que permitem aumentar significativamente a eficiência da vinculação de operações aos núcleos da CPU.
- Foi adicionado suporte inicial para discos rígidos com múltiplos atuadores independentes (multi-actuator), permitindo acesso simultâneo a vários setores em diferentes zonas do disco magnético.
- Foi adicionada uma nova comando ioctl CDROM_TIMED_MEDIA_CHANGE para determinar eventos de troca de mídia na unidade de discos ópticos.
- O sistema de arquivos EROFS (Enhanced Read-Only File System) agora suporta a operação sobre vários dispositivos de armazenamento. Dispositivos diferentes podem ser espelhados em um único espaço de endereço de blocos de 32 bits. Também foi adicionado suporte para compressão usando o algoritmo LZMA.
- No sistema de arquivos F2FS, foram adicionadas opções de montagem para gerenciar a fragmentação de arquivos ao armazená-los (por exemplo, para depurar otimizações para armazenamento fragmentado).
- No CEPH, operações de criação e exclusão de diretórios estão habilitadas por padrão em modo assíncrono (para reverter ao comportamento anterior, use a flag ‘-o wsync’ ao montar). Adicionadas métricas para rastrear operações de cópia de objetos externos.
- No CIFS, foi adicionado o parâmetro de montagem tcpnodelay, que ativa o modo tcp_sock_set_nodelay no socket da rede, desativando a espera pelo preenchimento da fila na pilha TCP. Suporte para links DFS (Distributed File System) aninhados foi adicionado durante o remonte.
- Suporte a terminação de solicitações para dispositivos de bloco em modo de lote foi adicionado. Os testes dessa alteração mostraram um aumento na intensidade de operações de leitura aleatória de unidades Optane, de 6,1 a 6,6 milhões de IOPS em um único núcleo de CPU.
- Memória e serviços do sistema
- Uma nova chamada de sistema futex_waitv foi adicionada, permitindo monitorar o estado de vários futexes com uma única chamada de sistema. Essa funcionalidade é semelhante ao recurso disponível no Windows chamado WaitForMultipleObjects, cuja emulação por meio do futex_waitv pode ser útil para melhorar o desempenho de jogos do Windows executados sob Wine ou Proton. Além disso, aguardar vários futexes simultaneamente pode ser aplicado para otimizar o desempenho de implementações nativas de jogos para Linux.
- Foi implementada a conceito de folhetos de página de memória (page folios), cuja utilização em alguns subsistemas do núcleo permitirá acelerar a gestão de memória sob cargas típicas. Atualmente, o subsistema principal de gestão de memória no núcleo e a implementação do cache de páginas já foram convertidos em folhetos, e no futuro está previsto a conversão dos sistemas de arquivos. No futuro, também está planejada a adição de suporte para folhetos de múltiplas páginas no núcleo.
Os folhetos lembram páginas de memória compostas (compound pages), mas se diferenciam por sua semântica aprimorada e organização mais clara de funcionamento. Para a gestão da memória do sistema, a RAM disponível é subdividida em páginas de memória, cujo tamanho depende da arquitetura, mas em sistemas x86 é medido em quilobytes (geralmente 4096 bytes). Os sistemas modernos são equipados com dezenas de gigabytes de RAM, o que complica a gestão da memória devido à necessidade de processar um enorme número de páginas de memória. Para reduzir o número de páginas, a conceito de páginas compostas foi implementado anteriormente no núcleo, com estruturas que abrangem mais de uma página de memória física. No entanto, a API para manipulação dessas páginas compostas deixava a desejar e gerava custos adicionais.
- Foi adicionado ao escalonador de tarefas um manipulador que considera a clusterização do cache na CPU. Em alguns processadores, como o Kunpeng 920 (ARM) e o Intel Jacobsville (x86), um determinado número de núcleos da CPU, normalmente 4, pode combinar cache L3 ou L2. Considerar essas topologias pode aumentar significativamente a eficiência da distribuição de tarefas entre os núcleos da CPU no escalonador de tarefas, já que mover tarefas dentro de um mesmo cluster de CPU permite aumentar a largura de banda de acesso à memória e reduzir a concorrência no cache.
- Foi adicionada a suporte para as instruções AMX (Advanced Matrix Extensions), implementadas nos próximos processadores de servidor Intel Xeon Scalable, desenvolvidos sob o codinome Sapphire Rapids. AMX oferece novos registradores personalizáveis TMM 'TILE' e instruções para manipulação de dados nesses registradores, como TMUL (Tile matrix MULtiply) para multiplicação de matrizes.
- Foram implementadas várias novas funcionalidades, baseadas no subsistema DAMON (Data Access MONitor) adicionado na edição anterior, que permite monitorar o acesso a dados na memória RAM, vinculado ao processo selecionado que está operando no espaço do usuário. Por exemplo, o subsistema possibilita analisar quais áreas específicas da memória foram acessadas pelo processo ao longo de sua execução, e quais áreas permaneceram não utilizadas.
- DAMON_RECLAIM para identificar e desalojar áreas de memória que não foram acessadas. O mecanismo pode ser usado para a desalocação proativa e suave de páginas de memória quando se aproxima do esgotamento de memória livre.
- DAMOS (Data Access Monitoring-based Operation Schemes) para aplicar operações específicas, como madvise(), que liberam memória livre adicional, a áreas de memória do processo para as quais se registra uma certa frequência de acesso. A configuração dos parâmetros do DAMOS é feita através do debugfs.
- Capacidade de monitoramento do espaço de endereçamento físico da memória (anteriormente só era possível monitorar endereços virtuais).
- A implementação do algoritmo de compressão zstd foi atualizada para a versão 1.4.10, o que melhorou significativamente o desempenho de várias subsistemas do kernel que utilizam compressão (por exemplo, a descompactação da imagem do kernel foi acelerada em 35%, o desempenho da descompactação de dados comprimidos em Btrfs e SquashFS aumentou em 15%, enquanto no ZRAM foi de 30%). Inicialmente, o kernel utilizava uma implementação separada do zstd, baseada na versão 1.3.1, lançada há mais de três anos e que não incluía muitas otimizações importantes. Além da transição para a versão mais atual, o patch adicionado também simplifica a sincronização com o branch upstream do zstd, permitindo gerar código para inclusão no kernel diretamente do repositório principal do zstd. No futuro, o código do zstd no kernel será planejado para ser atualizado conforme novas versões da biblioteca zstd forem lançadas.
- Foi feita uma grande atualização no subsistema eBPF. Agora é possível chamar funções de módulos do kernel a partir de programas BPF. Implementada a função bpf_trace_vprintk(), que ao contrário da bpf_trace_printk(), permite imprimir mais de três argumentos de uma só vez. Adicionada uma nova estrutura de armazenamento de dados (BPF map) chamada bloom filter, que possibilita utilizar esta estrutura de dados probabilística para verificar a presença de um elemento em um conjunto. Incluído um novo atributo BTF_KIND_TAG, que pode ser usado em programas BPF para vincular tags a parâmetros de funções, facilitando a identificação de erros em programas do usuário. Na libbpf, agora é permitido criar seções personalizadas .rodata.* / .data.*, com suporte implementado para eventos de rastreamento uprobe e kprobe, e adicionado um API para copiar todos os tipos de BTF de um objeto para outro. O suporte ao AF_XDP foi separado da libbpf e movido para a biblioteca libxdp. Para a arquitetura MIPS, foi implementado um compilador JIT para a máquina virtual BPF.
- Para a arquitetura ARM64, foi implementado suporte para as extensões ARMv8.6 para o timer, incluindo funcionalidades que permitem a auto-sincronização da representação dos registros do sistema sem usar as instruções ISB.
- Para a arquitetura PA-RISC, foi introduzido o mecanismo KFENCE para detectar erros ao trabalhar com memória, além de suporte para o detector de condições de corrida KCSAN.
- Agora é possível configurar permissões de acesso ao tracefs em nível de usuários e grupos individuais; por exemplo, é possível permitir acesso às ferramentas de rastreamento apenas para membros de um grupo específico.
- Virtualização e segurança
- Nos subsistemas io_uring e device-mapper, foi implementado suporte para a geração de eventos de auditoria. No io_uring, agora é possível gerenciar o acesso através de módulos LSM. Implementada a auditoria da chamada de sistema openat2().
- O código do kernel foi completamente limpo de expressões de queda não controladas em switch (sem return ou break após cada bloco case). Ao compilar o kernel, agora será possível usar a opção '-Wimplicit-fallthrough'.
- Foram incluídas alterações para restringir as verificações de limites na execução da função memcpy().
- Na interface de entrada/saída assíncrona io_uring, foi implementada a aplicação de políticas de segurança definidas por módulos SELinux e Smack para operações de entrada/saída.
- No subsistema IMA (Arquitetura de Medição de Integridade), que permite que um serviço externo verifique o estado dos subsistemas do núcleo para garantir sua autenticidade, foi implementada a possibilidade de aplicar regras com base no identificador de grupo (GID) ao qual pertence o arquivo ou que envolve o usuário que está acessando o arquivo.
- Alguns mecanismos avançados de proteção de fluxo seccomp() contra ataques do tipo Spectre estão desativados por padrão, pois foram considerados excessivos e não aumentaram significativamente a segurança, mas impactaram negativamente a performance. O uso da proteção Retpoline foi revisado.
- A implementação do mecanismo cryptoloop foi removida, sendo substituída em 2004 pelo dm-crypt, que, se necessário, suporta os mesmos algoritmos.
- O acesso não privilegiado ao subsistema eBPF está desativado por padrão. Essa alteração foi feita para evitar o uso de programas BPF para contornar a proteção contra ataques de canais laterais. Se necessário, o administrador pode restaurar a capacidade de usuários não privilegiados de usar eBPF.
- O hipervisor ACRN, projetado para executar tarefas em tempo real e uso em sistemas críticos, agora suporta a criação / exclusão de dispositivos virtuais e o redirecionamento de dispositivos MMIO.
- O mecanismo criptográfico agora suporta definições KPP (Primitivas de Protocolo de Acordo de Chave), simplificando a lógica de desenvolvimento de drivers para sistemas criptográficos.
- Para o hipervisor Hyper-V, foi implementado suporte para o modo de isolamento máquinas virtuais, o que implica a criptografia do conteúdo da memória.
- No hipervisor KVM adicionada a suporte para a arquitetura RISC-V. Implementada a possibilidade de migração dentro do ambiente host de máquinas virtuais, executadas usando extensões AMD SEV e SEV-ES. Uma API para migração ao vivo de sistemas convidados, criptografados com AMD SEV (Virtualização Segura Criptografada), foi adicionada.
- Para a arquitetura PowerPC, o modo STRICT_KERNEL_RWX está ativado por padrão, bloqueando o uso de páginas de memória que estão disponíveis simultaneamente para gravação e execução.
- O suporte para conexão quente de memória (Memory hotplug) foi interrompido em sistemas x86 de 32 bits, que já estava inoperante há mais de um ano.
- A biblioteca liblockdep foi removida do núcleo, e agora será mantida separadamente do núcleo.
- Subsistema de Rede
- Foi implementada uma nova opção SO_RESERVE_MEM para sockets, que permite reservar uma quantidade específica de memória que sempre estará disponível para o socket e não será retirada. O uso dessa opção permite melhorar o desempenho ao reduzir as operações de alocação e liberação de memória na pilha de rede, especialmente em condições de escassez de memória no sistema.
- Adicionada a suporte ao protocolo de tunelamento automático de tráfego multicast (Automatic Multicast Tunneling, RFC 7450), que permite entregar o tráfego multicast de redes que suportam Multicast a receptores em redes sem Multicast. O protocolo funciona através da encapsulação em pacotes UDP.
- Melhorada a encapsulação de dados IOAM (In-situ Operations, Administration, and Maintenance) em pacotes de trânsito.
- Adicionada a capacidade de controlar os modos de consumo de energia dos transceptores na API netlink do ethtool.
- No subsistema netfilter foi implementada a possibilidade de classificação de pacotes no nível de egress, ou seja, na fase em que o driver recebe o pacote da pilha de rede do núcleo. No nftables, o suporte para filtros correspondentes foi adicionado na versão 1.0.1. O netfilter agora permite a correspondência e alteração dos cabeçalhos internos e dados para UDP e TCP (inner header / payload) que seguem o cabeçalho de transporte (transport header).
- Novos parâmetros sysctl arp_evict_nocarrier e ndisc_evict_nocarrier foram adicionados, onde a cache ARP e a tabela ndisc (neighbor discovery) serão limpas em caso de queda de conexão (NOCARRIER).
- O mecanismo de controle de filas de rede fq_codel (Controlled Delay) agora inclui modos de Low Latency, Low Loss e Scalable Throughput (L4S).
- Hardware
- No driver amdgpu, foi implementado suporte inicial para a especificação DP 2.0 (DisplayPort 2.0) e a capacidade de tunelamento de DisplayPort por meio do USB4. Para o APU Cyan Skillfish (equipados com GPU Navi 1x), foi adicionado suporte a controladores de display. O suporte para o APU Yellow Carp (processadores móveis Ryzen 6000 "Rembrandt") foi ampliado.
- No driver i915, foi estabilizado o suporte para chips Intel Alderlake S e implementado suporte para a tecnologia Intel PXP (Protected Xe Path), que permite a execução de uma sessão gráfica protegida em sistemas com chips Intel Xe.
- No driver nouveau, foram realizadas correções de bugs e melhorias no estilo de codificação.
- Adicionada suporte para CPUs Vortex compatíveis com x86 (Vortex86MX). O Linux funcionava anteriormente em tais processadores, mas a identificação explícita das CPUs mencionadas era necessária para desabilitar a proteção contra ataques Spectre/Meltdown, que não se aplicam aos chips mencionados.
- Adicionada suporte inicial para plataformas x86 Surface Pro 8 e Surface Laptop Studio.
- Adicionado driver para suporte a chips de áudio usados em APU AMD Yellow Carp, Van Gogh, além de suporte para sistemas de áudio e codecs Cirrus CS35L41, Maxim MAX98520/MAX98360A, Mediatek MT8195, Nuvoton NAU8821, NVIDIA Tegra210, NXP i.MX8ULP, Qualcomm AudioReach, Realtek ALC5682I-VS, RT5682S, RT9120, Rockchip RV1126 e RK3568.
- Adicionado driver ishtp_eclite para acesso a controladores integrados Intel PSE (Programmable Service Engine) através do protocolo ISHTP (Integrated Sensor Hub Transport Protocol), por exemplo, para obter dados sobre a bateria, temperatura e informações relacionadas ao UCSI (USB Type-C Connector System Software Interface).
- Adicionado driver para controladores de jogos Nintendo Switch, suportando dispositivos Switch Pro e Joy-Cons. Adicionada suporte para tablets Wacom Intuos BT (CTL-4100WL/CTL-6100WL) e o teclado Apple 2021 Magic Keyboard. Melhorada a compatibilidade com controladores Sony PlayStation DualSense. Adicionada suporte para botões laterais do mouse Xiaomi Mi.
- Adicionado driver RT89 com suporte para chips sem fio Realtek 802.11ax, bem como drivers para adaptadores Ethernet Asix AX88796C-SPI e switches Realtek RTL8365MB-VC.
- Para chips Apple M1, adicionados drivers para PCI e PASemi i2c.
- Adicionada suporte para SoCs ARM, dispositivos e placas Raspberry Pi Compute Module 4, Fairphone 4, Snapdragon 690, LG G Watch R, Sony Xperia 10 III, Samsung Galaxy S4 Mini Value Edition, Xiaomi MSM8996 (Mi 5, Mi Note 2, Mi 5s, Mi Mix, Mi 5s Plus e Xiaomi Mi 5), Sony Yoshino (Sony Xperia XZ1 e Sony Xperia XZ Premium), F(x)tec Pro1 QX1000, Microchip LAN966, CalAmp LMU5000, Exegin Q5xR5, sama7g5, Samsung ExynosAutov9, Rockchip RK3566, RK3399 ROCK Pi 4A+, RK3399 ROCK Pi 4B+, Firefly ROC-RK3328-PC, Firefly ROC-RK3399-PC-PLUS, ASUS Chromebook Tablet CT100, Pine64 Quartz64-A, Netgear GS110EMX, Globalscale MOCHAbin 7040, NXP S32G2, Renesas R8A779M*, Xilinx Kria, Radxa Zero, JetHub D1/H1, Netronix E70K02.
Fonte: opennet.ru
