Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.16. Tra le modifiche più evidenti ci sono: la chiamata di sistema futex_waitv per migliorare le prestazioni dei giochi Windows su Wine, il monitoraggio degli errori nel filesystem tramite fanotify, il concetto di folia nella gestione della memoria, il supporto per le istruzioni di processore AMX, la possibilità di riservare memoria per i socket di rete, il supporto in netfilter per la classificazione dei pacchetti in fase di "egress", l'impiego del sottosistema DAMON per l'evacuazione proattiva delle aree di memoria non utilizzate, il miglioramento della gestione dei sovraccarichi durante grandi operazioni di scrittura, e il supporto per dischi rigidi multi-drive.
Nella nuova versione sono stati accettati 15.415 aggiornamenti da 2.105 sviluppatori, la dimensione della patch è di 45 MB (le modifiche hanno interessato 12.023 file, sono state aggiunte 685.198 righe di codice e rimosse 263.867 righe). Circa il 44% di tutte le modifiche presentate in 5.16 sono relative ai driver di dispositivo, circa il 16% riguardano l'aggiornamento del codice specifico per architetture hardware, il 16% è legato allo stack di rete, il 4% ai filesystem e il 4% ai sottosistemi interni del kernel.
Le principali novità nel kernel 5.16:
- Sottosistema disco, I/O e file system
- Nel meccanismo fanotify sono stati aggiunti strumenti per monitorare lo stato del file system e tracciare l'emergere di errori. Le informazioni sugli errori vengono trasmesse tramite un nuovo tipo di eventi — FAN_FS_ERROR, che possono essere intercettati nei sistemi di monitoraggio in esecuzione nello spazio utente per informare tempestivamente l'amministratore o avviare processi di recupero. In caso di una serie di errori a cascata, fanotify garantisce la consegna del messaggio relativo al primo errore insieme a un contatore generale dei problemi, per semplificare l'analisi successiva delle cause del malfunzionamento. Attualmente, il supporto per il monitoraggio degli errori è implementato solo per il file system Ext4.
- Migliorata la gestione della congestione durante le operazioni di scrittura, che si verifica quando il volume delle operazioni di scrittura supera la capacità di elaborazione della memoria e il sistema è costretto a bloccare le richieste del processo di scrittura fino al completamento delle richieste già inviate. Nella nuova versione, è stato completamente riprogettato il meccanismo del kernel utilizzato per raccogliere informazioni sulla congestione e sul blocco dei compiti, poiché nella vecchia implementazione si riscontravano problemi relativi all'accoppiamento della gestione della congestione di scrittura con l'espulsione delle pagine di memoria nella swap quando la memoria di sistema era insufficiente.
- In Btrfs è implementato il supporto per la tecnologia di zonizzazione dei dispositivi (Zoned Namespace), utilizzato in dischi rigidi o SSD NVMe per suddividere lo spazio di archiviazione in zone, costituite da gruppi di blocchi o settori, nei quali è consentito solo l'aggiunta sequenziale di dati, aggiornando l'intero gruppo di blocchi. Inoltre, sono state apportate piccole ottimizzazioni al logging degli inode, che hanno consentito un aumento della capacità di elaborazione del 3% nei test dbench e una riduzione della latenza dell'11%. Il meccanismo di logging delle directory è stato riprogettato, riducendo il numero di operazioni di ricerca e blocchi nell'albero per migliorare l'efficienza. È stata accelerata l'inserimento di elementi nella struttura btree in modalità batch (il tempo di inserimento di massa degli elementi è stato ridotto del 4% e quello delle eliminazioni del 12%). È stato aggiunto il supporto limitato per l'uso della compressione durante la registrazione di pagine incomplete, così come la possibilità di deframmentazione delle subpage. È stata effettuata la preparazione per includere il supporto per la seconda versione del protocollo per il comando "send".
- Nel file system XFS è stata ridotta l'occupazione di memoria grazie all'uso di cache slab separate per gli elementi frequentemente utilizzati e alla riduzione di alcune strutture dati.
- Nel file system Ext4 sono state effettuate solo correzioni di bug e un calcolo più preciso dei parametri per l'inizializzazione ritardata della tabella degli inode.
- A livello di dispositivi a blocchi sono state implementate ottimizzazioni che aumentano sostanzialmente l'efficienza del legame delle operazioni con i core CPU.
- È stato aggiunto un supporto iniziale per i dischi rigidi con più attuatori indipendenti (multi-actuator), che consentono di accedere simultaneamente a più settori in diverse zone del piatto magnetico.
- È stato aggiunto un nuovo comando ioctl CDROM_TIMED_MEDIA_CHANGE per rilevare eventi di cambio supporto nel lettore di dischi ottici.
- Nel file system EROFS (Enhanced Read-Only File System) è stata aggiunta la possibilità di operare su più dispositivi di archiviazione. Dispositivi diversi possono essere rappresentati in un unico spazio di indirizzamento a 32 bit per i blocchi. È stato inoltre aggiunto il supporto per la compressione utilizzando l'algoritmo LZMA.
- Nel file system F2FS sono state aggiunte opzioni di montaggio per gestire la frammentazione dei file durante la memorizzazione (ad esempio, per il debug delle ottimizzazioni relative a memorie frammentate).
- In CEPH sono state abilitate di default le operazioni di creazione e cancellazione delle cartelle in modalità asincrona (per ripristinare il comportamento precedente, utilizzare il flag '-o wsync' durante il montaggio). È stata aggiunta una registrazione delle metriche che monitorano le operazioni di copia di oggetti esterni.
- In CIFS è stato aggiunto il parametro di montaggio tcpnodelay, che imposta il socket di rete in modalità tcp_sock_set_nodelay, disattivando l'attesa per il riempimento della coda nel stack TCP. Aggiunta la supporto per i link DFS (Distributed File System) annidati durante il rimontaggio.
- È stata aggiunta la supporto per la conclusione delle richieste ai dispositivi a blocchi in modalità batch. I test delle modifiche hanno mostrato un aumento dell'intensità delle operazioni di lettura casuale dai dispositivi Optane, passando da 6,1 a 6,6 milioni di IOPS su un singolo core CPU.
- Memoria e servizi di sistema
- È stato aggiunto una nuova chiamata di sistema futex_waitv, che consente di monitorare lo stato di più futex contemporaneamente tramite una sola chiamata. Questa funzionalità ricorda quella di Windows, WaitForMultipleObjects, la cui emulazione attraverso futex_waitv può essere utile per migliorare le prestazioni dei giochi Windows eseguiti sotto Wine o Proton. Inoltre, l'attesa simultanea dei futex può essere utilizzata anche per ottimizzare le prestazioni delle versioni native dei giochi per Linux.
- È stata implementata la concezione dei folii di memoria (page folios), il cui utilizzo in alcune sottosistemi del kernel consentirà di accelerare la gestione della memoria sotto carichi tipici. Attualmente, la principale sottosistema di gestione della memoria nel kernel e l'implementazione della cache delle pagine sono già stati convertiti ai folii, e in futuro è previsto il supporto per i file system. Inoltre, si prevede che il kernel aggiunga anche il supporto per i folii multipezzo.
I fogli di memoria composti ricordano le pagine di memoria unite (compound pages), ma si distinguono per una semantica migliorata e un'organizzazione del lavoro più chiara. Per gestire la memoria di sistema, la RAM disponibile viene suddivisa in pagine di memoria, le cui dimensioni variano a seconda dell'architettura, ma nei sistemi x86 vengono misurate in kilobyte (solitamente 4096 byte). I sistemi moderni sono dotati di decine di gigabyte di RAM, il che complica la gestione della memoria a causa della necessità di elaborare un numero enorme di pagine di memoria. Per ridurre il numero di pagine, in precedenza nel kernel è stata implementata la concettualizzazione delle pagine composte (compound pages) con strutture che coprono più di una pagina fisica di memoria. Tuttavia, l'API per la manipolazione delle pagine di memoria composte lasciava a desiderare e comportava costi aggiuntivi.
- Nel pianificatore di attività è stato aggiunto un gestore che tiene conto della clusterizzazione della cache nella CPU. In alcuni processori, come il Kunpeng 920 (ARM) e l'Intel Jacobsville (x86), un certo numero di core CPU, di solito 4, può combinare la cache L3 o L2. Considerare tali topologie può migliorare notevolmente l'efficacia della distribuzione delle attività tra i core CPU nel pianificatore, poiché il trasferimento di attività all'interno di un cluster CPU consente di aumentare la larghezza di banda di accesso alla memoria e ridurre la competizione nella cache.
- Aggiunto il supporto per le istruzioni AMX (Advanced Matrix Extensions), implementate nei futuri processori server Intel Xeon Scalable, sviluppati con il nome in codice Sapphire Rapids. AMX offre nuovi registri configurabili TMM "TILE" e istruzioni per la manipolazione dei dati in questi registri, come TMUL (Tile matrix MULtiply) per la moltiplicazione delle matrici.
- Sono state implementate diverse nuove funzionalità basate sul sottosistema DAMON (Data Access MONitor) aggiunto nell'ultima release, che consente di monitorare l'accesso ai dati nella memoria RAM, in riferimento al processo selezionato in esecuzione nello spazio utente. Ad esempio, il sottosistema offre la possibilità di analizzare quali aree di memoria sono state accessibili dal processo durante il suo funzionamento e quali aree di memoria sono rimaste inutilizzate.
- DAMON_RECLAIM per identificare ed espellere le aree di memoria a cui non si è fatto accesso. Questo meccanismo può essere utilizzato per un'espulsione morbida proattiva delle pagine di memoria quando ci si avvicina all'esaurimento della memoria libera.
- DAMOS (Data Access Monitoring-based Operation Schemes) per applicare operazioni madvise() specifiche, come il rilascio di ulteriore memoria libera, alle aree di memoria del processo per le quali si registra una certa frequenza di accesso alla memoria. La configurazione dei parametri di DAMOS avviene tramite debugfs.
- Possibilità di monitorare lo spazio indirizzabile fisico della memoria (in precedenza si potevano monitorare solo gli indirizzi virtuali).
- L'implementazione dell'algoritmo di compressione zstd è stata aggiornata alla versione 1.4.10, il che ha notevolmente migliorato le prestazioni di diversi sottosistemi del kernel in cui viene utilizzata la compressione (ad esempio, il decompressionamento dell'immagine del kernel è stato accelerato del 35%, le prestazioni del decompressionamento dei dati compressi in Btrfs e SquashFS sono aumentate del 15%, mentre in ZRAM sono cresciute del 30%). Inizialmente, nel kernel era stata utilizzata un'implementazione separata di zstd, basata sulla versione 1.3.1, rilasciata oltre tre anni fa e che non includeva molte ottimizzazioni importanti. Oltre alla transizione alla versione attuale, la patch aggiunta semplifica anche la sincronizzazione con il ramo upstream di zstd, consentendo di generare codice per l'inclusione nel kernel direttamente dal repository principale di zstd. In futuro, il codice zstd nel kernel sarà aggiornato man mano che verranno rilasciate nuove versioni della libreria zstd.
- È stata apportata una grande quantità di miglioramenti al sottosistema eBPF. È stata aggiunta la possibilità di invocare funzioni dei moduli del kernel da programmi BPF. È stata implementata la funzione bpf_trace_vprintk(), che consente, a differenza di bpf_trace_printk(), di stampare più di tre argomenti contemporaneamente. È stata aggiunta una nuova struttura di memorizzazione dei dati (BPF map) chiamata bloom filter, che consente di utilizzare la corrispondente struttura di dati probabilistici per determinare la presenza di un elemento in un insieme. È stato aggiunto un nuovo attributo BTF_KIND_TAG, utilizzabile nei programmi BPF per associare tag ai parametri delle funzioni, ad esempio per semplificare l'individuazione di errori nei programmi degli utenti. In libbpf è consentita la creazione di sezioni personalizzate .rodata.*/.data.*, è stata implementata il supporto per gli eventi di tracciamento uprobe e kprobe, e aggiunto un API per copiare tutti i tipi di BTF da un oggetto a un altro. Il supporto per AF_XDP è stato estratto da libbpf in una libreria separata chiamata libxdp. 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 di garantire l'auto-sincronizzazione della rappresentazione dei registri di sistema senza l'uso delle istruzioni ISB.
- Per l'architettura PA-RISC è stata implementata la possibilità di utilizzare il meccanismo KFENCE per rilevare errori nella gestione della memoria, ed è stata aggiunta la supporto per il rilevatore di condizioni di gara KCSAN.
- È ora possibile configurare i diritti di accesso a tracefs a livello di singoli utenti e gruppi: ad esempio, è possibile consentire l'accesso agli strumenti di tracciamento solo ai membri di un determinato gruppo.
- Virtualizzazione e sicurezza
- Nei sottosistemi io_uring e device-mapper è stata implementata la supporto per la generazione di eventi di audit. In io_uring è possibile gestire l'accesso tramite moduli LSM. È stata aggiunta la possibilità di auditare la chiamata di sistema openat2().
- Il codice del kernel è stato completamente liberato dalle espressioni case non interrotte in switch (senza return o break dopo ogni blocco case). Durante la compilazione del kernel, sarà ora possibile utilizzare la modalità '-Wimplicit-fallthrough'.
- Sono state incluse modifiche per rinforzare i controlli dei limiti durante l'esecuzione della funzione memcpy().
- Nell'interfaccia di input/output asincrono io_uring è stata implementata la possibilità di applicare politiche di sicurezza, definite dai moduli SELinux e Smack, alle operazioni di input/output.
- Nel sottosistema IMA (Integrity Measurement Architecture), che consente a un servizio esterno di verificare lo stato dei sottosistemi del kernel per garantirne l'autenticità, è implementata la possibilità di applicare regole basate sull'identificatore di gruppo (GID) a cui appartiene il file o in cui rientra l'utente che accede al file.
- Sono disabilitati per impostazione predefinita alcuni meccanismi avanzati di protezione dei flussi seccomp() contro gli attacchi di tipo Spectre, ritenuti eccessivi e che non aumentano significativamente la sicurezza, ma influenzano negativamente le prestazioni. È stata riveduta l'applicazione della protezione Retpoline.
- È stata rimossa l'implementazione del meccanismo cryptoloop, sostituito nel 2004 da dm-crypt, che supporta gli stessi algoritmi se necessario.
- Per impostazione predefinita, l'accesso non privilegiato al sottosistema eBPF è vietato. Questa modifica è stata apportata per prevenire l'uso dei programmi BPF per eludere la protezione contro gli attacchi tramite canali laterali. Se necessario, l'amministratore può ripristinare la possibilità di utilizzo dell'eBPF da parte degli utenti non privilegiati.
- Nel hypervisor ACRN, progettato per eseguire task in tempo reale e per l'uso in sistemi critici, è stata aggiunta la supporto per la creazione e la rimozione di dispositivi virtuali e il passaggio dei dispositivi MMIO.
- Il motore crittografico ha aggiunto il supporto per le definizioni KPP (Key-agreement Protocol Primitives), semplificando la logica di sviluppo dei driver per i sistemi crittografici.
- Per l'hypervisor Hyper-V è stato implementato il supporto per la modalità di isolamento di macchine virtuali, che prevede la crittografia del contenuto della memoria.
- Nel hypervisor KVM è stato aggiunto il supporto per l'architettura RISC-V. È stata realizzata la possibilità di migrazione all'interno dell'ambiente host delle macchine virtuali in esecuzione con l'uso delle estensioni AMD SEV e SEV-ES. È stata aggiunta un'API per la migrazione live dei sistemi guest, criptati tramite AMD SEV (Secure Encrypted Virtualization).
- Per l'architettura PowerPC è abilitato di default il modo STRICT_KERNEL_RWX, che blocca l'uso delle pagine di memoria accessibili in scrittura ed esecuzione contemporaneamente.
- Sui sistemi a 32 bit x86 è stata interrotta la supporto per il collegamento a caldo della memoria (Memory hotplug), che era inoperativa da oltre un anno.
- La libreria liblockdep è stata esclusa dal kernel e sarà ora mantenuta separatamente dal kernel.
- Sottosistema di rete
- Per i socket è stata implementata una nuova opzione SO_RESERVE_MEM, che consente di riservare una certa quantità di memoria per il socket, rendendola sempre disponibile e non soggetta a prelievo. L'uso di questa opzione permette di migliorare le prestazioni riducendo le operazioni di allocazione e liberazione della memoria nello stack di rete, specialmente in condizioni di scarsità di memoria nel sistema.
- È stata aggiunta la supporto per il protocollo di tunneling automatico del traffico multicast (Automatic Multicast Tunneling, RFC 7450), che consente di consegnare il traffico multicast dalle reti che supportano il multicast a riceventi in reti senza multicast. Il protocollo funziona attraverso l'incapsulamento in pacchetti UDP.
- È migliorata l'incapsulazione dei dati IOAM (In-situ Operations, Administration, and Maintenance) nei pacchetti di transito.
- Nell'API del netlink di ethtool è stata aggiunta la possibilità di gestire le modalità di consumo energetico dei trasmettitori e ricevitori.
- Nel sottosistema netfilter è stata implementata la possibilità di classificare i pacchetti a livello egress, cioè 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. È stata aggiunta la possibilità in netfilter di effettuare il match e modificare intestazioni e dati interni per UDP e TCP (inner header / payload), che seguono l'intestazione di trasporto (transport header).
- Sono stati aggiunti nuovi parametri sysctl arp_evict_nocarrier e ndisc_evict_nocarrier, il cui impiego comporterà la pulizia della cache ARP e della tabella ndisc (discovery dei vicini) in caso di interruzione della connessione (NOCARRIER).
- Nel meccanismo di gestione delle code di rete fq_codel (Controlled Delay) sono stati aggiunti i livelli Low Latency, Low Loss e Scalable Throughput (L4S).
- Attrezzature
- Nel driver amdgpu è stato implementato un supporto iniziale per la specifica DP 2.0 (DisplayPort 2.0) e la possibilità di incapsulare DisplayPort attraverso USB4. Per l'APU Cyan Skillfish (equipaggiati con GPU Navi 1x) è stato aggiunto il supporto per i controller di visualizzazione. È stato ampliato il supporto per l'APU Yellow Carp (processori mobili Ryzen 6000 'Rembrandt').
- Nel driver i915 è stata stabilizzata la compatibilità con i chip Intel Alderlake S e implementato il supporto per la tecnologia Intel PXP (Protected Xe Path), che consente di gestire una sessione grafica hardware protetta su sistemi con chip Intel Xe.
- Nel driver nouveau sono stati apportati miglioramenti per risolvere errori e migliorare lo stile di codice.
- Aggiunto supporto per CPU compatibili con x86 Vortex (Vortex86MX). Linux funzionava già su questi processori, ma era necessaria un'identificazione esplicita delle CPU per disattivare la protezione contro attacchi Spectre/Meltdown, che non si applicano ai chip citati.
- Aggiunto supporto iniziale per le piattaforme x86 Surface Pro 8 e Surface Laptop Studio.
- Aggiunto driver per il supporto dei chip audio utilizzati negli APU AMD Yellow Carp, Van Gogh; è stato anche aggiunto il supporto per i sistemi audio e i 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 driver ishtp_eclite per accedere ai controllori integrati Intel PSE (Programmable Service Engine) tramite il protocollo ISHTP (Integrated Sensor Hub Transport Protocol), ad esempio, per ottenere informazioni sulla batteria, sulla temperatura e sui dati relativi a UCSI (USB Type-C Connector System Software Interface).
- È stato aggiunto il driver per i controller di gioco Nintendo Switch, che supporta i dispositivi Switch Pro e Joy-Cons. È stata aggiunta la compatibilità con i tablet Wacom Intuos BT (CTL-4100WL/CTL-6100WL) e la tastiera Apple 2021 Magic Keyboard. È stata migliorata la compatibilità con i controller Sony PlayStation DualSense. È stata aggiunta la compatibilità con i pulsanti laterali del mouse Xiaomi Mi.
- È stato aggiunto il driver RT89 con supporto per i chip wireless Realtek 802.11ax, oltre ai driver per gli adattatori Ethernet Asix AX88796C-SPI e gli switch Realtek RTL8365MB-VC.
- Per i chip Apple M1 sono stati aggiunti i driver per PCI e PASemi i2c.
- È stata aggiunta la supporto per ARM SoC, 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, Renesas R8A779M*, Xilinx Kria, Radxa Zero, JetHub D1/H1, Netronix E70K02.
Fonte: opennet.ru
