Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 7.2. Tra le modifiche più significative: meccanismo di trasferimento dati USB4STREAM, ottimizzazioni delle prestazioni per btrfs, xfs ed ext4, continuazione della rimozione del codice per il supporto della CPU i486, possibilità di creare pianificatori annidati SCHED_EXT, riduzione del consumo di memoria nel sottosistema di swap, accelerazione dei canali senza nome, supporto per le estensioni Intel MBEC e AMD GMET in KVM, rimozione del protocollo AppleTalk, supporto iniziale per HDMI 2.1 FRL nel driver AMDGPU.
Novità principali nel kernel 7.2 (1, 2, 3):
- Sottosistema di disco, input/output e file system
- Nel meccanismo iomap è stata rimossa una chiamata superflua alla funzione memset per iterazioni già completate nella funzione iomap_iter(), il che ha aumentato, in test condotti, il numero di operazioni di input/output al secondo (IOPS) del 5% con l'uso del file system ext4 e xfs, in condizioni di alta intensità di I/O su veloci dispositivi NVMe.
- In XFS è stata dichiarata stabile la supporto per i dispositivi di archiviazione zonati (divisione in aree di gruppi di blocchi o settori, nei quali è consentita solo l'aggiunta sequenziale di dati con l'aggiornamento dell'intero gruppo di blocchi).
- In Btrfs è stata attivata di default il supporto per grandi fogli di memoria (large folios), che consente di ridurre il sovraccarico e aumentare le prestazioni durante operazioni di input/output sequenziale intensive. È stato aggiunto un supporto sperimentale per enormi fogli («huge folios»), di dimensioni fino a 2 MB. È stato aggiunto un nuovo ioctl GET_CSUMS per ottenere informazioni sulle somme di controllo nello spazio utente, ad esempio per l'utilità mkfs e per ottimizzare la deduplicazione. Le prestazioni della scrittura sequenziale sono aumentate del 15% e quelle dell'input/output diretto del 59%.
- Nel file system Ext4 è stata significativamente riprogettata l'implementazione del meccanismo di «fast commit» per escludere la possibilità di blocchi concorrenti e deadlock. È stata aggiunta l'esportazione delle statistiche sui snapshot inode tramite /proc/fs/ext4/*/fc_info. Le prestazioni nel calcolo degli hash delle directory sono state ottimizzate (per nomi di 255 caratteri, il miglioramento è quasi raddoppiato, per 64 caratteri il 27%, per 32 caratteri l'11%).
- In F2FS è stato aggiunto il supporto per il ritorno degli errori fserror, che consente di monitorare i problemi del file system dallo spazio utente. È stato ridotto il tempo speso nel contesto di gestione delle interruzioni.
- Nel Device Mapper (DM) è stato aggiunto un nuovo gestore dm-inlinecrypt per l'organizzazione della crittografia trasparente e della decrittazione dei dispositivi a blocchi, utilizzando dispositivi hardware con funzione di crittografia inline.
- È stata proposta la documentazione per l'aggiunta di nuovi filesystem al kernel.
- In NFS, la dimensione di blocco predefinita è stata aumentata a 4 MB sui sistemi con almeno 16 GB di RAM (per modificare manualmente la dimensione del blocco, è possibile utilizzare /proc/fs/nfsd/max_block_size). È stata aggiunta la supporto per la delega della gestione delle directory ai client, consentendo di eseguire operazioni in quella directory per un certo tempo senza controllare le modifiche di stato. server.
- Nel server SMB è stata aggiunta la supporto per file memorizzati in formato compresso, nonché per la compressione dei dati durante la loro trasmissione in rete.
- Nella nuova implementazione di NTFS (ntfsplus) è stata aggiunta la supporto per i collegamenti simbolici di Windows e garantita una corretta gestione di molti tipi di corruzione dei metadati.
- È stato rimosso il backend fscache per la memorizzazione nella cache dei dati del filesystem EROFS (Enhanced Read-Only File System), dichiarato obsoleto due anni fa.
- Nel filesystem Ceph è stata aggiunta la supporto per il ripristino manuale delle sessioni client.
- Nel filesystem 9P sono state apportate ottimizzazioni che hanno accelerato le operazioni in scenari come la compilazione dei progetti.
- Nella chiamata di sistema file_getattr() sono stati aggiunti segnali per ottenere informazioni relative al rispetto del maiuscolo/minuscolo nel filesystem. Il segnale FS_XFLAG_CASEFOLD indica che i nomi dei file vengono controllati senza considerare il maiuscolo/minuscolo, mentre il segnale FS_XFLAG_CASENONPRESERVING indica che, durante la creazione di nuovi nomi di file, non viene preservata l'informazione sul maiuscolo/minuscolo. Questi segnali possono essere applicati ai client NFS che operano senza considerare il maiuscolo/minuscolo.
- Nella chiamata di sistema openat2() è stato aggiunto il segnale O_EMPTYPATH, che consente di passare un percorso di file vuoto. In questo caso, il percorso del file da aprire è determinato in base al descrittore di file passato.
- Nella chiamata di sistema openat2() è stato aggiunto il segnale OPENAT2_REGULAR, che consente l'apertura solo di file regolari (in caso di tentativo di apertura di un file speciale, ad esempio un socket, un canale o un dispositivo, verrà restituito un errore EFTYPE).
- Memoria e servizi di sistema
- È stato implementato il meccanismo USB4STREAM per la trasmissione di dati tra computer collegati tramite cavi USB4. È stato aggiunto il dispositivo /dev/tbstreamX, con il quale è possibile leggere e scrivere dati utilizzando le normali funzioni read() e write(), analogamente alla lettura e alla scrittura di file. Ad esempio, su un host è possibile inviare informazioni con il comando "echo hello > /dev/tbstream0", mentre su un altro è possibile leggerle con il comando "cat /dev/tbstream0". Il meccanismo USB4STREAM può essere combinato con la possibilità di stabilire una connessione di rete tramite cavo USB4 (thunderbolt_net) o utilizzato separatamente quando è necessario trasferire dati tra applicazioni che non supportano i socket di rete.
- È stata inclusa la seconda serie di modifiche per interrompere il supporto per i processori i486. Sono state rimosse oltre 13 righe di codice relative all'emulazione di un'unità per i calcoli in virgola mobile per i processori privi di FPU. È stato rimosso il supporto per i processori i486 senza operazioni hardware CX8 (confronta e scambia 8 byte) e TSC (contatore dei cicli CPU, utilizzato nel pianificatore di attività), il codice per l'emulazione dei quali è stato eliminato.
- È stata dichiarata l'assistenza non più attiva (orphaned) per i processori AMD Geode, utilizzati nel computer OLPC XO-1.
- È stato aggiunto il supporto per l'aggiornamento dell'implementazione del meccanismo Intel TDX (Trusted Domain Extensions), utilizzato per la crittografia della memoria RAM dei sistemi guest. TDX è implementato sotto forma di un modulo runtime software speciale, che durante l'avvio viene trasferito dal BIOS dalla memoria Flash alla memoria RAM. Sono state aggiunte al kernel funzionalità per gestire questo modulo e sostituirlo con una versione più recente su un sistema attivo senza necessità di riavvio.
- È stato realizzato un nuovo pianificatore per la distribuzione delle risorse GPU (Fair GPU scheduler), utilizzato per determinare l'ordine di esecuzione delle attività inviate ai GPU dai processi che utilizzano la GPU. Invece di utilizzare la tradizionale coda di richieste FIDO per la GPU, il nuovo pianificatore impiega meccanismi di distribuzione equa delle risorse, realizzati tenendo presente il pianificatore di attività CFS (Completely Fair Scheduler), che applica un piano di esecuzione con tempi di transizione per l'esecuzione del processo successivo. L'effetto più significativo dell'uso del nuovo pianificatore si osserva durante l'esecuzione parallela di attività interattive che utilizzano intensamente la GPU. All'ultimo minuto prima del rilascio del kernel 7.2, l'inclusione del Fair GPU scheduler è stata annullata e è stato ripristinato il vecchio pianificatore FIFO a causa della necessità di debug di una regressione che portava a un calo delle prestazioni e a una carico del 100% sulla GPU durante l'esecuzione di alcuni giochi in Proton.
- Modifiche al sottosistema eBPF: È stata aggiunta la possibilità di collegare un programma BPF a più punti di tracciamento (tracepoint). Ai programmi BPF collegati ai punti di tracciamento è stata aggiunta la possibilità di accedere alla memoria dei componenti operanti in spazio utente, gestendo correttamente le eccezioni legate a pagine non allocate (page fault). È stato aggiunto al sistema di chiamata bpf() il supporto per attributi tipici (log_buf, log_size, log_level e log_true_size), che consente di unificare il trasferimento di metadati in tutti i comandi BPF, senza limitarsi ai comandi BPF_PROG_LOAD, BPF_BTF_LOAD e BPF_MAP_CREATE. È stata rimossa la limitazione sul trasferimento di più di 5 parametri nelle funzioni BPF. È stata aggiunta la possibilità di accesso sicuro alla memoria condivisa bpf_arena senza temere eccezioni legate a pagine non allocate (page fault). È stata realizzata una nuova variante della struttura BPF hash map, che consente la modifica dinamica delle dimensioni.
- È stato ottimizzato il formato dell'output di «/proc/interrupts» con statistiche sulle interruzioni, e sono state modernizzate le strutture per memorizzare i contatori delle interruzioni e aggiunto caching.
- È stata accelerata la generazione del file «/proc/filesystems», utilizzato in libselinux.
- Nel pianificatore di attività è stata implementata il supporto per il bilanciamento del carico tra i core della CPU, considerando gli stati della cache interna del processore. Il pianificatore ora cerca di raggruppare i processi che utilizzano risorse comuni, ad esempio, i thread di un singolo processo, per l'utilizzo nel contesto della stessa cache di primo livello, migliorando l'efficienza nell'accesso ai dati grazie all'aumento della probabilità di trovare i dati necessari nella cache.
- Nel meccanismo SCHED_EXT, che consente di utilizzare BPF per creare pianificatori della CPU, è continuata l'implementazione della possibilità di creare pianificatori annidati (sub-scheduler), attraverso i quali è possibile attivare un proprio pianificatore di attività per ciascun cgroup.
- È proseguito il trasferimento delle modifiche dalla branch Rust-for-Linux, relative all'uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel (il supporto per Rust non è attivato per impostazione predefinita e non porta all'inclusione di Rust tra le dipendenze di costruzione obbligatorie del kernel). La possibilità di utilizzare Rust nel kernel è stata implementata per l'architettura s390. È stato incluso il pacchetto "zerocopy" con primitive di lavoro in memoria veloci per il codice in modalità "unsafe".
- La versione minima dell'insieme di strumenti LLVM necessaria per la costruzione del kernel è stata innalzata a 17.0.1.
- Nella libreria C minimalista nolibc, fornita con il codice sorgente del kernel Linux e che fornisce un wrapping sopra le chiamate di sistema di base, è stato implementato il supporto per le architetture OpenRISC e PA-RISC a 32 bit.
- Nel sottosistema di swap sono state apportate ottimizzazioni che migliorano le prestazioni e riducono il consumo di memoria nello stesso sottosistema escludendo le spese generali per la memorizzazione di metadati statici e unificando il lavoro con la memoria anonima e condivisa nell'utilizzo di volumi. La riduzione del consumo di memoria è piuttosto significativa; ad esempio, montando una partizione di swap di 1 TB si osserva una diminuzione del consumo di memoria di circa 512 MB.
- È stata aumentata l'efficacia del meccanismo di espulsione della memoria, che rimuove o sposta nelle partizioni di swap le aree di memoria per liberare memoria quando questa scarseggia nel sistema. In alcuni carichi di lavoro, ad esempio, durante il test di MongoDB utilizzando YCSB (Yahoo! Cloud Serving Benchmark), si osserva un incremento delle prestazioni fino al 30%.
- Nel sistema di assemblaggio è stata aggiunta la comando «make sbom» per generare elenchi di SBOM (Software Bill Of Materials), che riflettono i componenti del kernel utilizzati nell'attuale assemblaggio, le librerie e le dipendenze, nonché informazioni sulle loro licenze, ottenute dagli header SPDX nei file di codice.
- Nell'implementazione dei canali anonimi (pipe) è stata ottimizzata la gestione dei blocchi (le operazioni di allocazione della memoria sono state spostate al di fuori dell'ambito di blocco), il che ha aumentato la capacità di throughput dei canali anonimi del 21-48% e ha ridotto i ritardi del 17-33%.
- Virtualizzazione e sicurezza
- Nel meccanismo di allocazione della memoria slab (slab allocator) è stata aggiunta la possibilità di utilizzare i token di allocazione della memoria (Allocation Token), implementati nel compilatore Clang 22. I token consentono di contrassegnare le operazioni di allocazione della memoria con identificatori unici e di organizzare una disposizione separata per diversi tipi di oggetti, al fine di complicare l'esploitatabilità delle vulnerabilità causate da overflow del buffer (con la separazione, l'overflow del buffer in un tipo di oggetto è più difficile da utilizzare per danneggiare altri tipi di oggetti).
- Il meccanismo AF_ALG, sfruttato nella vulnerabilità Copy Fail per la modifica dei dati nella cache delle pagine, è stato dichiarato obsoleto ed è previsto per la rimozione in uno dei futuri rilasci. AF_ALG consente di utilizzare acceleratori hardware per calcoli crittografici nell'API Crypto del kernel, ma viene utilizzato in situazioni molto specifiche. Nel kernel 7.2, il supporto per l'I/O asincrono, i vecchi driver e il meccanismo zero-copy nell'implementazione di skcipher e aead è stato rimosso da AF_ALG. Sono state mantenute solo implementazioni software degli algoritmi crittografici e il supporto per gli acceleratori crittografici hardware nell'API crypto del kernel è stato rimosso, poiché AF_ALG amplia significativamente la superficie di attacco, ma non offre vantaggi in termini di prestazioni rispetto all'implementazione della crittografia nello spazio utente. AF_ALG è stato utilizzato nel toolset Cryptsetup, ma il suo supporto è stato rimosso nell'ultima versione 2.8.7.
- Nel meccanismo IMA (Integrity Measurement Architecture), che consente a un servizio esterno di verificare lo stato delle sottosistemi del kernel per assicurarsi che siano autentici, è stato aggiunto il supporto per l'esportazione delle tabelle interne con i risultati delle misurazioni nello spazio utente, rimuovendole dai buffer del kernel per risparmiare memoria.
- Nel modulo Landlock, che fornisce strumenti per limitare l'uso degli oggetti del kernel Linux a programmi non privilegiati (gerarchie di file, socket di rete, ioctl, ecc.), è stata aggiunta la supporto per la gestione dell'accesso ai socket UDP, oltre alla possibilità di disattivare selettivamente la registrazione delle informazioni sul blocco degli oggetti per prevenire l'intasamento dei registri con informazioni irrilevanti.
- Il kernel è stato privato dell'uso della funzione strncpy(), che copia un numero specificato di byte da una stringa di input. L'uso di strncpy() creava rischi di errori a causa della mancanza di un carattere nullo alla fine della stringa o dell'aggiunta di riempimenti di zeri. È consigliato utilizzare le funzioni strscpy() e strscpy_pad() per copiare stringhe terminate con un carattere nullo, oltre a strtomem_pad(), memcpy_and_pad() e memcpy() per copiare stringhe di dimensioni fisse conosciute. Il lavoro per rimuovere l'uso di strncpy() dal kernel è iniziato nel 2020 ed ha richiesto l'adozione di 362 modifiche da parte di 70 sviluppatori.
- Nel hypervisor KVM è stata aggiunta la supporto per le estensioni Intel MBEC (Mode-Based Execution Control) e AMD GMET (Guest-Mode Execution Trap), che consentono di gestire separatamente i diritti di esecuzione del codice per il kernel e lo spazio utente nelle macchine virtuali. In precedenza, le estensioni di virtualizzazione hardware di Intel e AMD permettevano di contrassegnare le pagine di memoria come eseguibili utilizzando un singolo bit, con la separazione dei diritti per il kernel e lo spazio utente a livello di hypervisor. L'uso di MBEC e GMET consente di eliminare i controlli delle autorizzazioni sul lato dell'hypervisor e ridurre significativamente l'intensità dell'onerosa trasmissione di controllo dalla macchina virtuale all'hypervisor VMexit.
- Sottosistema di rete
- L'implementazione dell'estensione TCP-AO (TCP Authentication Option, RFC 5925) è stata trasformata per utilizzare la nuova libreria crittografica libcrypto, semplificando il codice e migliorando l'efficienza. TCP-AO consente di verificare le intestazioni TCP utilizzando i codici MAC (Message Authentication Code), sfruttando algoritmi più moderni HMAC-SHA-1-96 e AES-128-CMAC-96 al posto dell'opzione precedente TCP-MD5 basata sull'obsoleto algoritmo MD5.
- Il numero di sottotrami supportati per le connessioni Multipath TCP (MPTCP) è stato aumentato da 8 a 64.
- È proseguito il lavoro per ridurre l'uso nel stack di rete del kernel del blocco globale rtnl_lock.
- Dalla kernel è stata rimossa l'implementazione dello stack di protocolli AppleTalk, utilizzato nei computer Apple dal 1985 e sostituito negli anni '90 da TCP/IP. Inoltre, sono stati rimossi componenti della tecnologia di trasmissione ATM non legati a PPPoATM, così come interfacce di rete ARCnet basate su bus ISA e PCMCIA, adattatori Bluetooth con interfaccia PCMCIA, acceleratori TLS Chelsea, codice per l'integrazione di TLS con sockmap e supporto per le bande di frequenza 5/10 MHz nello stack wireless cfg80211/mac80211. A causa di problemi irrisolvibili con i blocchi e della mancanza di assistenza, è stata rimossa l'implementazione specifica per l'accelerazione dell'elaborazione TLS basata su TCP Offload Engine (l'implementazione TLS offload più comune è stata mantenuta). È stato disattivato e programmato per essere rimosso il codice di compatibilità con x_tables a 32 bit sui sistemi a 64 bit.
- Nel driver pppoe è stato aggiunto il supporto per i meccanismi GRO (Generic Receive Offload) e GSO (Generic Segmentation Offload) per l'accelerazione hardware della ricomposizione e segmentazione dei pacchetti. L'uso di GRO e GSO consente di aumentare notevolmente la capacità per il traffico in entrata; ad esempio, sui dispositivi MediaTek MT7621 in configurazione con traduttore di indirizzi, la massima capacità è stata aumentata da 130 Mbit/s a 630 Mbit/s.
- Apparecchiatura
- Nel driver AMDGPU è stato introdotto il supporto iniziale per la tecnologia HDMI 2.1 FRL (Fixed Rate Link), che consente la trasmissione di video non compresso con qualità 4K/120Hz e 8K/60Hz. In precedenza, il supporto per HDMI 2.1 non era stato realizzato a lungo nei driver open source a causa dei requisiti di licenza del HDMI Forum, ma ora AMD è riuscita a raggiungere un accordo per un'implementazione simile.
- Nel driver i915 è stato aggiunto il supporto per la configurazione del colore di sfondo da parte del controller di visualizzazione. È stato implementato il parametro pin_params.needs_low_address.
- È proseguito il lavoro sul driver drm (Direct Rendering Manager) Xe per GPU basate sull'architettura Intel Xe, utilizzata nelle schede grafiche Intel della famiglia Arc e nella grafica integrata, a partire dai processori Tiger Lake. È stato aggiunto il supporto iniziale per la piattaforma CRI (Crescent Island). Per le piattaforme dGPU Xe3p è stato realizzato un controller di sistema.
- Nel driver Nouveau sono stati risolti problemi con la GPU NVIDIA GA100.
- Nel driver v3d è stata aggiunta la possibilità di gestire il consumo energetico della GPU v3D sulle schede Raspberry Pi.
- Continuata l'integrazione dei componenti del driver Nova per le GPU NVIDIA dotate di firmware GSP, utilizzati a partire dalla serie NVIDIA GeForce RTX 2000 basata sull'architettura Turing. Il driver è scritto in Rust. Aggiunta la compatibilità con le GPU NVIDIA GA100 e le serie Hopper e Blackwell.
- Aggiunta la compatibilità per piattaforme ARM, SoC e dispositivi: Apple t8122 (M3), Motorola Edge 30, Nothing Phone 3a, Google Pixel 3a XL, Qualcomm Dragonwing IPQ9650, Huawei Hawi, ZTE zx297520v3, Renesas R-Car M3Le, ASPEED AST27xx, Cortina Gemini, NXP i.MX6/8/9, NXP LX2160A, TI K3 AM62x.
Nel frattempo, il Fondo per il software libero dell'America Latina ha creato una versione completamente libera del kernel 7.2 — Linux-libre 7.2-gnu, ripulita da elementi di firmware e driver che contengono componenti non liberi o parti di codice, il cui utilizzo è limitato dal produttore. Nella versione 7.2, è stata effettuata una pulizia da blob dei nuovi driver rt722-sdca e tac5xx2. È stato aggiornato il codice di pulizia nei driver amdgpu, nova core, qcom iris, q6v5, iwlwifi, amdxnda, adreno, r8152 e mt792x. Ha avuto luogo una correzione delle interfacce per il caricamento dei firmware. È stata effettuata una pulizia dei nomi dei blob nei file dts (devicetree) per chip ARM.
Fonte: opennet.ru
