Kernel do Linux 5.14

Kernel do Linux 5.14

Após dois meses de desenvolvimento, Linus Torvalds introduzido lançamento do kernel Linux 5.14. Entre as mudanças mais notáveis: novas chamadas de sistema quotactl_fd() e memfd_secret(), remoção de drivers ide e brutos, novo controlador de prioridade de E/S para cgroup, modo de agendamento de tarefas SCHED_CORE, infraestrutura para criação de carregadores de programas BPF verificados.

A nova versão inclui 15883 correções de 2002 desenvolvedores, o tamanho do patch é de 69 MB (as alterações afetaram 12580 arquivos, 861501 linhas de código foram adicionadas, 321654 linhas foram excluídas). Cerca de 47% de todas as alterações introduzidas na versão 5.14 estão relacionadas a drivers de dispositivos, aproximadamente 14% das alterações estão relacionadas à atualização de código específico para arquiteturas de hardware, 13% estão relacionadas à pilha de rede, 3% estão relacionadas a sistemas de arquivos e 3% estão relacionados aos subsistemas internos do kernel.

O principal inovações:

  • subsistema de disco, entrada/saída e sistemas de arquivos:
    • para cgrupo implementado novo controlador de prioridade de E/S - rq-qos, que pode controlar a prioridade de processamento de solicitações para bloquear dispositivos gerados por membros de cada cgroup. Novo suporte ao controlador de prioridade foi adicionado ao agendador de E/S mq-deadline;
    • no sistema de arquivos ext4 implementado novo comando ioctl EXT4_IOC_CHECKPOINT, que força todas as transações pendentes do log e buffers associados para o disco e também sobrescreve a área usada pelo log no armazenamento. A mudança foi preparada como parte de uma iniciativa para evitar vazamentos de informações de sistemas de arquivos;
    • em Btrfs introduzido Otimizações de desempenho: Ao eliminar o registro desnecessário de atributos estendidos durante a execução do fsync, o desempenho de operações intensivas com atributos estendidos aumentou em até 17%. Além disso, ao realizar operações de corte que não afetam as extensões, a sincronização total é desabilitada, o que reduziu o tempo de operação em 12%. Uma configuração foi adicionada ao sysfs para limitar a largura de banda de E/S ao verificar o FS. Adicionadas chamadas ioctl para cancelar operações de redimensionamento e exclusão de dispositivos;
    • em XFS retrabalhado implementação de um buffer cache, que é transferido para a alocação de páginas de memória em modo batch. Eficiência de cache aprimorada;
    • F2FS adicionou uma opção para trabalhar em modo somente leitura e implementou um modo de cache de bloco compactado (compress_cache) para melhorar o desempenho de leitura aleatória. Foi implementado suporte para compactação de arquivos mapeados na memória usando a operação mmap(). Para desabilitar seletivamente a compactação de arquivos por máscara, uma nova opção de montagem nocompress foi proposta;
    • foi feito trabalho no driver exFAT para melhorar a compatibilidade com o armazenamento de algumas câmeras digitais;
    • chamada de sistema adicionada quotactl_fd(), que permite gerenciar cotas não por meio de um arquivo de dispositivo especial, mas especificando um descritor de arquivo associado ao sistema de arquivos ao qual a cota é aplicada;
    • Drivers antigos para dispositivos de bloco com interface IDE foram removidos do kernel; eles foram substituídos há muito tempo pelo subsistema libata. O suporte para dispositivos antigos foi mantido por completo, as mudanças dizem respeito apenas à capacidade de usar drivers antigos, ao usar os quais as unidades eram chamadas de /dev/hd*, e não de /dev/sd*;
    • O driver “bruto” foi removido do kernel, fornecendo acesso sem buffer a dispositivos de bloco através da interface /dev/raw. Essa funcionalidade foi implementada há muito tempo em aplicativos que usam o sinalizador O_DIRECT;
  • memória e serviços do sistema:
    • um novo modo de agendamento foi implementado no agendador de tarefas SCHED_CORE, que permite controlar quais processos podem ser executados juntos no mesmo núcleo da CPU. A cada processo pode ser atribuído um identificador de cookie que define o escopo de confiança entre processos (por exemplo, pertencer ao mesmo usuário ou contêiner). Ao organizar a execução do código, o escalonador pode garantir que um núcleo da CPU seja compartilhado apenas entre processos associados ao mesmo proprietário, o que pode ser usado para bloquear alguns ataques Spectre, evitando que tarefas confiáveis ​​e não confiáveis ​​sejam executadas no mesmo thread SMT (Hyper Threading). ;
    • para o mecanismo cgroup, foi implementado suporte para a operação kill, que permite matar todos os processos associados ao grupo de uma vez (enviar SIGKILL) escrevendo “1” no arquivo virtual cgroup.kill;
    • capacidades expandidas relacionadas à resposta à detecção de bloqueios divididos (“bloqueios divididos”) que ocorrem ao acessar dados desalinhados na memória devido ao fato de que, ao executar uma instrução atômica, os dados cruzam duas linhas de cache da CPU. Esse bloqueio leva a uma queda significativa no desempenho, portanto, anteriormente era possível encerrar à força o aplicativo que causou o bloqueio. A nova versão adiciona o parâmetro de linha de comando do kernel “split_lock_detect=ratelimit:N”, que permite definir um limite para todo o sistema na taxa de operações de bloqueio por segundo, após exceder o qual qualquer processo que se tornou a fonte de um bloqueio dividido será ser forçado a parar por 20 ms em vez de encerrar;
    • O controlador de largura de banda cgroup CFS (controlador de largura de banda CFS), que determina quanto tempo de processador pode ser alocado para cada cgroup, tem a capacidade de definir limites limitados por uma determinada duração de ação, o que permite melhor regulação de cargas sensíveis à latência. Por exemplo, definir cpu.cfs_quota_us como 50000 e cpu.cfs_period_us como 100000 permitirá que um grupo de processos desperdice 100 ms de tempo de CPU a cada 50 ms;
    • adicionado infraestrutura inicial para criação de carregadores de programas BPF, que permitirá ainda o download apenas de programas BPF assinados com chave digital confiável;
    • adicionada uma nova operação futex FUTEX_LOCK_PI2, que utiliza um temporizador monotônico para calcular o timeout, que leva em consideração o tempo gasto pelo sistema em modo sleep;
    • para a arquitetura RISC-V, suporte para páginas de grande memória (Transparent Huge-Pages) e a capacidade de usar o KFENCE identificar erros ao trabalhar com memória;
    • na chamada de sistema madvise(), que fornece um meio de otimizar o gerenciamento de memória do processo, adicionado Sinalizadores MADV_POPULATE_READ e MADV_POPULATE_WRITE para gerar uma "falha de página" em todas as páginas de memória mapeadas para operações de leitura ou gravação, sem realizar uma leitura ou gravação real (pré-falha). O uso de flags pode ser útil para reduzir atrasos na execução do programa, graças à execução proativa do manipulador de “falha de página” para todas as páginas não alocadas de uma só vez, sem esperar pelo efetivo acesso a elas;
    • em um sistema de teste unitário cara adicionado suporte para execução de testes no ambiente QEMU;
    • novos rastreadores adicionados: "ruído"para rastrear atrasos de aplicativos causados ​​pelo tratamento de interrupções e" timerlat "para exibir informações detalhadas sobre atrasos ao acordar de um sinal de temporizador;
  • virtualização e segurança:
    • adicionado chamada de sistema memfd_secret(), que permite criar uma área de memória privada em um espaço de endereço isolado, visível apenas para o processo proprietário, não refletida em outros processos e não acessível diretamente ao kernel;
    • no sistema de filtragem de chamadas do sistema seccomp, ao mover manipuladores de bloqueio para o espaço do usuário, é possível usar uma operação atômica para criar um descritor de arquivo para uma tarefa isolada e retorná-lo ao processar uma chamada do sistema. A operação proposta resolve problema com interrupção do manipulador no espaço do usuário quando chega um sinal;
    • adicionado novo mecanismo para gerenciar a limitação de recursos no namespace do ID do usuário, que vincula contadores rlimit individuais a um usuário no "namespace do usuário". A mudança resolve o problema com o uso de contadores de recursos comuns quando um usuário executa processos em contêineres diferentes;
    • o hipervisor KVM para sistemas ARM64 adicionou a capacidade de usar a extensão MTE (MemTag, Memory Tagging Extension) em sistemas convidados, que permite vincular tags a cada operação de alocação de memória e organizar a verificação do uso correto de ponteiros para bloquear a exploração de vulnerabilidades causadas por acesso a blocos de memória já liberados, overflows de buffers, acessos antes da inicialização e uso fora do contexto atual;
    • A autenticação de ponteiro fornecida pela plataforma ARM64 agora pode ser configurada separadamente para kernel e espaço do usuário. A tecnologia permite usar instruções ARM64 especializadas para verificar endereços de retorno usando assinaturas digitais armazenadas nos bits superiores não utilizados do próprio ponteiro;
    • no modo de usuário Linux adicionado suporte para utilização de drivers para dispositivos PCI com barramento PCI virtual, implementado pelo driver PCI-over-virtio;
    • para sistemas x86, foi adicionado suporte para o dispositivo paravirtualizado virtio-iommu, que permite enviar solicitações IOMMU, como ATTACH, DETACH, MAP e UNMAP, através do transporte virtio sem emular tabelas de páginas de memória;
    • Para CPUs Intel, da família Skylake ao Coffee Lake, o uso de Intel TSX (Transactional Synchronization Extensions), que fornece ferramentas para melhorar o desempenho de aplicativos multithread, eliminando dinamicamente operações de sincronização desnecessárias, está desabilitado por padrão. As extensões estão desativadas devido à possibilidade de ataques carga zumbi, manipulando o vazamento de informações por canais de terceiros que ocorre durante o funcionamento do mecanismo de interrupção assíncrona de operações (TAA, TSX Asynchronous Abort);
  • subsistema de rede:
    • integração contínua no núcleo do MPTCP (MultiPath TCP), uma extensão do protocolo TCP para organizar a operação de uma conexão TCP com a entrega de pacotes simultaneamente ao longo de várias rotas através de diferentes interfaces de rede associadas a diferentes endereços IP. Na nova edição adicionado um mecanismo para definir suas próprias políticas de hash de tráfego para IPv4 e IPv6 (política de hash multipath), possibilitando a partir do espaço do usuário determinar quais campos dos pacotes, inclusive os encapsulados, serão utilizados no cálculo do hash que determina a escolha do caminho para o pacote;
    • suporte de soquete foi adicionado ao transporte virtual virtio SOCK_SEQPACKET (transmissão ordenada e confiável de datagramas);
    • Os recursos do mecanismo de soquete SO_REUSEPORT foram expandidos, o que permite que vários soquetes de escuta se conectem a uma porta ao mesmo tempo para receber conexões com a distribuição de solicitações recebidas simultaneamente em todos os soquetes conectados via SO_REUSEPORT, o que simplifica a criação de aplicativos de servidor multithread. . Na nova versão adicionado meios de transferência de controle para outro soquete em caso de falha no processamento de uma solicitação pelo soquete inicialmente selecionado (resolve o problema de perda de conexões individuais ao reiniciar serviços);
  • equipamento:
    • no driver amdgpu implementado suporte para a nova série de GPUs AMD Radeon RX 6000, codinome “Beige Goby” (Navi 24) e “Yellow Carp”, bem como suporte aprimorado para GPU Aldebaran (gfx90a) e APU Van Gogh. Adicionada a capacidade de trabalhar simultaneamente com vários painéis eDP. Para APU Renoir, foi implementado suporte para trabalhar com buffers criptografados em memória de vídeo (TMZ, Trusted Memory Zone). Adicionado suporte para placas gráficas hot-unplug. Para GPUs Radeon RX 6000 (Navi 2x) e GPUs AMD mais antigas, o suporte para o mecanismo de economia de energia ASPM (Active State Power Management) é habilitado por padrão, que anteriormente era habilitado apenas para GPUs Navi 1x, Vega e Polaris;
    • para chips AMD, foi adicionado suporte para memória virtual compartilhada (SVM, memória virtual compartilhada) baseada no subsistema HMM (gerenciamento de memória heterogênea), que permite a utilização de dispositivos com unidades de gerenciamento de memória próprias (MMU, unidade de gerenciamento de memória), que pode acessar a memória principal. Inclusive usando HMM, você pode organizar um espaço de endereço compartilhado entre a GPU e a CPU, no qual a GPU pode acessar a memória principal do processo;
    • adicionado suporte tecnológico inicial Mudança Inteligente AMD, que altera dinamicamente os parâmetros de consumo de energia da CPU e GPU em laptops com chipset e placa gráfica AMD para aumentar o desempenho em jogos, edição de vídeo e renderização 3D;
    • no driver i915 para placas de vídeo Intel está incluído suporte para chips Intel Alderlake P;
    • adicionado driver drm/hyperv para o adaptador gráfico virtual Hyper-V;
    • adicionado driver gráfico simpledrm que usa o framebuffer EFI-GOP ou VESA fornecido pelo firmware UEFI ou BIOS para saída. O principal objetivo do driver é fornecer recursos de saída gráfica durante os estágios iniciais de inicialização, antes que um driver DRM completo possa ser usado. O driver também pode ser utilizado como solução temporária para equipamentos que ainda não possuem drivers DRM nativos;
    • adicionado suporte de computador tudo-em-um Raspberry Pi 400;
    • Adicionado driver dell-wmi-privacy para oferecer suporte aos switches de hardware de câmera e microfone incluídos em laptops Dell;
    • para notebooks Lenovo adicionado Interface WMI para alterar parâmetros do BIOS via sysfs /sys/class/firmware-attributes/;
    • expandido suporte para dispositivos com interface USB4;
    • adicionado suporte para placas de som e codecs AmLogic SM1 TOACODEC, Intel AlderLake-M, NXP i.MX8, NXP TFA1, TDF9897, Rockchip RK817, Qualcomm Quinary MI2 e Texas Instruments TAS2505. Suporte de áudio aprimorado em laptops HP e ASUS. Adicionado patches para reduzir atrasos antes que o áudio comece a ser reproduzido em dispositivos com interface USB.

Fonte – opennet.ru.

Fonte: linux.org.ru