Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.18. Tra i cambiamenti più significativi: dm-pcache per la cache su disco nella memoria non volatile (PMEM), rimozione di Bcachefs, modalità di verifica online per XFS, driver Binder (Android IPC) e Tyr (GPU Mali) in Rust, possibilità di creare driver USB in Rust, ottimizzazione della cache nell'allocatore di memoria SLUB, indirizzamento degli spazi dei nomi tramite descrittori di file, accelerazione dello swap, verifica delle BPF tramite firma digitale, virtualizzazione Intel CET in KVM, protocollo di rete PSP (ibrido TLS e IPsec), supporto per l'estensione IP AccECN, ottimizzazione dello stack UDP.
Nella nuova versione sono stati accettati 15035 miglioramenti da 2217 sviluppatori, dimensione della patch — 45 MB (le modifiche hanno riguardato 13142 file, aggiunte 601897 righe di codice, rimosse 355006 righe). Nella versione precedente ci sono stati 14334 miglioramenti da 2118 sviluppatori, dimensione della patch — 46 MB. Circa il 40% di tutte le modifiche presentate in 6.18 riguardano i driver dei dispositivi, circa il 16% delle modifiche riguarda l'aggiornamento del codice specifico per architetture hardware, il 12% riguarda lo stack di rete, il 5% i file system e il 3% i sottosistemi interni del kernel.
Le principali novità nel kernel 6.18 (1, 2, 3):
- Sottosistema di disco, input/output e file system
- Nel Device Mapper è stato aggiunto il gestore dm-pcache per utilizzare la memoria permanente (memoria CXL, indirizzabile tramite dispositivo DAX) come ulteriore cache ad alte prestazioni prima di dischi tradizionali o unità flash più lenti. Dm-pcache garantisce la conservazione dei contenuti della cache in caso di crash grazie all'uso di memoria non volatile, duplicazione dei metadati e verifica dell'integrità dei dati e dei metadati tramite checksum CRC32. Attualmente viene supportata solo la cache in modalità write-back.
- Dal kernel è stato rimosso il codice del file system Bcachefs, che ora sarà distribuito come modulo esterno, compilato utilizzando strumenti DKMS (Dynamic Kernel Module Support). Il codice Bcachefs potrebbe essere reintegrato nel kernel dopo che Kent Overstreet dimostrerà effettivamente la possibilità di interagire correttamente con altri sviluppatori del kernel e la capacità di seguire le regole consolidate di sviluppo.
- Nella chiamata di sistema pwritev2() è stato aggiunto il flag RWF_NOSIGNAL, che disabilita l'invio del segnale SIGPIPE durante la scrittura in tubi o socket anonimi interrotti.
- In Procfs è stata aggiunta l'opzione di montaggio «pidns» per specificare gli spazi dei nomi degli identificatori di processo (PID namespace). Ad esempio: «mount -t proc -o pidns=\/proc\/self\/ns\/pid proc \/tmp\/proc».
- In XFS è stata dichiarata stabile e abilitata per impostazione predefinita la possibilità di utilizzare l'utilità fsck per controllare e correggere i problemi riscontrati in modalità online, senza smontare il filesystem. Sono state aggiunte le chiamate di sistema file_getattr e file_setattr per modificare gli attributi dei file speciali (qualsiasi inode). In KConfig, per impostazione predefinita, sono state disabilitate le opzioni XFS_SUPPORT_V4 (versione 4 di XFS) e XFS_SUPPORT_ASCII_CI (modalità senza distinzione tra maiuscole e minuscole dei caratteri ASCII), dichiarate obsoleto. Sono state rimosse le opzioni di montaggio obsolete attr2, noattr2, ikeep e noikeep.
- In MD RAID è stato implementato un nuovo tipo di bitmap — llbitmap (bitmap senza lock), funzionante senza blocchi e che offre prestazioni superiori.
- Dalla struttura generale «inode» è stata estratta l'informazione relativa alla crittografia e alla verifica (puntatori i_crypt_info e i_verity_info). Questa modifica riduce il consumo di memoria nei filesystem che non supportano crittografia e verifica.
- Nel sottosistema FUSE è stato aggiunto il supporto per la chiamata di sistema copy_file_range() e la copia diretta di intervalli utilizzando una dimensione con tipo a 64 bit (in precedenza era supportata solo la dimensione a 32 bit). È stato aggiunto il supporto per l'inizializzazione in modalità sincrona durante il montaggio (FUSE_DEV_IOC_SYNC_INIT).
- Nel filesystem ext4 è stata implementata la possibilità di utilizzare identificatori utente (uid) e di gruppo (gid) a 32 bit per accedere ai blocchi riservati. Sono state aggiunte le operazioni ioctl per impostare e leggere i parametri del superblocco dei filesystem montati (tune2fs potrà modificare i parametri nel superblocco senza diritti di scrittura sul dispositivo a blocchi). Sono state completamente rimosse le impostazioni obsolete specifiche per ext3.
- In f2fs è stata aggiunta un'opzione di montaggio «lookup_mode» per scegliere la modalità di ricerca: perf — ricerca tramite hash, compat — ricerca lineare, auto — selezione automatica. Cambiare la modalità ha senso per le configurazioni con directory in cui non viene tenuto conto del maiuscolo/minuscolo. La modalità di ricerca corrente può essere verificata tramite il file «/sys/fs/f2fs//effective_lookup_mode». È stata aggiunta la possibilità di riservare inode disponibili solo per utenti privilegiati.
- In Overlayfs è stata aggiunta una modalità di lavoro che non tiene conto del maiuscolo/minuscolo, abilitata a livello di strati del file system (l'impostazione per singole directory non è ancora supportata).
- In BTRFS è stato migliorato il parallelismo delle operazioni sotto carico intenso di lettura e basso carico di scrittura, ridotto il tempo di commit delle transazioni e notevolmente accorciato il tempo di sincronizzazione (da minuti a decine di secondi). È stata fornita la possibilità di utilizzare blocchi (bs) di dimensioni superiori a quelle di una pagina di memoria (ps).
- In ksmbd (che opera a livello di kernel come server SMB) è stato aggiunto un parametro per limitare il numero massimo di connessioni da uno solo. Indirizzi IP. smbdirect, smbclient e smbserver sono stati aggiornati per utilizzare le strutture tipiche del kernel.
- In SQUASHFS è stata aggiunta la possibilità di utilizzare nel syscall lseek() le opzioni SEEK_DATA e SEEK_HOLE per cercare dati e spazi vuoti in file sparsi. In alcuni test si è registrato un aumento della prestazione nel copiare file sparsi fino a 150 volte.
- In EXFAT è stata aggiunta la supporto per ioctl FS_IOC_GETFSLABEL e FS_IOC_SETFSLABEL per leggere e scrivere le etichette delle partizioni. È stata fornita la possibilità di modificare le opzioni di montaggio durante il rimontaggio. È stato accelerato il caricamento delle bitmap.
- In NTFS3 è stato aggiunto il supporto per ioctl FS_IOC_GETFSLABEL e FS_IOC_SETFSLABEL per leggere e impostare le etichette delle partizioni.
- Memoria e servizi di sistema
- È stata accettata l'implementazione del meccanismo di interprocess communication Binder, scritto in Rust. Binder è utilizzato in Android per facilitare l'interazione tra processi e la chiamata remota di metodi (un processo Android può chiamare un metodo o una funzione in un altro processo Android, utilizzando Binder per identificare, chiamare e passare argomenti tra i processi). Il codice di Binder è stato riscritto in Rust nell'ambito dell'iniziativa di Google per rafforzare la sicurezza di Android.
- In SLUB, l'allocatore di memoria del kernel, è stato implementato un layer di caching opzionale chiamato "sheaves", che utilizza più cache, ognuna delle quali è associata a un singolo core CPU, consentendo così di localizzare le operazioni di allocazione o deallocazione di memoria a un solo core. Questo tipo di cache ha aumentato le prestazioni di allocazione e deallocazione di memoria nel kernel, grazie all'eliminazione di primitivismo di sincronizzazione ridondante richiesto dall'interazione tra diversi core CPU. Nei test eseguiti, il guadagno di prestazioni è stato compreso tra il 6.3% e il 31% a seconda del tipo di carico.
- È stata aggiunta la possibilità di creare file descriptor associati a uno specifico spazio dei nomi (namespace). A differenza dell'accesso agli spazi dei nomi tramite identificatori (\/proc\//ns\/), il file descriptor è vincolato a un'istanza specifica dello spazio dei nomi ed esclude la situazione in cui un identificatore viene riutilizzato e punta già a un altro oggetto. Analogamente all'uso di pidfds, l'apertura dei file descriptor che fanno riferimento agli spazi dei nomi avviene tramite le funzioni open_by_handle_at() e name_to_handle_at().
- È stato implementato un meccanismo chiamato "Swap Table", che consente di migliorare le prestazioni dello swapping. L'accelerazione si ottiene grazie alla riduzione della competizione per l'accesso alla cache dello swapping, a una ricerca più efficiente nella cache e a una diminuzione della frammentazione. Il backend basato sulla Swap Table è stato utilizzato per il caching dello swapping invece del backend XArray, consentendo in media un aumento delle prestazioni del 5-20%. Nel test usemem, la larghezza di banda è aumentata del 17-28%, e nel test di ricompilazione multithread del kernel, il tempo di compilazione è diminuito tra l'1.12% e il 3.19%; il test redis-benchmark con BGSAVE ha mostrato un aumento nel numero di richieste elaborate del 6-7%.
- Il sottosistema Zswap è stato trasferito all'uso diretto del sistema di allocazione della memoria zsmalloc invece dello strato zpool, che non viene più utilizzato e ora è stato rimosso dal kernel.
- Per gestire il comportamento del caricatore di microcodice sui sistemi x86 è stata implementata un'opzione della linea di comando "microcode=elenco di flag". Nella sua forma attuale, la nuova opzione ha sostituito "microcode.force_minrev" e consente anche di specificare la versione minima di microcodice consentita per il caricamento.
- È iniziato il lavoro di riorganizzazione della struttura «page», eccessivamente gonfiata, utilizzata per la gestione delle pagine della memoria operativa. È stato aggiunto il tipo ‘memdesc_flags_t» per i campi con flag universali, che potranno essere utilizzati dopo l'atteso futuro allocamento dalla struttura «page» di strutture separate per slab e folii (folio).
- Per l'architettura nios2, utilizzata nei processori Altera Nios II (soft-processor basato su FPGA), è stata implementata la supporto per la chiamata di sistema clone3().
- Nella configurazione del kernel (KConfig) è stato aggiunto l'attributo «transitional», che può essere utilizzato per contrassegnare le impostazioni non visualizzate nelle interfacce utente, come «make menuconfig», e non incluse nei file di configurazione generati. Lo scopo principale dell'attributo è semplificare la rinomina delle opzioni mantenendo la retrocompatibilità.
- La versione minima del compilatore Clang, con cui può essere compilato il kernel, è stata elevata a LLVM 15. In Debian 12 e Ubuntu 22.04 è fornito LLVM 14.
- Continua il trasferimento delle modifiche dal ramo Rust-for-Linux, legate all'uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel (il supporto per Rust non è attivo per impostazione predefinita e non richiede Rust tra le dipendenze di compilazione obbligatorie del kernel). Nella nuova versione sono state implementate operazioni atomiche con la memoria per il codice Rust, la struttura maple tree, la possibilità di creare file DebugFS e funzioni per la manipolazione delle bitmap. È stato ampliato l'accesso all'API per lo sviluppo di driver. È stato aggiunto un set completo di astrazioni per lo sviluppo di driver USB (esempio di driver USB). Nello strumento perf è stata aggiunta la supporto per i simboli di debug generati dal compilatore rustc.
- Virtualizzazione e sicurezza
- È stata aggiunta la supporto per la verifica crittografica dei programmi BPF caricabili tramite firma digitale. In futuro questa possibilità sarà ampliata con strumenti per definire le regole di caricamento dei programmi BPF firmati e per fornire agli utenti non privilegiati la possibilità di utilizzare programmi BPF verificati.
- Nel hypervisor KVM è stata implementata la supporto per la virtualizzazione della tecnologia Intel CET (Control-flow Enforcement Technology), utilizzata per proteggere contro exploit che impiegano metodi di programmazione orientata al ritorno (ROP - Return-Oriented Programming). Il nocciolo della protezione è che, dopo aver passato il controllo a una funzione, l'indirizzo di ritorno è memorizzato dal processore non solo nello stack normale, ma anche in uno stack shadow separato, che non può essere alterato direttamente.
- È stata aggiunta la possibilità di utilizzare più di 255 CPU nei sistemi guest che operano sotto l'iperovsir Bhyve su host con FreeBSD 15.
- È stato aggiunto un layer dibs (Direct Internal Buffer Sharing) per la condivisione controllata dei buffer all'interno di un ambiente isolato, come un hypervisor o un'istanza del kernel Linux.
- Nel sottosistema di auditing è stata aggiunta la supporto per il funzionamento con più moduli LSM (Linux Security Module) attivati contemporaneamente.
- È stato aggiunto il driver virtio spi-virtio per l'accesso a un dispositivo SPI (Serial Peripheral Interface) da macchine virtuali.
- Nel hypervisor KVM è stata aggiunta la supporto per la modalità SEV-SNP CipherText Hiding, che blocca la lettura del testo cifrato nella memoria dei sistemi guest protetti da CPU non autorizzate.
- È stato aggiunto il driver qtee per ambienti TEE (Trusted Execution Environment) nei chip Qualcomm.
- Sottosistema di rete
- È stata aggiunta la supporto per la cifratura delle connessioni TCP, utilizzando il protocollo PSP (PSP Security Protocol), sviluppato da Google per cifrare il traffico tra i data center. PSP offre cifratura, controllo crittografico dell'integrità e autenticazione dell'origine, realizzando una sorta di combinazione delle capacità dei protocolli TLS e IPsec. In PSP viene utilizzata la cifratura a livello di singole connessioni di rete, piuttosto che dell'intero canale di comunicazione. PSP impiega chiavi di cifratura separate per diverse connessioni TCP tunnelizzate per un rigido isolamento del traffico tra diverse applicazioni e gestori. Per ridurre il carico sulla CPU, è supportata la delega delle operazioni di cifratura e decifratura alle schede di rete (offload). Il protocollo UDP viene utilizzato come trasporto per la trasmissione dei dati, sopra il quale viene instradato il contenuto del pacchetto TCP originale.

- È stata aggiunta la supporto iniziale per l'estensione AccECN (Accurate Explicit Congestion Notification), una versione migliorata dell'estensione ECN che consente agli host, in caso di congestione, di contrassegnare i pacchetti IP anziché scartarli. Questo permette di identificare l'insorgere di una prima fase di blocco nei canali di comunicazione senza perdita di pacchetti. L'estensione originale ECN ha una limitazione che consente di segnalare solo un sovraccarico durante un ciclo di invio e ricezione TCP (RTT, Round-Trip Time, invio della richiesta e ricezione della risposta). AccECN rimuove tale limitazione e consente al ricevente di inviare al mittente più di un'etichetta di sovraccarico nell'intestazione del pacchetto TCP. Gli algoritmi di gestione della congestione possono utilizzare le informazioni ricevute per rispondere in modo più preciso ai sovraccarichi, evitando un'improvvisa riduzione dell'intensità di invio dei pacchetti in presenza di un sovraccarico lieve.
- Nello stack UDP è stata ottimizzata la gestione dei pacchetti in arrivo in condizioni di attacchi DDoS, che comportano l'arrivo di un gran numero di pacchetti in uno o più socket UDP. Le ottimizzazioni apportate, come la riduzione delle lock in competizione, l'ottimizzazione della collocazione delle strutture dati in memoria e l'impiego di lock che tengono conto dell'architettura NUMA (Non-Uniform Memory Access), hanno permesso di aumentare le prestazioni nella ricezione dei pacchetti UDP del 47% e oltre in condizioni estreme.
- È stata implementata la possibilità di disabilitare la cache di input/output sul server NFS, consentendo l'utilizzo del server NFS in sistemi con una quantità limitata di memoria (ad esempio, in ambienti cloud ridotti). Disattivare la cache può essere utile anche sui server NFS sovraccarichi per evitare l'espulsione dalla cache dei dati legati ai dischi locali, liberando memoria per la cache NFS.
- La dimensione massima dei buffer dei pacchetti in arrivo e in partenza per i socket di rete (net.core.rmem_max e net.core.wmem_max) è stata incrementata da 2 MB a 4 MB. La dimensione predefinita impostata non è cambiata (net.core.rmem_default e net.core.wmem_default = 2 MB).
- È stato aggiunto un driver per l'acceleratore delle operazioni di rete Qualcomm PPE (Packet Processing Engine), utilizzato nel SoC Qualcomm IPQ9574.
- È stata aggiunta la supporto per la cifratura delle connessioni TCP, utilizzando il protocollo PSP (PSP Security Protocol), sviluppato da Google per cifrare il traffico tra i data center. PSP offre cifratura, controllo crittografico dell'integrità e autenticazione dell'origine, realizzando una sorta di combinazione delle capacità dei protocolli TLS e IPsec. In PSP viene utilizzata la cifratura a livello di singole connessioni di rete, piuttosto che dell'intero canale di comunicazione. PSP impiega chiavi di cifratura separate per diverse connessioni TCP tunnelizzate per un rigido isolamento del traffico tra diverse applicazioni e gestori. Per ridurre il carico sulla CPU, è supportata la delega delle operazioni di cifratura e decifratura alle schede di rete (offload). Il protocollo UDP viene utilizzato come trasporto per la trasmissione dei dati, sopra il quale viene instradato il contenuto del pacchetto TCP originale.
- Apparecchiatura
- Il kernel include il driver Tyr, scritto in Rust, che gestisce i GPU ARM Mali, che utilizzano la tecnologia CSF (Command Stream Frontend), come Mali G310, G510 e G710. Il driver non è ancora pronto per l'uso costante da parte degli utenti normali ed è considerato un prototipo sperimentale per testare le astrazioni per lo sviluppo di driver in Rust.
- Nei driver per dispositivi di input con interfaccia HID (Human Interface Device) è stato aggiunto il supporto per touchpad con feedback tattile e sensori di pressione.
- È proseguito il lavoro sul driver drm (Direct Rendering Manager) Xe per GPU basati sull'architettura Intel Xe, utilizzata nelle schede grafiche Intel della famiglia Arc e nella grafica integrata, a partire dai processori Tiger Lake. Nella nuova versione è stata aggiunta l'interfaccia madvise, è stato incluso il supporto per SR-IOV PF (Single Root I/O Virtualization Physical Function), è stato aggiunto il supporto per la modalità Intel PSMI per la validazione dell'hardware, è stata garantita l'elaborazione delle informazioni sugli errori trasmesse dai firmware, è stato implementato il profilo di consumo energetico SLPC e è stato aggiunto il supporto per il caricamento di firmware ausiliari (ad esempio, per il controller della ventola e il regolatore di tensione) durante il controllo del driver.
- Nel driver AMDGPU è stato aggiunto il supporto per dispositivi con APU Cyan Skillfish, migliorato il supporto per AMD GCN 1.0, implementata la compatibilità con l'utensile criu, e sono state aggiunte metriche di temperatura in sysfs, oltre a autorizzare le richieste di rimappatura MMIO dallo spazio utente.
- Nel driver i915 è stato incluso il supporto per chip della famiglia Wildcat Lake e migliorata la compatibilità con GPU Jasper Lake, Elkhart Lake, Gen7 e Gen6.
- Nel driver Nouveau sono state attivate per default le GSP-firmware NVIDIA e migliorata l'elaborazione degli errori.
- È proseguita l'integrazione dei componenti del driver Nova per GPU NVIDIA dotate di GSP-firmware, utilizzate a partire dalla serie NVIDIA GeForce RTX 2000 basata sull'architettura Turing. Il driver è stato scritto in Rust. Nella nuova versione è stato ampliato il supporto per le firmware GSP, migliorata l'implementazione del macro "register!", e aggiunto il supporto per classi di dispositivi PCI e identificatori dei produttori.
- È stato aggiunto il driver rocket per acceleratori NPU, utilizzati nei SoC Rockchip RK3588.
- È stato aggiunto il parametro del kernel "boot_display" per scegliere il dispositivo di output per il visualizzatore del processo di avvio su sistemi con più GPU.
- Nel driver vesadrm è stata implementata la supporto per palette a 8 bit.
- Nel driver msm è stato aggiunto il supporto per la GPU Adreno 663 ed è stata implementata la tecnologia di riduzione del consumo energetico IFPC (Inter Frame Power Collapse).
- Nel driver panthor è stato aggiunto il supporto per GPU Mali-G710, Mali-G510, Mali-G310, Mali-Gx15, Mali-Gx20 e Mali-Gx25.
- È stato aggiunto il supporto per i sistemi audio ASoC Qualcomm Glymur e PM4125, Realtek RT1321, Shanghai FourSemi FS2104/5S, Texas Instruments PCM1754 e TAS2783A, qcs615, CS35L56 B2, tas2118, tas2x20, tas5825. È stato aggiunto il supporto per le schede audio USB Tascam US-144mkII e Presonus S1824c.
- È stato aggiunto il supporto per l'ARM CPU Cortex-A320/A520AE/A720AE e C1-Nano/Pro/Premium/Ultra.
- È stato aggiunto il supporto per piattaforme ARM, SoC e dispositivi: Apple M2 Pro, M2 Max e M2 Ultra, Sony Xperia SP, Samsung Galaxy S22, Samsung Galaxy S20 FE, ASUS Eee Pad Slider SL101, Lenovo ThinkBook 16, HP Omnibook X14 X1P42100, Dell Inspiron 7441 / Latitude 7455, Sige1, NanoPi Zero2, Axis Artpec8, NXP i.MX91, ROCK 2A/2F, Qualcomm Lemans Auto, Renesas RZ/T2H, RZ/N2H, RZ/T2H e RZ/N2H, Aspeed AST27xx, Meta Clemente BMC, Netcube Nagami som, Tqma91xx, Ultratronik i.MX8MP Ultra-MACH, i.MX8ULP EVK9, Buffalo WXR-1750DHP.
Contemporaneamente, la Fondazione del Software Libero Latinoamericana ha formato una versione completamente libera del kernel 6.18 — Linux-libre 6.18-gnu, ripulita da elementi di firmware e driver contenenti componenti non liberi o sezioni di codice il cui ambito di applicazione è limitato dal produttore. Nella versione 6.18 è stato aggiornato il codice di pulizia dei blob nei driver Nova-Core, Intel XE, TI PRUeth, Lantiq GSWIP, Marvell WiFi-Ex. È stata effettuata una pulizia dei nomi dei blob nei file dts (devicetree) per i chip ARM Qualcomm, Mediatek e TI ARM64. È stato neutralizzato il caricamento dei blob nei nuovi driver FourSemi fs2104/5s, TI TAS2783 e Qualcomm GENI.
Fonte: opennet.ru

