Após dois meses de desenvolvimento, Linus Torvalds apresentou o lançamento do kernel Linux 5.15. Entre as mudanças mais notáveis estão: um novo driver NTFS com suporte para gravação, o módulo ksmbd implementando um servidor SMB, o subsistema DAMON para monitoramento de acesso à memória, primitivas de bloqueio para modo de tempo real, suporte a fs-verity no Btrfs, a chamada de sistema process_mrelease para sistemas de resposta à falta de memória, e o módulo de atestação remota dm-ima.
A nova versão incluiu 13.499 correções de 1.888 desenvolvedores, com o tamanho do patch sendo de 42 MB (as mudanças abrangeram 10.895 arquivos, adicionando 632.522 linhas de código e removendo 299.966 linhas). Cerca de 45% de todas as mudanças apresentadas no 5.15 estão relacionadas a drivers de dispositivos, aproximadamente 14% estão ligadas à atualização de código específico de arquiteturas de hardware, 14% estão relacionadas à pilha de rede, 6% a sistemas de arquivos e 3% a subsistemas internos do kernel.
Principais novidades:
- Subsistema de disco, entrada/saída e sistemas de arquivos
- Um novo driver do sistema de arquivos NTFS, desenvolvido pela Paragon Software, foi aceito no kernel. O novo driver pode operar em modo de gravação e suporta todas as funcionalidades da versão atual do NTFS 3.1, incluindo atributos de arquivo estendidos, listas de controle de acesso (ACL), modo de compressão de dados, manipulação eficiente de vazios em arquivos (sparse) e reprodução de alterações do log para restaurar a integridade após falhas.
- O sistema de arquivos Btrfs implementou suporte ao mecanismo fs-verity, utilizado para controle transparente de integridade e autenticidade de arquivos individuais com base em hashes ou chaves criptográficas associadas armazenadas na área de metadados. Anteriormente, o fs-verity estava disponível apenas para os sistemas de arquivos Ext4 e F2fs.
O Btrfs também introduziu suporte para o mapeamento de identificadores de usuários em sistemas de arquivos montados (anteriormente suportado apenas para sistemas de arquivos FAT, ext4 e XFS). Essa funcionalidade permite associar arquivos de um determinado usuário em uma partição montada de forma estranha a outro usuário no sistema atual.
Entre as outras mudanças no Btrfs: aumento na velocidade de adição de chaves no índice de diretório para melhorar o desempenho da criação de arquivos; a capacidade de operar raid0 com um único dispositivo e raid10 com dois (por exemplo, durante a reconfiguração da matriz); a opção "rescue=ibadroots" para ignorar uma árvore de extensões incorreta; aceleração da operação "send"; redução de conflitos de bloqueio durante operações de renomeação; possibilidade de utilizar setores de 4K em sistemas com o tamanho da página de memória de 64K.
- No XFS, foi estabilizada a possibilidade de uso de FS para datas após 2038. Implementado um mecanismo de desativação tardia de inode e suporte para definição e remoção tardia de atributos de arquivos. Para evitar problemas, a possibilidade de desativar cotas de disco para partições já montadas foi removida (as cotas podem ser desativadas forçosamente, mas o cálculo associado continuará, portanto, para uma desativação completa, o remonte é necessário).
- No EXT4, foram realizados trabalhos para aumentar o desempenho da gravação de buffers delalloc e do processamento de arquivos órfaros (orphan) que continuam a existir porque estão abertos, mas não estão vinculados a um diretório. O processamento de operações de descarte foi movido do fluxo jbd2 kthread para evitar bloqueios nas operações com metadados.
- No F2FS, foi adicionada a opção "discard_unit=block|segment|section" para vincular operações de descarte (marcação de blocos liberados que já podem não ser mantidos fisicamente) ao alinhamento em relação a bloco, setor, segmento ou seção. Adicionado suporte para rastreamento de mudanças nas latências de entrada/saída.
- No sistema de arquivos EROFS (Extendable Read-Only File System), foi adicionado suporte para entrada/saída direta para arquivos salvos sem compressão, bem como suporte para fiemap.
- No OverlayFS, foi implementado o tratamento correto das flags de montagem "immutable", "append-only", "sync" e "noatime".
- No NFS, foi melhorado o tratamento de situações em que o servidor NFS parou de responder a solicitações. Adicionada a possibilidade de montagem a partir de um endereço de rede já em uso, mas acessível por outro. servidor, mas acessível através de outro endereço de rede.
- Começou a preparação para reescrever a subsistema FSCACHE.
- Adicionado suporte para partições EFI com disposição não padrão das tabelas GPT.
- No mecanismo fanotify, foi implementada uma nova flag FAN_REPORT_PIDFD, que leva à indicação de pidfd entre os metadados retornados. O pidfd ajuda a lidar com situações de reutilização de PID para uma identificação mais precisa dos processos que acessam arquivos monitorados (o pidfd está vinculado a um processo específico e não muda, enquanto o PID pode ser atribuído a outro processo após a conclusão do processo atual associado a esse PID).
- A chamada do sistema move_mount() agora permite adicionar pontos de montagem a grupos compartilhados existentes, resolvendo problemas com a preservação e recuperação do estado dos processos na ferramenta CRIU quando existem múltiplos espaços de montagem compartilhados em contêineres isolados.
- Foi adicionada proteção contra estados de corrida ocultos que poderiam potencialmente levar à corrupção de arquivos ao realizar leituras do cache durante o processamento de lacunas no arquivo.
- O suporte a bloqueios obrigatórios (mandatory) de arquivos, realizados através de chamadas de sistema que alteram arquivos, foi encerrado. Devido a possíveis estados de corrida, esses bloqueios eram considerados não confiáveis e foram classificados como obsoletos há anos.
- O subsistema LightNVM, que permitia acesso direto ao SSD, contornando a camada de emulação, foi removido. O LightNVM perdeu seu significado após o surgimento dos padrões NVMe, que preveem a possibilidade de zonificação (ZNS, Zoned Namespace).
- Memória e serviços do sistema
- Foi implementado o subsistema DAMON (Data Access MONitor), que permite monitorar a atividade relacionada ao acesso a dados na memória RAM, em relação a um processo selecionado em execução no espaço do usuário. O subsistema permite analisar a quais áreas de memória o processo acessou durante seu tempo de execução e quais áreas permaneceram não utilizadas. Entre as características do DAMON, destaca-se a baixa carga no CPU, baixo consumo de memória, alta precisão e sobrecargas constantes previsíveis, independentes do tamanho. O subsistema pode ser utilizado pelo kernel para otimizar a gestão de memória, bem como por utilitários no espaço do usuário para entender o que o processo está fazendo e otimizar o uso da memória, por exemplo, liberando memória excessiva para o sistema.
- Foi implementada a chamada de sistema process_mrelease, que permite acelerar o processo de liberação de memória de um processo que está sendo finalizado. Em condições normais, a liberação de recursos e a finalização de um processo não ocorrem instantaneamente e podem ser adiadas por vários motivos, o que prejudica o funcionamento de sistemas de resposta rápida à falta de memória, como o oomd (fornecido pelo systemd) e o lmkd (utilizado no Android). Com a chamada process_mrelease, esses sistemas podem iniciar de forma mais previsível o retorno de memória de processos finalizados forçosamente.
- Da ramificação do núcleo PREEMPT_RT, onde é desenvolvida a suportação para operação em tempo real, foram transferidas as variantes de primitivos para organização de bloqueios mutex, ww_mutex, rw_semaphore, spinlock e rwlock, baseados no subsistema RT-Mutex. Na alocadora SLUB slab, foram adicionadas alterações que melhoram a operação no modo PREEMPT_RT e reduzem o impacto nas interrupções.
- No cgroup, foi adicionada a suportação para o atributo do planejador de tarefas SCHED_IDLE, permitindo atribuir essa característica a todos os processos do grupo que pertencem a um determinado cgroup. Ou seja, esses processos serão executados apenas quando não houver outras tarefas no sistema aguardando execução. Ao contrário da configuração do atributo SCHED_IDLE para cada processo individualmente, ao vincular SCHED_IDLE a um cgroup, o peso relativo das tarefas dentro do grupo é considerado ao escolher uma tarefa para execução.
- O mecanismo de contabilização do consumo de memória no cgroup foi ampliado para permitir o rastreamento de estruturas de dados adicionais do núcleo, incluindo aquelas criadas para polling, processamento de sinais e espaços de nomes.
- Foi adicionada a suportação para programação assimétrica de vinculação de tarefas aos núcleos de processadores em arquiteturas nas quais alguns CPUs permitem a execução de tarefas de 32 bits, enquanto outros funcionam apenas em modo de 64 bits (por exemplo, ARM). O novo modo permite que na programação da execução de tarefas de 32 bits, apenas CPUs que suportam tarefas de 32 bits sejam consideradas.
- Na interface de entrada/saída assíncrona io_uring, foi adicionado suporte para abrir arquivos diretamente na tabela de índice fixed-file, sem utilizar um descritor de arquivo, o que possibilita acelerar consideravelmente alguns tipos de operações, mas contraria o processo tradicional do Unix de usar descritores de arquivo para abrir arquivos.
No io_uring para a subsistema BIO (Block I/O Layer), foi implementado um novo mecanismo de reciclagem ('BIO recycling'), permitindo reduzir o overhead no gerenciamento da memória interna e aumentar em aproximadamente 10% o número de operações de entrada/saída processadas por segundo. O io_uring também ganhou suporte para chamadas de sistema mkdirat(), symlinkat() e linkat().
- Para programas BPF, foi implementada a capacidade de solicitar e processar eventos de temporizador. Um iterador para sockets UNIX foi adicionado, bem como a possibilidade de obter e definir opções de sockets para setsockopt. O BTF dumper agora possui suporte para tipos de dados tipados.
- Em sistemas NUMA com diferentes tipos de memória, variando em desempenho, em situações de esgotamento de espaço livre, foi implementada a transferência de páginas de memória expelidas da memória dinâmica (DRAM) para a memória persistente (Persistent Memory) ao invés de deletar essas páginas. Testes mostraram que essa tática geralmente melhora o desempenho em tais sistemas. Para NUMA, também foi implementada a capacidade de alocar páginas de memória para um processo de um conjunto selecionado de nós NUMA.
- Para a arquitetura ARC, foi implementado suporte a tabelas de páginas de três e quatro níveis, o que permitirá posteriormente apoiar processadores ARC de 64 bits.
- Para a arquitetura s390, foi adicionada a possibilidade de aplicar o mecanismo KFENCE para detectar erros no gerenciamento de memória, além de ter sido adicionado suporte para o detector de condições de corrida KCSAN.
- Foi adicionada a capacidade de indexar a lista de mensagens exibidas através do printk(), permitindo extrair todas essas mensagens de uma vez e monitorar alterações no espaço do usuário.
- No mmap(), o suporte à opção VM_DENYWRITE foi encerrado, e o código do núcleo foi removido do uso do modo MAP_DENYWRITE, o que reduziu o número de situações que levam ao bloqueio da gravação em arquivo com o erro ETXTBSY.
- Foi adicionado um novo tipo de verificação chamado "Event probes" ao subsistema de rastreamento, que pode ser vinculado a eventos de rastreamento existentes, definindo seu próprio formato de saída.
- Ao compilar o núcleo utilizando o compilador Clang, agora o assembler embutido do projeto LLVM é utilizado por padrão.
- Dentro do projeto de remoção de código no núcleo que gera avisos para o compilador, foi realizado um experimento para ativar por padrão o modo "-Werror", onde os avisos do compilador são tratados como erros. Durante a preparação da versão 5.15, Linus começou a aceitar apenas mudanças que não gerassem avisos durante a compilação do núcleo e ativou a compilação com "-Werror", mas depois concordou que essa decisão era prematura e adiou a ativação de "-Werror" por padrão. O controle da ativação da flag "-Werror" na compilação é feito através do parâmetro WERROR, que por padrão está definido como COMPILE_TEST, ou seja, ativado apenas para compilações de teste.
- Virtualização e segurança
- Foi adicionado um novo manipulador dm-ima ao Device Mapper (DM) com a implementação do mecanismo de atestado remoto baseado no subsistema IMA (Integrity Measurement Architecture), permitindo que um serviço externo verifique o estado dos subsistemas do núcleo para garantir sua autenticidade. Na prática, o dm-ima permite criar, através do Device Mapper, armazenamentos vinculados a sistemas de nuvem externos, onde é verificada a autenticidade da configuração de execução do DM target com o uso do IMA.
- Uma nova opção PR_SPEC_L1D_FLUSH foi implementada no prctl(), que, quando ativada, faz com que o núcleo comece a apagar o conteúdo do cache de nível 1 (L1D) toda vez que há uma troca de contexto. Esse modo permite implementar proteção adicional, de forma seletiva, para os processos mais importantes contra ataques de canais laterais, que visam descobrir dados armazenados no cache devido a vulnerabilidades ocasionadas pela execução especulativa de instruções na CPU. O custo de ativar o PR_SPEC_L1D_FLUSH (que por padrão não está ativado) é uma queda significativa na performance.
- Implementada a capacidade de compilar o núcleo com a adição da flag «-fzero-call-used-regs=used-gpr» no GCC, garantindo que todos os registradores sejam zerados antes do retorno do controle da função. Essa opção permite proteger contra vazamentos de informações a partir de funções e reduzir em 20% o número de blocos que podem ser usados na construção de gadgets ROP (Return-Oriented Programming) em exploits.
- Implementada a capacidade de compilar núcleos para a arquitetura ARM64 na forma de clientes para o hipervisor Hyper-V.
- Proposto um novo framework para o desenvolvimento de drivers «VDUSE», que permite implementar dispositivos de bloco virtuais no espaço do usuário e aplicar Virtio como meio de transporte para acesso a partir de sistemas convidados.
- Adicionado o driver Virtio para o barramento I2C, que possibilita emular controladores I2C em modo de paravirtualização utilizando backends distintos.
- Adicionado o driver gpio-virtio, permitindo que sistemas convidados acessem as linhas GPIO fornecidas pelo sistema host.
- Adicionada a possibilidade de restringir o acesso às páginas de memória para drivers de dispositivos com suporte a DMA em sistemas sem I/O MMU (unidade de gerenciamento de memória).
- No hipervisor KVM, implementada a capacidade de gerar estatísticas na forma de histogramas lineares e logarítmicos.
- Subsistema de Rede
- O módulo ksmbd foi adicionado ao núcleo, implementando um servidor de arquivos que utiliza o protocolo SMB3. O módulo complementa a implementação anterior do cliente SMB já disponível no núcleo e, ao contrário do servidor SMB que opera no espaço do usuário, é mais eficiente em termos de desempenho, consumo de memória e integração com recursos avançados do núcleo. Ksmbd é apresentado como uma extensão de alto desempenho e pronta para uso em dispositivos incorporados, integrável com ferramentas e bibliotecas Samba, se necessário. Destaca-se a melhoria no suporte à tecnologia de cache de arquivos distribuído (SMB leases) em sistemas locais, permitindo uma redução significativa no tráfego. No futuro, está planejada a adição de suporte a RDMA (smbdirect) e extensões do protocolo relacionadas ao fortalecimento da confiabilidade da criptografia e verificação por assinaturas digitais.
- No cliente CIFS, o suporte ao NTLM e a algoritmos de autenticação menos confiáveis, baseados no algoritmo DES e utilizados no protocolo SMB1, foi descontinuado.
- Na implementação de pontes de rede para VLAN, o suporte a multicast foi adicionado.
- No driver bonding, utilizado para agregar interfaces de rede, foi adicionado suporte ao subsistema XDP (eXpress Data Path), permitindo manipular pacotes de rede antes de seu processamento pela pilha de rede do núcleo Linux.
- No stack wireless mac80211, foi adicionado suporte a 6GHZ STA (Autorização Temporária Especial) nos modos LPI, SP e VLP, bem como a possibilidade de definir TWT (Target Wake Time) separados no modo ponto de acesso.
- Foi adicionado suporte ao protocolo MCTP (Management Component Transport Protocol), utilizado para a interação entre controladores de gestão e dispositivos associados (processadores host, dispositivos periféricos, etc.).
- A integração do MPTCP (MultiPath TCP) no núcleo foi continuada, um protocolo TCP expandido para organizar a operação de conexões TCP com entrega de pacotes simultaneamente por vários caminhos através de diferentes interfaces de rede, vinculadas a diferentes endereços IP. Na nova versão, foi adicionado suporte a endereços em modo fullmesh.
- No netfilter foram adicionados manipuladores de fluxos de rede encapsulados no protocolo SRv6 (Segment Routing IPv6).
- Foi adicionado suporte a sockmap para sockets Unix stream.
- Hardware
- No driver amdgpu, foi adicionado suporte ao APU Cyan Skillfish (equipados com GPU Navi 1x). Para o APU Yellow Carp, foi adicionado suporte a codecs de vídeo. O suporte à GPU Aldebaran foi melhorado. Novos identificadores para placas baseadas na GPU Navi 24 "Beige Goby" e RDNA2 foram adicionados. Foi proposta uma implementação melhorada de telas virtuais (VKMS). O rastreamento da temperatura dos chips AMD Zen 3 foi implementado.
- No driver amdkfd (para GPUs discretas, como Polaris), foi implementado um gerenciador de memória virtual compartilhada (SVM, shared virtual memory) com base na subsistema HMM (Heterogeneous memory management), permitindo usar dispositivos com suas próprias unidades de gerenciamento de memória (MMU, memory management unit), que podem acessar a memória principal. Com o HMM, é possível organizar um espaço de endereço conjunto entre GPU e CPU, no qual a GPU pode acessar a memória principal do processo.
- No driver i915 para placas gráficas Intel, foi ampliado o uso do gerenciador de vídeo TTM e incluída a capacidade de gerenciamento de energia com base no GuC (Graphics micro Controller). A preparação para implementar suporte à placa gráfica Intel ARC Alchemist e GPU Intel Xe-HP começou.
- O driver nouveau implementa o controle da retroiluminação de painéis eDP através do DPCD (Dados de Configuração DisplayPort).
- O driver msm adicionou suporte para GPU Adreno 7c Gen 3 e Adreno 680.
- Implementado o driver IOMMU para o chip Apple M1.
- Adicionado o driver de áudio para sistemas baseados em APU AMD Van Gogh.
- Na branch staging, foi adicionado o driver Realtek R8188EU, que substituiu a versão antiga do driver (rtl8188eu) para chips sem fio Realtek RTL8188EU 802.11 b/g/n.
- Foi aceito o driver ocp_pt para a placa PCIe em desenvolvimento pela Meta (Facebook), com implementação de relógios atômicos miniaturizados e receptor GNSS, que podem ser usados para organizar operações de servidores sincronização de tempo preciso.
- Adicionado suporte para smartphones Sony Xperia 10II (Snapdragon 665), Xiaomi Redmi 2 (Snapdragon MSM8916), Samsung Galaxy S3 (Snapdragon MSM8226), Samsung Gavini/Codina/Kyle.
- Adicionado suporte para SoCs ARM e placas NVIDIA Jetson TX2 NX Developer Kit, Sancloud BBE Lite, PicoITX, DRC02, SolidRun SolidSense, SKOV i.MX6, Nitrogen8, Traverse Ten64, GW7902, Microchip SAMA7, Qualcomm Snapdragon SDM636/SM8150, Renesas R-Car H3e-2G/M3e-2G, Marvell CN913x, ASpeed AST2600 (placas de servidor Facebook Cloudripper, Elbert e Fuji), 4KOpen STiH418-b2264.
- Adicionado suporte para painéis LCD Gopher 2b, EDT ETM0350G0DH6/ETMV570G2DHU, LOGIC Technologies LTTD800480070-L6WH-RT, Multi-Innotechnology MI1010AIT-1CP1, Innolux EJ030NA 3.0, ilitek ili9341, E Ink VB3300-KCA, Samsung ATNA33XC20, Samsung DB7430, WideChips WS2401.
- Adicionado o driver LiteETH com suporte para controladores Ethernet usados em SoCs programáveis LiteX (para FPGA).
- No driver usb-audio, foi adicionada a opção lowlatency para gerenciar a ativação em modo de atrasos mínimos. Também foi adicionada a opção quirk_flags para transmitir configurações específicas do dispositivo.
Ao mesmo tempo, a Fundação de Software Livre da América Latina formou uma versão completamente livre do núcleo 5.15 — Linux-libre 5.15-gnu, limpa de elementos de firmware e drivers que contêm componentes não livres ou trechos de código cuja aplicação é restrita pelo fabricante. Na nova versão, um log de mensagem foi implementado para concluir a limpeza. Problemas na formação de pacotes usando o mkspec foram resolvidos, e o suporte a pacotes snap foi aprimorado. Alguns avisos gerados durante o processamento do arquivo de cabeçalho firmware.h foram removidos. A saída de certos tipos de avisos ("format-extra-args", comentários, funções e variáveis não utilizadas) é permitida ao compilar no modo "-Werror". A limpeza do driver gehc-achc foi adicionada. O código de limpeza de blobs nos drivers e subsistemas adreno, btusb, btintel, brcmfmac e aarch64 qcom foi atualizado. A limpeza dos drivers prism54 (removido) e rtl8188eu (substituído por r8188eu) foi interrompida.
Fonte: opennet.ru
