Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.16. Tra le modifiche più significative: la chiamata di sistema futex_waitv per migliorare le prestazioni dei giochi Windows in Wine, il monitoraggio degli errori nel filesystem tramite fanotify, il concetto di volumetrici nel sistema di gestione della memoria, il supporto per le istruzioni dei processori AMX, la possibilità di riservare memoria per i socket di rete, il supporto in netfilter per la classificazione dei pacchetti nella fase di "egress", l'attivazione del sottosistema DAMON per l'anticipazione dell'espulsione delle aree di memoria non utilizzate, il miglioramento della gestione dei sovraccarichi in caso di grandi volumi di operazioni di scrittura, e il supporto per dischi rigidi a più unità.
Alla nuova versione sono stati apportati 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 e rimosse 263867 righe). Circa il 44% di tutte le modifiche presentate in 5.16 riguardano i driver delle periferiche, circa il 16% delle modifiche è relativo all'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 di disco, input/output e file system
- Il meccanismo fanotify è stato arricchito con strumenti per monitorare lo stato del filesystem e rilevare la comparsa di errori. Le informazioni sugli errori vengono trasmesse tramite un nuovo tipo di evento — 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 comparsa a cascata di una serie di errori, fanotify garantisce la consegna del messaggio relativo al primo errore insieme a un contatore totale dei problemi, per semplificare l'analisi delle cause del guasto. Il supporto per il monitoraggio degli errori è attualmente disponibile solo per il filesystem Ext4.
- Migliorata la gestione dei sovraccarichi durante l'esecuzione delle operazioni di scrittura (write congestion), che si verificano quando il volume delle operazioni di scrittura supera la capacità del dispositivo 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 ottenere informazioni sui sovraccarichi e il blocco dei task, poiché nella precedente implementazione si riscontravano problemi di interazione tra la gestione del sovraccarico di scrittura e la sostituzione delle pagine di memoria nell'area di swap in caso di insufficienza di memoria nel sistema.
- In Btrfs è stata implementata il supporto per la tecnologia della zonizzazione dei dispositivi (Zoned Namespace), utilizzata nei dischi rigidi o negli SSD NVMe per dividere lo spazio di archiviazione in zone, costituenti gruppi di blocchi o settori, in cui è consentito solo l'aggiunta sequenziale dei dati con l'aggiornamento di interi gruppi di blocchi. Inoltre, sono state apportate piccole ottimizzazioni al logging degli inode, che hanno portato a un aumento della capacità nel test dbench del 3% e a una riduzione della latenza dell'11%. È stato riprogettato il meccanismo di logging delle directory, nel quale è stato ridotto il numero di operazioni di ricerca e di blocchi nell'albero per migliorare l'efficienza. Accelerata l'inserzione di elementi nella struttura btree in modalità batch (il tempo di inserimento di massa degli elementi è stato ridotto del 4%, mentre l'eliminazione del 12%). Aggiunto un supporto limitato per l'uso della compressione durante la scrittura di pagine non complete, così come la possibilità di deframmentazione delle subpage.
- Nel file system XFS è stata ridotta la memoria utilizzata grazie all'uso di cache separate per gli elementi più frequentemente usati e alla riduzione di alcune strutture dati.
- Nel file system Ext4 sono stati registrati solo bug fixes e un calcolo più preciso dei parametri di inizializzazione ritardata della tabella inode.
- A livello di dispositivi a blocchi sono state implementate ottimizzazioni che consentono di aumentare significativamente l'efficienza dell'associazione delle operazioni ai core CPU.
- È stato aggiunto il supporto iniziale per dischi rigidi con più attuatori indipendenti (multi-actuator), che permettono di accedere simultaneamente a più settori in diverse zone del piatto magnetico.
- È stato aggiunto un nuovo comando ioctl CDROM_TIMED_MEDIA_CHANGE per identificare gli eventi di cambio supporto nell'unità 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 riflessi in un unico spazio di indirizzamento a blocchi a 32 bit. È stata inoltre aggiunta la supporto per la compressione utilizzando l'algoritmo LZMA.
- Nel FS F2FS sono state aggiunte opzioni di montaggio per gestire la frammentazione dei file durante la memorizzazione (ad esempio, per il debug delle ottimizzazioni del funzionamento con archiviazioni frammentate).
- In CEPH sono state abilitate per impostazione predefinita le operazioni di creazione e rimozione di directory in modalità asincrona (per ripristinare il comportamento precedente, utilizzare il flag ‘-o wsync’ durante il montaggio). È stata aggiunta la registrazione delle metriche che tracciano le operazioni di copia di oggetti esterni.
- In CIFS è stato aggiunto il parametro di montaggio tcpnodelay, che disabilita l'attesa di riempimento della coda nel TCP stack per il socket di rete impostando la modalità tcp_sock_set_nodelay. È stato aggiunto il supporto per collegamenti DFS nidificati (Distributed File System) durante il rimontaggio.
- È stato aggiunto il supporto per il completamento delle richieste ai dispositivi a blocchi in modalità batch. I test sulla modifica hanno mostrato un aumento dell'intensità delle operazioni di lettura casuale da unità Optane da 6.1 a 6.6 milioni di IOPS su un singolo core CPU.
- Memoria e servizi di sistema
- È stata aggiunta una nuova chiamata di sistema futex_waitv, che consente di monitorare lo stato di più futex contemporaneamente con una sola chiamata di sistema. Questa funzionalità ricorda quella disponibile in Windows chiamata WaitForMultipleObjects, la cui emulazione tramite futex_waitv potrebbe essere utile per migliorare le prestazioni dei giochi Windows eseguiti tramite 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 realizzata la concezione dei foni delle pagine di memoria (page folios), il cui utilizzo in alcuni sottosistemi del kernel consentirà di accelerare la gestione della memoria sotto carichi tipici. Attualmente, la principale sottosistema di gestione della memoria nel kernel è già stata tradotta in foni e viene implementata la cache delle pagine, mentre in futuro è previsto il passaggio dei file system. Inoltre, in futuro si prevede di aggiungere supporto per i foni multipagina nel kernel.
I foni ricordano le pagine di memoria consolidate (compound pages), ma si distinguono per una semantica migliorata e una organizzazione del lavoro più chiara. Per gestire la memoria di sistema, la RAM disponibile viene suddivisa in pagine di memoria, il cui dimensione dipende dall'architettura, ma nei sistemi x86 è misurata in kilobyte (di solito 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 realizzata la concezione delle pagine consolidate (compound pages) con strutture che coprono più di una pagina di memoria fisica. Tuttavia, l'API per la manipolazione delle pagine consolidate lasciava a desiderare e portava a costi aggiuntivi.
- Nel pianificatore di attività è stato aggiunto un gestore che tiene conto della clusterizzazione della cache nel CPU. In alcuni processori, come il Kunpeng 920 (ARM) e l'Intel Jacobsville (x86), un certo numero di core CPU, di solito 4, può condividere la cache L3 o L2. La considerazione di tali topologie può aumentare significativamente l'efficacia della distribuzione delle attività tra i core CPU nel pianificatore di attività, poiché il movimento delle attività all'interno di un cluster CPU consente di aumentare la capacità di elaborazione della memoria e ridurre la competizione nella cache.
- È stato aggiunto il supporto per le istruzioni AMX (Advanced Matrix Extensions), implementate nei prossimi 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 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 memoria RAM, in relazione a un processo specifico in esecuzione nello spazio utente. Ad esempio, il sottosistema permette di analizzare quali aree di memoria sono state richieste dal processo nel corso della sua esecuzione e quali aree di memoria sono rimaste inutilizzate.
- DAMON_RECLAIM per identificare e rimuovere le aree di memoria che non sono state utilizzate. Il meccanismo può essere utilizzato per un'espulsione preventiva dolce delle pagine di memoria quando si avvicina a una situazione di esaurimento della memoria disponibile.
- DAMOS (Data Access Monitoring-based Operation Schemes) per applicare operazioni madvise() specifiche, come il rilascio di ulteriore memoria libera, a aree di memoria del processo per le quali viene registrata una certa frequenza di accesso alla memoria. La configurazione dei parametri di DAMOS viene effettuata tramite debugfs.
- È possibile monitorare lo spazio di indirizzamento fisico della memoria (in precedenza era possibile monitorare solo indirizzi virtuali).
- L'implementazione dell'algoritmo di compressione zstd è stata aggiornata alla versione 1.4.10, il che ha permesso di migliorare notevolmente le prestazioni di vari sottosistemi del kernel in cui viene utilizzata la compressione (ad esempio, il decompressione dell'immagine del kernel è accelerata del 35%, le prestazioni della decompressione dei dati compressi in Btrfs e SquashFS sono aumentate del 15%, mentre in ZRAM – del 30%). Inizialmente, nel kernel era stata utilizzata un'implementazione separata di zstd, basata sulla versione 1.3.1, rilasciata più di tre anni fa e non includeva molte importanti ottimizzazioni. Oltre al passaggio alla versione attuale, la patch aggiunta semplifica anche la sincronizzazione con il ramo upstream di zstd, consentendo di generare codice da includere nel kernel direttamente dal repository principale di zstd. In futuro, il codice di zstd nel kernel sarà aggiornato man mano che verranno rilasciate nuove versioni della libreria zstd.
- È stata introdotta una grande serie di miglioramenti nel sottosistema eBPF. È stata aggiunta la possibilità di chiamare funzioni dei moduli del kernel dalle programmazioni BPF. È stata implementata la funzione bpf_trace_vprintk(), che, a differenza di bpf_trace_printk(), consente di stampare più di tre argomenti contemporaneamente. È stata aggiunta una nuova struttura di archiviazione dei dati (BPF map) bloom filter, che consente di utilizzare la stessa 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 nelle programmazioni BPF per associare tag ai parametri delle funzioni, ad esempio, per semplificare l'identificazione degli errori nei programmi degli utenti. In libbpf è stata autorizzata la creazione di sezioni personalizzate .rodata.* / .data.*, è stato implementato il supporto per gli eventi di tracciamento uprobe e kprobe, e aggiunto un'API per copiare tutti i tipi di BTF da un oggetto all'altro. Il supporto AF_XDP è stato separato da libbpf in una libreria distinta libxdp. È stato implementato un compilatore JIT per la macchina virtuale BPF per l'architettura MIPS.
- Per l'architettura ARM64 è stato implementato il supporto per le estensioni ARMv8.6 per il timer, che consentono, tra l'altro, di garantire l'auto-sincronizzazione della rappresentazione dei registri di sistema senza utilizzare istruzioni ISB.
- Per l'architettura PA-RISC è stata implementata la possibilità di applicare il meccanismo KFENCE per rilevare errori nella gestione della memoria, ed è stato aggiunto il supporto per il rilevatore di condizioni di gara KCSAN.
- È stata fornita la possibilità di configurare i diritti di accesso a tracefs a livello di singoli utenti e gruppi, ad esempio, consentendo ora l'accesso agli strumenti di tracciamento solo ai membri di un determinato gruppo.
- Virtualizzazione e sicurezza
- Nei sottosistemi io_uring e device-mapper è stato implementato il supporto per la generazione di eventi di audit. In io_uring è stata fornita la possibilità di gestire l'accesso tramite moduli LSM. È stata aggiunta la possibilità di audire la chiamata di sistema openat2().
- Il codice del kernel è stato completamente liberato da espressioni case non interrotte in switch (senza return o break dopo ogni blocco case). Durante la compilazione del kernel, ora sarà possibile utilizzare la modalità «-Wimplicit-fallthrough».
- Sono state incluse modifiche per inasprire 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 garantire la loro autenticità, è stata implementata la possibilità di applicare regole basate sull'identificatore di gruppo (GID) a cui appartiene il file o a cui appartiene l'utente che accede al file.
- Sono disattivati di default alcuni meccanismi avanzati di protezione dei flussi seccomp() contro attacchi di tipo Spectre, ritenuti eccessivi e non significativamente migliorativi della sicurezza, ma con un impatto negativo sulle prestazioni. È stata rivista l'implementazione della protezione Retpoline.
- È stata rimossa l'implementazione del meccanismo cryptoloop, sostituito nel 2004 da dm-crypt, che supporta, se necessario, gli stessi algoritmi.
- L'accesso non privilegiato al sottosistema eBPF è stato vietato per default. Questa modifica è stata apportata per prevenire l'uso di programmi BPF per aggirare le protezioni contro attacchi tramite canali laterali. Se necessario, l'amministratore può ripristinare la possibilità di utilizzo di eBPF da parte di utenti non privilegiati.
- Nel hypervisor ACRN, progettato per eseguire compiti in tempo reale e utilizzato in sistemi critici, è stata aggiunta la supporto per la creazione/rimozione di dispositivi virtuali e per il passaggio dei dispositivi MMIO.
- Nel cryptodriver è stata aggiunta la supporto per le definizioni KPP (Key-agreement Protocol Primitives), che semplificano la logica di sviluppo dei driver per le crittosistemi.
- Per l'hypervisor Hyper-V è stata implementata la supporto per la modalità di isolamento macchine virtuali, che implica la crittografia del contenuto della memoria.
- Nell'hypervisor KVM è stata aggiunta la supporto per l'architettura RISC-V. È stata implementata la possibilità di migrazione all'interno dell'ambiente host delle macchine virtuali, eseguite utilizzando le estensioni AMD SEV e SEV-ES. È stata aggiunta un'API per la migrazione live dei sistemi guest, crittografati utilizzando AMD SEV (Secure Encrypted Virtualization).
- Per l'architettura PowerPC è stata abilitata di default la modalità STRICT_KERNEL_RWX, che blocca l'uso delle pagine di memoria accessibili contemporaneamente in scrittura e in esecuzione.
- Nei sistemi a 32 bit x86 è cessata la supporto per il collegamento a caldo della memoria (Memory hotplug), che era non funzionante da oltre un anno.
- È stata esclusa dal kernel la libreria liblockdep, che ora sarà gestita 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, che rimarrà sempre disponibile e non sarà utilizzata. L'uso di questa opzione permette di aumentare le prestazioni riducendo le operazioni di allocazione e rilascio di memoria nello stack di rete, specialmente in caso di condizioni di carenza di memoria nel sistema.
- È stato aggiunto il supporto per il protocollo di tunneling automatico del traffico multicast (Automatic Multicast Tunneling, RFC 7450), che consente di consegnare il traffico multicast da reti che supportano il Multicast a destinatari in reti senza Multicast. Il protocollo funziona tramite incapsulamento in pacchetti UDP.
- È stata migliorata l'incapsulazione dei dati IOAM (In-situ Operations, Administration, and Maintenance) nei pacchetti di transito.
- Nell'API netlink di ethtool è stata aggiunta la possibilità di gestire le modalità di consumo energetico dei trasmettitori.
- Nel sottosistema netfilter è stata realizzata la possibilità di classificare i pacchetti a livello egress, ovvero quando il driver riceve il pacchetto dallo stack di rete del kernel. In nftables, il supporto per i filtri pertinenti è stato introdotto nella versione 1.0.1. In netfilter è stata aggiunta la possibilità di mappare e modificare gli header e i dati interni per UDP e TCP (inner header / payload), che seguono l'header di trasporto (transport header).
- Sono stati aggiunti nuovi parametri sysctl arp_evict_nocarrier e ndisc_evict_nocarrier, la cui impostazione comporta la pulizia della cache ARP e della tabella ndisc (neighbor discovery) in caso di interruzione della connessione (NOCARRIER).
- Nel meccanismo di gestione delle code di rete fq_codel (Controlled Delay) sono state aggiunte le modalità Low Latency, Low Loss e Scalable Throughput (L4S).
- Apparecchiatura
- Nel driver amdgpu è stata implementata una supporto iniziale per la specifica DP 2.0 (DisplayPort 2.0) e per la possibilità di tunneling di DisplayPort tramite USB4. Per APU Cyan Skillfish (dotati di GPU Navi 1x) è stato aggiunto il supporto per i controller video. È stato ampliato il supporto per APU Yellow Carp (processori mobili Ryzen 6000 “Rembrandt”).
- Nel driver i915 è stato stabilizzato il supporto per i chip Intel Alderlake S e implementato il supporto per la tecnologia Intel PXP (Protected Xe Path), che consente l'organizzazione di una sessione grafica protetta a livello hardware su sistemi con chip Intel Xe.
- Nel driver nouveau sono stati effettuati lavori di correzione degli errori e miglioramento dello stile del codice.
- È stato aggiunto il supporto per le CPU Vortex compatibili con x86 (Vortex86MX). Linux su processori simili ha funzionato in precedenza, ma è stata necessaria un'identificazione esplicita di tali CPU per disabilitare la protezione contro gli attacchi Spectre/Meltdown, che non sono applicabili ai chip indicati.
- È stato aggiunto il supporto iniziale per le piattaforme x86 Surface Pro 8 e Surface Laptop Studio.
- È stato aggiunto un driver per il supporto dei chip audio utilizzati negli APU AMD Yellow Carp, Van Gogh, e sono stati aggiunti 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.
- È stato aggiunto il driver ishtp_eclite per accedere ai controller integrati Intel PSE (Programmable Service Engine) tramite il protocollo ISHTP (Integrated Sensor Hub Transport Protocol), ad esempio, per ottenere dati sulla batteria, temperatura e informazioni relative 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. È stato aggiunto il supporto per le tavolette Wacom Intuos BT (CTL-4100WL/CTL-6100WL) e la tastiera Apple 2021 Magic Keyboard. È stato migliorato il supporto per i controller Sony PlayStation DualSense. È stato aggiunto il supporto per i pulsanti laterali del mouse Xiaomi Mi.
- È stato aggiunto il driver RT89 con supporto per i chip wireless Realtek 802.11ax, così come i driver per gli adattatori Ethernet Asix AX88796C-SPI e gli switch Realtek RTL8365MB-VC.
- Per i chip Apple M1 sono stati aggiunti driver per PCI e PASemi i2c.
- È stato aggiunto il 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
