Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.16. Tra le modifiche più significative: un driver per l'accelerazione di OpenVPN, il meccanismo Kexec HandOver, l'attivazione per impostazione predefinita di tabelle delle pagine di memoria a cinque livelli per x86, la rimozione del protocollo DCCP, un driver a blocchi zloop, la possibilità di inviare core dump tramite UNIX socket, il supporto per la scrittura atomica in XFS, l'elaborazione dell'audio in offload per dispositivi USB, ottimizzazioni in Ext4, un driver virtuale TPM (Trusted Platform Module), un'implementazione completa di Device Memory TCP, il supporto per canali anonimi in io_uring, la preparazione all'integrazione del driver DRM di Asahi, il meccanismo "usermode queue" nel driver AMDGPU, il supporto per Intel TDE (Trusted Domain Extensions) e Intel APE (Advanced Performance Extensions).
Nella nuova versione sono stati accettati 15924 correttivi da 2145 sviluppatori, la dimensione della patch è di 50 MB (le modifiche hanno interessato 13793 file, aggiunse 655451 righe di codice, rimosse 316441 righe). Nel rilascio precedente ci sono stati 15945 correttivi da 2154 sviluppatori, la dimensione della patch è di 59 MB. Circa il 45% di tutte le modifiche presentate in 6.16 riguarda i driver delle apparecchiature, circa il 16% delle modifiche è relativo all'aggiornamento del codice specifico per le architetture hardware, il 13% è legato allo stack di rete, il 4% ai file system e il 3% ai sottosistemi interni del kernel.
Novità principali nel kernel 6.16:
- Sottosistema di disco, input/output e file system
- È stato aggiunto il driver zloop per la creazione di dispositivi loopback a blocchi zonati, montabili in modalità loop. Il driver emula il funzionamento di normali dispositivi a blocchi, utilizzando diversi file da un file system esistente (uno per l'archiviazione di ciascuna zona). Questa funzionalità può essere utile per testare file system, gestori di device mapper e applicazioni per verificare il supporto di dispositivi zonati che applicano la suddivisione in zone di gruppi di blocchi o settori, dove è consentito solo l'aggiunta sequenziale di dati con l'aggiornamento dell'intero gruppo di blocchi.
- Nel file system XFS è stato implementato il supporto per la scrittura atomica di grandi quantità di dati: diversi blocchi ora possono essere scritti in modalità atomica (o tutti i blocchi saranno scritti correttamente, oppure nessun blocco verrà scritto).
- Nel file system Ext4 è stata migliorata la performance del meccanismo "fast commit". È stata aggiunta la supporto per grandi fogli di pagine di memoria (large folios) per i file normali, il che ha aumentato le prestazioni del 37% durante i test di I/O sequenziale intensivo. È stata aggiunta la supporto per operazioni di scrittura atomiche che coprono più blocchi.
- Nel driver per il file system ext2 è stata dichiarata obsoleta la supporto del meccanismo DAX, che garantiva l'accesso diretto al FS bypassando la cache delle pagine. È prevista l'eliminazione di DAX dal driver ext2 entro la fine dell'anno. Come motivo viene citata la considerazione del driver ext2 come implementazione di riferimento stabile, nella quale non è ammissibile l'uso di funzionalità specifiche che non hanno ottenuto sufficiente diffusione.
- I file system OrangeFS, UFS, BFS e OMFS sono stati convertiti per utilizzare la nuova API di montaggio delle partizioni.
- In sysctl è stata aggiunta l'impostazione vfs_cache_pressure_denom, per gestire il numero di voci nella cache "dentry" (rappresentazione interna degli elementi delle directory) in condizioni di scarsità di memoria nel sistema. Maggiore è il valore impostato, maggiore sarà il numero di voci che possono essere espulse dalla cache (meno voci rimarranno nella cache) in caso di carenza di memoria.
- Nel FS Bcachefs è stata aggiunta l'opzione "rebalance_on_ac_only", che vieta l'esecuzione di operazioni di ribalanciamento e compressione in background quando il sistema è alimentato a batterie. Sono state accelerate le operazioni di eliminazione di snapshot e dispositivi. È stata ridotta la memoria consumata durante il montaggio in modalità sola lettura. È stata aggiunta la possibilità di avviare alcune operazioni di recupero dopo un guasto in background, senza fermare il lavoro con il FS.
- Al sottosistema di gestione dell'alimentazione è stato permesso di eseguire autonomamente il congelamento dei file system e delle variabili EFI per le modalità di attesa e sospensione (se i FS sono già stati congelati dal gestore nello spazio utente, non viene effettuato un secondo congelamento).
- È stata aggiunta la possibilità di accelerare il funzionamento di EROFS con l'acceleratore QAT (QuickAssist Technology) integrato nei processori Intel, che offre strumenti per velocizzare i calcoli legati alla compressione e crittografia.
- In NFS è stato aumentato da 1 a 4 MB il massimo dimensione del pacchetto di dati per le operazioni di lettura e scrittura (il valore predefinito è impostato a 1 MB, poiché non tutti i client supportano dimensioni maggiori).
- Agli utenti non privilegiati che hanno diritti CAP_SYS_ADMIN in uno spazio dei nomi degli identificatori utente (user namespace), ma non hanno diritti avanzati nello spazio dei nomi principale, è stata concessa la possibilità di utilizzare il meccanismo fanotify per monitorare le modifiche nelle filesystem.
- Per i filesystem che utilizzano il sottosistema FUSE, è stata fornita la funzionalità per pulire contemporaneamente tutte le registrazioni di directory (dentries) memorizzate nella cache. È stata aggiunta al sottosistema FUSE la supporto per grandi volumi di pagine di memoria.
- Nel filesystem OverlayFS è stata realizzata la supporto per la creazione in spazi dei nomi non privilegiati di livelli di dati, per i quali viene utilizzato il controllo di integrità basato sul modulo dm-verity. Questa possibilità consente di combinare livelli di metadati fidati con livelli di dati non fidati, gestiti in spazi dei nomi non privilegiati.
- Memoria e servizi di sistema
- È stato aggiunto il meccanismo KHO (Kexec HandOver) per avviare un nuovo kernel da uno vecchio senza perdita di stato del sistema. Prima di trasferire il controllo alla nuova versione del kernel, lo stato delle principali sottosistemi del kernel può essere serializzato in un'area di memoria che non sarà influenzata da ulteriori operazioni. Il nuovo kernel, una volta ottenuto il controllo, ripristina lo stato serializzato. Sulla base di KHO, viene sviluppato il sottosistema Live Update Orchestrator (LUO), che consente il riavvio del kernel senza interrompere il funzionamento dei dispositivi.
- È stato aggiunto il parametro di compilazione del kernel CONFIG_X86_NATIVE, che consente di utilizzare durante la compilazione l'opzione «-march=native» per ottimizzare tenendo conto delle capacità del processore nel sistema attuale.
- È stata aggiunta la supporto per l'estensione dell'architettura dell'insieme di istruzioni Intel APX (Advanced Performance Extension), fornendo 16 registri generali aggiuntivi (in aggiunta ai 16 esistenti), permettendo di utilizzare nel codice meno operazioni di lettura e scrittura in memoria per migliorare le prestazioni e ridurre il consumo energetico.
- È stata aggiunta una modalità di auto-tuning della politica di distribuzione della memoria nei sistemi NUMA, in cui tutti i pesi dei nodi vengono ricalcolati quando compare una nuova informazione sulla larghezza di banda durante il caricamento o durante il collegamento a caldo della memoria.
- Nell'implementazione dei futex è stata introdotta la supporto per la tabella hash locale dei processi (local futex_hash_bucket), che a differenza della tabella hash globale precedentemente supportata per tutti i processi, è locale per un singolo processo e condivisa da tutti i thread di quel processo. Le tabelle hash locali vengono utilizzate esclusivamente per l'operazione futex PROCESS_PRIVATE. Inoltre, nella nuova versione è stata aggiunta la supporto per le opzioni FUTEX2_NUMA e FUTEX2_MPOL, che permettono di influenzare la collocazione dei futex in memoria, avvicinandoli ai processi che li utilizzano.
- Per i sistemi x86_64 è stata abilitata la supporto permanente per le tabelle di paging a cinque livelli (il parametro CONFIG_X86_5LEVEL, che gestiva l'attivazione delle tabelle a cinque livelli, è stato rimosso).
- Nel driver intel_pstate, che gestisce i parametri di consumo energetico (P-state) sui sistemi con processori Intel, è stata aggiunta la supporto per il funzionamento dello scheduler dei task tenendo conto del consumo energetico (EAS — Energy Aware Scheduling) su processori ibridi, che combinano core CPU ad alte prestazioni e ad alta efficienza energetica, come Intel Lunar Lake.
- Nella sysfs sono stati aggiunti gli interfacce: «/sys/devices/system/cpu/cpuN/cpu_capacity» per ottenere informazioni sulle capacità dei diversi CPU nei processori ibridi e «/sys/devices/system/cpu/cpuidle/intel_c1_demotion» per gestire la possibilità di mantenere il CPU in uno stato di prestazione più elevato, anche se il core tenta di portare il CPU in uno stato di minore consumo energetico (ad esempio, il core può richiedere il passaggio a uno stato di consumo energetico C6, ma il firmware, in caso di elevata intensità di risveglio del CPU, può mantenerlo nello stato C1).
- Per l'architettura ARM64 è stata abilitata la supporto per la modalità di preemption pigra (PREEMPT_LAZY, lazy preemption), che corrisponde alla modalità di preemption completa («full preemption») per i task realtime (RR/FIFO/DEADLINE), ma ritarda la preemption dei task normali (SCHED_NORMAL) fino al limite del tick.
- Per l'architettura ARM64 è stata aggiunta la supporto per l'utilizzo delle estensioni SME (Scalable Matrix Extension), attivabile tramite il parametro CONFIG_ARM64_SME.
- Continua il trasferimento delle modifiche dal ramo 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 è attivo di default e non comporta l'inclusione di Rust tra le dipendenze di build obbligatorie per il kernel). Per i moduli scritti in Rust, è fornita la possibilità di utilizzare configfs. Sono state aggiunte le astrazioni necessarie per lo sviluppo di driver grafici. Ampliate le capacità dei moduli alloc, time, str, list, workqueue e page. Aggiunto il supporto per il macro "assert!" nei test basati su KUnit. Aggiunto un insieme di astrazioni per gestire la frequenza della CPU e l'utilizzo delle API relative alla gestione del consumo energetico. Aggiunto il supporto per la struttura dati 'xarray'.
- Per l'architettura RISC-V è stata trasferita l'implementazione della chiamata di sistema getrandom(), ottimizzata tramite il meccanismo vDSO (virtual dynamic shared object), che consente di spostare il gestore della chiamata di sistema dallo spazio del kernel a quello utente, evitando cambi di contesto. Nei test effettuati, l'ottimizzazione ha accelerato l'ottenimento di numeri casuali di 17 volte. Per RISC-V è stato implementato anche il supporto per le estensioni vettoriali Zicbop, Zabha e Svinval, utilizzate nei processori SiFive.
- Per l'architettura LoongArch il limite sul numero di CPU nel sistema è stato aumentato da 256 a 2048. È stato aggiunto il supporto per il pianificatore di task SCHED_MC (Multi-core).
- È stata aggiunta la possibilità di utilizzare i socket Unix per il trasferimento dei descrittori di file. Per disabilitare tale possibilità, le applicazioni possono utilizzare nel setsockopt() il flag SO_PASSRIGHTS.
- È stata fornita la possibilità di mappare il buffer circolare, utilizzato per tracciare l'attività del kernel, nella memoria dello spazio utente.
- I gestori di crash-dump, utilizzati per generare report sui problemi dopo un arresto anomalo del kernel, possono ora utilizzare le chiavi LUKS utilizzate dal kernel guasto per salvare i crash-dump in file system crittografati.
- Nel sistema di input/output asincrono io_uring è stata aggiunta l'operazione IORING_OP_PIPE per creare canali anonimi, simile alla chiamata di sistema pipe2, ad eccezione del supporto per descrittori di file fissi.
- È stata aggiunta l'opzione della riga di comando del kernel "rt_group_sched" per gestire l'abilitazione del pianificatore di esecuzione per i gruppi di task realtime (SCHED_RR). L'opzione è analoga alla configurazione RT_GROUP_SCHED in Kconfig.
- Per i dispositivi basati sul bus CXL (Compute Express Link), utilizzato per organizzare l'interazione ad alta velocità tra CPU e dispositivi di memoria, è stata implementata la supporto per le estensioni RAS (Reliability, Availability, Serviceability), che consentono di attuare diverse schemi di rilevamento e correzione degli errori. CXL consente di collegare nuove aree di memoria fornite da dispositivi di memoria esterni e di utilizzarle come risorse aggiuntive nello spazio di indirizzamento fisico per espandere la memoria operativa di sistema (DDR) o la memoria persistente (PMEM).
- La versione minima necessaria per la compilation del kernel per tutte le architetture è stata elevata al ramo GCC 8. Per la compilazione è ora anche necessaria almeno la versione del pacchetto binutils 2.30.
- È stata rimossa la chiamata di sistema uselib(), che è stata a lungo dichiarata obsoleta e al suo posto per l'accesso condiviso alle librerie condivise si utilizza mmap().
- Virtualizzazione e sicurezza
- È stata aggiunta una supporto iniziale per l'utilizzo del meccanismo Intel TDX (Trusted Domain Extensions) per la protezione dei sistemi guest che operano sotto il controllo dell'hypervisor KVM, da interferenze e analisi da parte dell'amministratore del sistema host e attacchi fisici all'hardware. La protezione è garantita tramite la crittografia della memoria. macchine virtuali.
- È stato aggiunto un driver virtuale TPM (Trusted Platform Module), che consente alle macchine virtuali di interagire con i dispositivi TPM (Trusted Platform Module), emulati dal modulo SVSM (Secure VM Service Module).
- È stata ripristinata la possibilità di utilizzare il plugin GCC randstruct, che randomizza la disposizione delle strutture dati in fase di compilazione per complicare l'exploitation delle vulnerabilità.
- È stata aggiunta la possibilità di utilizzare la tecnologia IMA (Integrity Measurement Architecture) per il controllo dell'integrità durante l'avvio di nuovi kernel tramite la chiamata di sistema kexec.
- È stato fatto un lavoro per ridurre l'impatto sulle prestazioni dell'uso di SELinux. Per accelerare il funzionamento è stata aggiunta una cache con i risultati dei controlli di accesso alle directory. Nelle regole genfscon è stata aggiunta la possibilità di utilizzare le maschere.
- Nel codice per l'interazione con EFI è stata fornita la possibilità di incorporare una sezione SBAT (UEFI Secure Boot Advanced Targeting) con metadata sulle versioni revocate dei componenti di avvio.
- Nei moduli caricabili è stato effettuato il passaggio della sezione «.static_call_sites» in modalità sola lettura dopo il completamento dell'inizializzazione.
- Per i sistemi ARM a 64 bit, il hypervisor KVM supporta la virtualizzazione annidata (disabilitata per impostazione predefinita).
- Nel hypervisor KVM è stata dichiarata stabile la supporto per l'architettura RISC-V.
- Sottosistema di rete
- È stato aggiunto il driver ovpn, che consente di aumentare notevolmente le prestazioni di OpenVPN spostando le operazioni di crittografia, gestione dei pacchetti e controllo del canale a livello del kernel di Linux. Il driver riduce le spese generali associate al cambio di contesto, permette di ottimizzare il lavoro tramite l'accesso diretto alle API interne del kernel e elimina la lenta trasmissione dei dati tra il kernel e lo spazio utente (la crittografia, la decifratura e il routing vengono eseguiti dal modulo senza inviare il traffico al gestore nello spazio utente).
- Nel meccanismo Device Memory TCP è stata aggiunta la supporto per l'invio di dati dalla memoria del dispositivo (percorso TX). In precedenza, per semplificare l'integrazione del Device Memory TCP nel kernel, la funzionalità era limitata alla ricezione dei dati (percorso RX). Device Memory TCP consente di utilizzare socket di rete per inviare direttamente il contenuto della memoria del dispositivo periferico attraverso la rete (modalità zero-copy), nonché di collocare direttamente il contenuto dei pacchetti di rete nell'area di memoria del dispositivo sul lato del ricevitore. I dati trasmessi nei pacchetti vengono trasferiti dalla scheda di rete alla memoria del dispositivo periferico (DMABUF), ad esempio, nella memoria video della GPU, o dalla memoria del dispositivo alla scheda di rete direttamente, bypassando la CPU, mentre le intestazioni dei pacchetti entrano nei normali buffer del kernel.
- È stata fornita la possibilità di inviare il contenuto dei core dump attraverso il socket AF_UNIX, consentendo di creare nello spazio utente gestori di core dump più sicuri, non legati alla chiamata di processi privilegiati da parte del kernel.
- È stata rimossa la supporto per il protocollo di rete DCCP (Datagram Congestion Control Protocol), che non ha avuto diffusione e è rimasto nel kernel senza supporto per cinque anni. La rimozione del DCCP dal kernel eliminerà gli ostacoli che impediscono di rielaborare la struttura dati inet_connection_sock per aumentare l'efficienza del stack TCP. È rimasta la supporto per i moduli netfilter per il filtraggio dei pacchetti DCCP.
- Per semplificare la gestione degli errori nell'uso dei socket SO_PEERPIDFD, il kernel può ora trasmettere pidfd per i processi già terminati (pidfd è legato a processi specifici e, a differenza di pid, non viene riassociato).
- Utilizzando BPF, ora è possibile creare gestori per la gestione delle code dei pacchetti nello stack di rete (qdiscs) per influenzare l'ordine di elaborazione dei pacchetti di rete.
- Nella rete di file AFS è stato implementato GSSAPI (Generic Security Services API) per gestire la crittografia delle connessioni con server YFS e OpenAFS.
- È stata apportata una grande serie di ottimizzazioni. L'organizzazione dei lock per le tabelle di routing IPv6 è stata rielaborata (alcune operazioni di routing ora si svolgono fino a 3 volte più velocemente). È stato accelerato il calcolo software delle somme di controllo crc32c. Il motore GRO per il traffico UDP incapsulato è stato velocizzato del 10%. È stato migliorato l'adattamento automatico del buffer di ricezione per TCP e sono stati aumentati i limiti di default (nei test condotti, la larghezza di banda per flussi singoli attraverso un canale di 200Gbs è aumentata del 60%).
- In Netfilter è stata aggiunta la possibilità di utilizzare maschere nei nomi delle interfacce di rete impiegate in netdev e flowtable. Nella infrastruttura nft trace è stata integrata l'informazione sul tracciamento delle connessioni (conntrack). È stato accelerato il recupero delle tabelle di tracciamento delle connessioni (conntrack) tramite procfs.
- Apparecchiatura
- È stata aggiunta la supporto per l'elaborazione dei flussi audio sul lato dei dispositivi audio con interfaccia USB (USB audio offload). Questa modifica consente di ridurre notevolmente il consumo energetico dei dispositivi portatili continuando l'elaborazione del flusso audio mentre il resto del sistema è in modalità sospensione. In precedenza, nei kernel per la piattaforma Android era fornita un'implementazione specifica del trattamento offload dell'audio per i dispositivi USB, mentre ora nel kernel principale è apparsa un'implementazione universale che può essere utilizzata da qualsiasi progetto.
- Continuata l'integrazione dei componenti del driver Nova per GPU NVIDIA, dotate di firmware GSP utilizzati a partire dalla serie NVIDIA GeForce RTX 2000 basata sull'architettura Turing. Il driver è scritto in Rust. In aggiunta al componente nova-core aggiunto nel rilascio precedente, che implementa il livello di astrazione di base delle interfacce dei firmware GSP, nella versione 6.16 è stata inclusa una prima implementazione del driver DRM nova-drm (Direct Rendering Manager) per l'interazione con la GPU dallo spazio utente.
- Iniziato il processo di integrazione nel kernel del driver DRM Asahi per GPU Apple AGX, utilizzati nei chip Apple Silicon. Il driver è scritto in Rust. In questa fase, nel kernel sono stati inclusi solo i file di intestazione con UAPI del driver Asahi, necessari per Mesa, mentre il codice principale del driver Asahi verrà integrato in seguito.
- Aggiunta nel driver Nouveau il supporto per GPU NVIDIA delle famiglie Hopper e Blackwell.
- Proseguita la lavorazione del 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. È stata aggiunta la possibilità di utilizzare diversi file di firmware per diverse famiglie di GPU Intel.
- Nel driver AMDGPU implementato il supporto per il meccanismo "usermode queue", che consente di creare code di lavoro personalizzate nello spazio utente e inviarle direttamente alla GPU senza fare riferimento al pianificatore nel kernel. Il supporto per "usermode queue" è attivo per GPU Navi 4X e GFX 12.
- Aggiunto il supporto per i sistemi audio Intel WCL (Whiskey Lake), AMD ACP 7.x (Audio Co-Processor), Cirrus Logic CS35L63 e CS48L32, Everest Semiconductor ES8375 e ES8389, Pioneer DJM-V10, Longsoon-1 AC’97, NVIDIA Tegra264, Richtek ALC203, RT9123 e Rockchip SAI, così come per nuove piattaforme Intel AVS.
- Aggiunto il supporto per piattaforme ARM, SoC e dispositivi: Samsung Exynos7870, Qualcomm Snapdragon X1P42100, Qualcomm MSM8926, RK3562, NXP i.MX94, Renesas RZ/V2N, Amlogic S6/S7/S7D, WonderMedia wm8950, Amlogic s805y, Allwinner A523, Toradex Verdin AM62P, ROCK 5B+, Nitrogen8M Plus, Retronix R-Car V4H Sparrow Hawk, MT8186 Ponyta Chromebook, VIA APC Rock/Paper, Renesas rz/t2h, ASUS Transformer Pad LTE TF300TL, LG Nexus 4, Google Pixel 4a, Raspberry Pi 2.
- Rimosso il driver per schede di acquisizione video basate su chip STA2X11.
Allo stesso tempo, la Fondazione Latinoaamericana del Software Libero ha creato la versione completamente libera del kernel 6.16 — Linux-libre 6.16-gnu, ripulita da elementi di firmware e driver contenenti componenti non liberi o sezioni di codice il cui utilizzo è limitato dal produttore. Nella versione 6.16 è stata neutralizzata l'aggiunta di blob nei nuovi driver Intel qat 6xxx crypto, ST vd55g1 sensor, ath12k AHB wifi, Aeonsemi AS21xxx e MediaTek 25Gb Ethernet. Sono stati puliti i nomi dei blob nei file dts (devicetree) per i chip ARM Qualcomm e MediaTek. Il codice di pulizia dei blob è stato aggiornato nei driver Nova Core, Nouveau, Realtek r8169 Ethernet, Qualcomm Iris, Venus, Mediatek mt7996 wifi, Qualcomm ath11k e ath12k wifi, Texas Instruments tas2781 e Renesas R-Car gen4 PCIe.
Fonte: opennet.ru
