Rilascio del kernel Linux 5.16

Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.16. Tra i cambiamenti più notevoli: la chiamata di sistema futex_waitv per migliorare le prestazioni dei giochi Windows in Wine, il tracciamento degli errori nel FS tramite fanotify, il concetto di folio nel sistema di gestione della memoria, il supporto per le istruzioni del processore AMX, la possibilità di riservare memoria per socket di rete, supporto per la classificazione dei pacchetti nella fase "egress" di netfilter, utilizzo del sottosistema DAMON per eliminare in modo proattivo aree di memoria inutilizzate, migliore gestione dei sovraccarichi con un grande volume di operazioni di scrittura, supporto per dischi rigidi multi-drive.

La nuova versione include 15415 correzioni da 2105 sviluppatori, la dimensione della patch è di 45 MB (le modifiche hanno interessato 12023 file, sono state aggiunte 685198 righe di codice, 263867 righe sono state cancellate). Circa il 44% di tutte le modifiche introdotte nella versione 5.16 sono correlate ai driver di dispositivo, circa il 16% delle modifiche è correlato all'aggiornamento del codice specifico delle architetture hardware, il 16% è correlato allo stack di rete, il 4% è correlato ai file system e il 4% sono legati ai sottosistemi interni del kernel.

Principali innovazioni nel kernel 5.16:

  • Sottosistema disco, I/O e file system
    • Sono stati aggiunti strumenti al meccanismo di fanotify per monitorare lo stato del file system e tenere traccia del verificarsi di errori. Le informazioni sugli errori vengono trasmesse utilizzando un nuovo tipo di eventi: FAN_FS_ERROR, che può essere intercettato nei sistemi di monitoraggio in esecuzione nello spazio utente per informare tempestivamente l'amministratore o avviare processi di ripristino. Quando si verificano una serie di errori a cascata, fanotify garantisce che il primo messaggio di errore venga consegnato insieme a un contatore di problemi generale per semplificare la successiva analisi della causa dell'errore. Il supporto per il tracciamento degli errori è attualmente implementato solo per il file system Ext4.
    • Gestione migliorata della congestione della scrittura, che si verifica quando il volume delle operazioni di scrittura supera la velocità effettiva dell'unità e il sistema è costretto a bloccare le richieste di scrittura di un processo fino al completamento delle richieste già inviate. Nella nuova versione, il meccanismo del kernel utilizzato per ottenere informazioni sul verificarsi di sovraccarico e blocco delle attività è stato completamente riprogettato, poiché nella vecchia implementazione c'erano problemi con l'accoppiamento dell'elaborazione del sovraccarico di scrittura con lo spostamento delle pagine di memoria nello swap sezione quando la memoria nel sistema non è sufficiente.
    • Btrfs implementa il supporto per la tecnologia di zonizzazione dei dispositivi (Zoned Namespace), utilizzata nei dischi rigidi o negli SSD NVMe per dividere lo spazio di archiviazione in zone, che costituiscono gruppi di blocchi o settori, in cui è consentita solo l'aggiunta sequenziale di dati, aggiornando l'intero gruppo di blocchi. Inoltre, sono state apportate piccole ottimizzazioni al logging degli inode, che hanno aumentato il throughput nel test dbench del 3% e ridotto la latenza dell'11%. Il meccanismo di registrazione delle directory è stato riprogettato, in cui il numero di operazioni di ricerca e blocco nell'albero è stato ridotto per aumentare l'efficienza. L'inserimento degli elementi nella struttura btree in modalità batch è stato accelerato (il tempo per l'inserimento in blocco degli elementi è stato ridotto del 4% e la cancellazione del 12%). Aggiunto supporto limitato per l'utilizzo della compressione durante la scrittura di pagine parziali, nonché la possibilità di deframmentare le sottopagine. Sono stati fatti i preparativi per abilitare il supporto per la seconda versione del protocollo per il comando "invia".
    • Il file system XFS riduce il consumo di memoria utilizzando slice cache separate per gli elementi utilizzati di frequente e riducendo alcune strutture di dati.
    • Nel file system Ext4 vengono annotate solo le correzioni di bug e un calcolo più accurato dei parametri di inizializzazione pigra della tabella Inode.
    • Sono state implementate ottimizzazioni a livello di dispositivo a blocchi per aumentare significativamente l'efficienza del collegamento delle operazioni ai core della CPU.
    • Aggiunto il supporto iniziale per dischi rigidi con più unità indipendenti (multi-attuatore), rendendo possibile l'accesso simultaneo a più settori in diverse aree del piatto magnetico.
    • Aggiunto un nuovo comando ioctl CDROM_TIMED_MEDIA_CHANGE per rilevare eventi di modifica del supporto in un'unità disco ottico.
    • Il file system EROFS (Enhanced Read-Only File System) ha aggiunto la possibilità di lavorare su più dispositivi di archiviazione. Diversi dispositivi possono essere mappati su un singolo spazio di indirizzi a blocchi da 32 bit. È stato aggiunto anche il supporto per la compressione utilizzando l'algoritmo LZMA.
    • Sono state aggiunte opzioni di montaggio al file system F2FS per controllare la frammentazione dei file quando vengono inseriti nell'archivio (ad esempio, per eseguire il debug delle ottimizzazioni per lavorare con l'archiviazione frammentata).
    • CEPH abilita la creazione e l'eliminazione di directory asincrone per impostazione predefinita (utilizzare il flag '-o wsync' durante il montaggio per ripristinare il vecchio comportamento). Aggiunta manutenzione delle metriche che tengono traccia delle operazioni di copia di oggetti esterni.
    • Un parametro di montaggio tcpnodelay è stato aggiunto a CIFS, che imposta la modalità tcp_sock_set_nodelay per il socket di rete, che disabilita l'attesa che la coda riempia lo stack TCP. Aggiunto supporto per collegamenti DFS nidificati (file system distribuito) durante il rimontaggio.
    • Aggiunto il supporto per completare le richieste a un dispositivo a blocchi in modalità batch. I test della modifica hanno mostrato un aumento dell'intensità delle operazioni di lettura casuale dalle unità Optane da 6.1 a 6.6 milioni di IOPS su un singolo core della CPU.
  • Servizi di memoria e di sistema
    • Aggiunta una nuova chiamata di sistema futex_waitv, che consente di monitorare lo stato di più futex contemporaneamente utilizzando un'unica chiamata di sistema. Questa funzionalità ricorda la funzionalità WaitForMultipleObjects disponibile in Windows, la cui emulazione tramite futex_waitv può essere utile per migliorare le prestazioni dei giochi Windows eseguiti con Wine o Proton. Inoltre, l'attesa simultanea dei futex può essere utilizzata anche per ottimizzare le prestazioni delle build native dei giochi per Linux.
    • È stato implementato il concetto di folio di pagina, il cui utilizzo in alcuni sottosistemi del kernel accelererà la gestione della memoria con carichi di lavoro tipici. Attualmente, il sottosistema principale di gestione della memoria nel kernel e l'implementazione della cache delle pagine sono già stati trasferiti sui folio, e si prevede che i file system verranno trasferiti in futuro. In futuro si prevede anche di aggiungere al kernel il supporto per i folio multipagina.

      I tomi assomigliano a pagine composte, ma hanno una semantica migliorata e un'organizzazione del lavoro più chiara. Per gestire la memoria di sistema, la RAM disponibile è divisa in pagine di memoria, la cui dimensione varia in base all'architettura, ma sui sistemi x86 viene misurata in kilobyte (tipicamente 4096 byte). I sistemi moderni sono dotati di decine di gigabyte di RAM, il che rende la gestione della memoria più complessa a causa della necessità di elaborare un numero enorme di pagine di memoria. Per ridurre il numero di pagine, il kernel aveva precedentemente implementato il concetto di pagine composte con strutture che si estendevano su più di una pagina fisica di memoria. Ma l'API per la manipolazione delle pagine di memoria unite lasciava molto a desiderare e comportava un sovraccarico aggiuntivo.

    • È stato aggiunto un gestore all'utilità di pianificazione che tiene conto del clustering della cache sulla CPU. In alcuni processori, come Kunpeng 920 (ARM) e Intel Jacobsville (x86), un certo numero di core della CPU, solitamente 4, può combinare la cache L3 o L2. Prendere in considerazione tali topologie può migliorare in modo significativo l'efficienza della distribuzione delle attività tra i core della CPU nell'utilità di pianificazione, poiché lo spostamento delle attività all'interno dello stesso cluster di CPU consente di aumentare il throughput di accesso alla memoria e ridurre il conflitto della cache.
    • Aggiunto il supporto per le istruzioni AMX (Advanced Matrix Extensions) implementate nei prossimi processori server scalabili Intel Xeon, nome in codice Sapphire Rapids. AMX offre nuovi registri TMM "TILE" configurabili e istruzioni per la manipolazione dei dati in questi registri, come TMUL (Tile Matrix MULtiply) per la moltiplicazione di matrici.
    • Sono state implementate diverse nuove funzionalità basate sul sottosistema DAMON (Data Access MONitor) aggiunto nell'ultima versione, che consente di monitorare l'accesso ai dati nella RAM in relazione al processo selezionato in esecuzione nello spazio utente. Il sottosistema consente ad esempio di analizzare a quali aree di memoria ha avuto accesso il processo durante il suo intero funzionamento e a quali aree di memoria sono rimaste non occupate.
      • DAMON_RECLAIM per identificare ed eliminare aree di memoria a cui non è stato effettuato l'accesso. Il meccanismo può essere utilizzato per eliminare in modo proattivo le pagine di memoria quando la memoria libera è prossima all'esaurimento.
      • DAMOS (schemi operativi basati sul monitoraggio dell'accesso ai dati) per applicare operazioni madvise() specificate, come il rilascio di memoria libera aggiuntiva, per elaborare aree di memoria per le quali è fissata una determinata frequenza di accesso alla memoria. I parametri DAMOS sono configurati tramite debugfs.
      • Possibilità di monitorare lo spazio degli indirizzi fisici della memoria (in precedenza potevano essere monitorati solo gli indirizzi virtuali).
    • L'implementazione dell'algoritmo di compressione zstd è stata aggiornata alla versione 1.4.10, che ha migliorato significativamente le prestazioni di vari sottosistemi del kernel che utilizzano la compressione (ad esempio, lo spacchettamento di un'immagine del kernel è stato accelerato del 35%, le prestazioni di spacchettamento dei dati compressi in Btrfs e SquashFS è aumentato del 15% e in ZRAM del 30%). Inizialmente il kernel utilizzava un'implementazione separata di zstd, basata sulla versione 1.3.1, rilasciata più di tre anni fa e che non includeva molte ottimizzazioni importanti. Oltre al passaggio alla versione attuale, la patch aggiunta semplifica anche la sincronizzazione con il ramo upstream zstd, consentendo di generare codice da includere nel kernel direttamente dal repository zstd principale. In futuro, è previsto l'aggiornamento del codice zstd nel kernel man mano che verranno rilasciate nuove versioni della libreria zstd.
    • Gran parte dei miglioramenti sono stati apportati al sottosistema eBPF. Aggiunta la possibilità di richiamare le funzioni del modulo kernel dai programmi BPF. È stata implementata la funzione bpf_trace_vprintk(), a differenza di bpf_trace_printk(), che consente di visualizzare più di tre argomenti contemporaneamente. È stato aggiunto un nuovo filtro di fioritura della struttura di archiviazione dei dati (mappa BPF), che consente di utilizzare l'omonima struttura di dati probabilistica per determinare la presenza di un elemento in un insieme. È stato aggiunto un nuovo attributo BTF_KIND_TAG, che può essere utilizzato nei programmi BPF per associare i tag ai parametri di funzione, ad esempio per semplificare il rilevamento di errori nei programmi utente. In libbpf è possibile creare le proprie sezioni .rodata.*/.data.*, è stato implementato il supporto per gli eventi di traccia uprobe e kprobe ed è stata aggiunta un'API per copiare tutti i tipi BTF da un oggetto a un altro. Il supporto AF_XDP è stato spostato da libbpf a una libreria libxdp separata. Per l'architettura MIPS è stato implementato un compilatore JIT per la macchina virtuale BPF.
    • Per l'architettura ARM64 è stato implementato il supporto per le estensioni ARMv8.6 per il timer, comprese quelle che consentono la rappresentazione auto-sincronizzazione dei registri di sistema senza utilizzare le istruzioni ISB.
    • Per l'architettura PA-RISC è stata implementata la possibilità di utilizzare il meccanismo KFENCE per rilevare errori quando si lavora con la memoria ed è stato aggiunto il supporto per il rilevatore di condizioni di competizione KCSAN.
    • È possibile configurare i diritti di accesso a tracefs a livello di singoli utenti e gruppi; ad esempio, ora puoi consentire l'accesso agli strumenti di tracciamento solo ai membri di un determinato gruppo.
  • Virtualizzazione e sicurezza
    • I sottosistemi io_uring e device-mapper implementano il supporto per la generazione di eventi di controllo. io_uring offre la possibilità di controllare l'accesso tramite moduli LSM. Aggiunta la possibilità di controllare la chiamata di sistema openat2().
    • Il codice del kernel è completamente privo di espressioni maiuscole e minuscole continue in switch (nessun ritorno o interruzione dopo ogni blocco case). Durante la compilazione del kernel sarà ora possibile utilizzare la modalità “-Wimplicit-fallthrough”.
    • Incluse modifiche per restringere i controlli dei limiti durante l'esecuzione della funzione memcpy().
    • L'interfaccia I/O asincrona io_uring implementa la capacità di applicare le politiche di sicurezza definite dai moduli SELinux e Smack alle operazioni di I/O.
    • Il sottosistema IMA (Integrity Measurement Architecture), che consente ad un servizio esterno di verificare lo stato dei sottosistemi del kernel per garantirne l'autenticità, implementa la possibilità di applicare regole basate sull'identificatore di gruppo (GID) a cui appartiene il file o a cui l'utente l'accesso al file appartiene.
    • Disabilitati per impostazione predefinita alcuni meccanismi avanzati per proteggere i thread seccomp() dagli attacchi Spectre, che erano considerati non necessari e non miglioravano significativamente la sicurezza, ma influivano negativamente sulle prestazioni. L'uso della protezione Retpoline è stato rivisto.
    • È stata rimossa l'implementazione del meccanismo cryptoloop, che è stato sostituito nel 2004 da dm-crypt e, se necessario, supporta gli stessi algoritmi.
    • Per impostazione predefinita, l'accesso non privilegiato al sottosistema eBPF è vietato. La modifica è stata apportata per impedire che i programmi BPF vengano utilizzati per aggirare la protezione contro gli attacchi del canale laterale. Se necessario, l'amministratore può ripristinare la possibilità per gli utenti non privilegiati di utilizzare eBPF.
    • L'hypervisor ACRN, progettato per attività in tempo reale e per l'utilizzo in sistemi mission-critical, ha aggiunto il supporto per la creazione/eliminazione di dispositivi virtuali e l'inoltro di dispositivi MMIO.
    • Il supporto per le definizioni KPP (Key-agreement Protocol Primitives) è stato aggiunto al motore crittografico, semplificando la logica di sviluppo dei driver per i sistemi crittografici.
    • L'hypervisor Hyper-V ora supporta la modalità di isolamento della macchina virtuale, che prevede la crittografia del contenuto della memoria.
    • L'hypervisor KVM ha aggiunto il supporto per l'architettura RISC-V. È stata implementata la possibilità di migrare le macchine virtuali in esecuzione utilizzando le estensioni AMD SEV e SEV-ES all'interno dell'ambiente host. Aggiunta API per la migrazione live dei sistemi guest crittografati utilizzando AMD SEV (Secure Encrypted Virtualization).
    • Per l'architettura PowerPC è abilitata di default la modalità STRICT_KERNEL_RWX che blocca l'utilizzo di pagine di memoria disponibili contemporaneamente per la scrittura e l'esecuzione.
    • Sui sistemi x32 a 86 bit è stato interrotto il supporto per la memoria hotplug, inoperante da più di un anno.
    • La libreria liblockdep è stata rimossa dal kernel e ora verrà mantenuta separatamente dal kernel.
  • Sottosistema di rete
    • Per i socket è stata implementata una nuova opzione SO_RESERVE_MEM con la quale è possibile riservare una certa quantità di memoria per un socket, che rimarrà sempre disponibile per il socket e non verrà rimossa. L'utilizzo di questa opzione consente di ottenere prestazioni migliori riducendo l'allocazione di memoria e le operazioni di recupero nello stack di rete, soprattutto quando nel sistema si verificano condizioni di memoria insufficiente.
    • Aggiunto il supporto per il protocollo Automatic Multicast Tunneling (RFC 7450), che consente di distribuire traffico multicast da reti che supportano Multicast a destinatari su reti senza Multicast. Il protocollo funziona tramite l'incapsulamento nei pacchetti UDP.
    • Incapsulamento migliorato dei dati IOAM (operazioni, amministrazione e manutenzione in situ) nei pacchetti di transito.
    • La possibilità di controllare le modalità di consumo energetico del ricetrasmettitore è stata aggiunta all'API netlink ethtool.
    • Il sottosistema netfilter implementa la capacità di classificare i pacchetti a livello di uscita, vale a dire nella fase in cui il driver riceve un pacchetto dallo stack di rete del kernel. In nftables, il supporto per i filtri corrispondenti è apparso nella versione 1.0.1. Netfilter ha aggiunto la possibilità di confrontare e modificare intestazioni interne e dati per UDP e TCP (intestazione interna/carico utile) che seguono l'intestazione di trasporto.
    • Aggiunti nuovi parametri sysctl arp_evict_nocarrier e ndisc_evict_nocarrier, quando impostati, la cache ARP e la tabella ndisc (neighbor discovery) verranno cancellate in caso di errore di connessione (NOCARRIER).
    • Le modalità Low Latency, Low Loss e Scalable Throughput (L4S) sono state aggiunte al meccanismo di gestione delle code di rete fq_codel (Controlled Delay).
  • Attrezzatura
    • Il driver amdgpu fornisce il supporto iniziale per la specifica DP 2.0 (DisplayPort 2.0) e il tunneling DisplayPort su USB4. Per le APU Cyan Skillfish (dotate di GPU Navi 1x) è stato aggiunto il supporto per i controller del display. Il supporto per le APU Yellow Carp (processori mobili Ryzen 6000 “Rembrandt”) è stato ampliato.
    • Il driver i915 stabilizza il supporto per i chip Intel Alderlake S e implementa il supporto per la tecnologia Intel PXP (Protected Xe Path), che consente di organizzare una sessione grafica protetta tramite hardware su sistemi con chip Intel Xe.
    • È stato fatto del lavoro nel driver nouveau per correggere i bug e migliorare lo stile del codice.
    • Aggiunto il supporto per CPU Vortex compatibili con x86 (Vortex86MX). Linux ha già lavorato su processori simili in precedenza, ma era necessaria l'identificazione esplicita delle CPU specificate per disabilitare la protezione contro gli attacchi Spectre/Meltdown, che non sono applicabili ai chip specificati.
    • Aggiunto il supporto iniziale per le piattaforme x86 per Surface Pro 8 e Surface Laptop Studio.
    • Aggiunto driver per supportare i chip audio utilizzati nelle APU AMD Yellow Carp e Van Gogh, aggiunto anche il supporto per sistemi audio e codec 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.
    • Aggiunto il driver ishtp_eclite per accedere ai controller integrati Intel PSE (Programmable Service Engine) utilizzando ISHTP (Integratd Sensor Hub Transport Protocol), come l'interfaccia delle informazioni relative a batteria, temperatura e UCSI (USB Type-C Connector System Software).
    • Aggiunto un driver per i controller di gioco Nintendo Switch che supporta Switch Pro e Joy-Contro. Aggiunto supporto per tablet Wacom Intuos BT (CTL-4100WL/CTL-6100WL) e Apple Magic Keyboard 2021. Supporto migliorato per i controller Sony PlayStation DualSense. Aggiunto il supporto per i pulsanti laterali del mouse Xiaomi Mi.
    • Aggiunto driver RT89 con supporto per chip wireless Realtek 802.11ax, nonché driver per adattatori Ethernet Asix AX88796C-SPI e switch Realtek RTL8365MB-VC.
    • Sono stati aggiunti i driver per PCI e PASemi i1c per i chip Apple M2.
    • Aggiunto supporto per ARM SoС, dispositivi e schede 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, Ren esas R8A779M*, Xilinx Kria, Radxa Zero, JetHub D1/H1, Netronix E70K02.

Fonte: opennet.ru

Aggiungi un commento