Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.17. Tra le modifiche più significative: miglioramento delle prestazioni di Btrfs, chiamate di sistema file_getattr() e file_setattr(), unificazione delle configurazioni a singolo e più processori nel pianificatore di attività, il modulo DAMON_STAT con statistiche di accesso alla memoria, supporto ai Live patch nei sistemi ARM64, invio di core dump tramite socket AF_UNIX, limitazione di SCHED_EXT tramite cgroup, semplificazione della configurazione per la protezione dalle vulnerabilità della CPU, build in Clang con inizializzazione delle variabili nello stack, protezione contro la sostituzione di /proc, espansione del sottosistema RV (Runtime Verification), limitazione dei socket AF_UNIX tramite AppArmor, algoritmo di controllo dei sovraccarichi TCP DualPI2.
Nella nuova versione sono stati inclusi 14334 fix da 2118 sviluppatori, dimensione della patch: 46 MB (le modifiche hanno interessato 12841 file, aggiunte 646654 righe di codice, rimosse 398782 righe). Nella precedente versione erano stati 15924 fix da 2145 sviluppatori, dimensione della patch: 50 MB. Circa il 43% di tutte le modifiche presentate in 6.17 sono relative ai driver dei dispositivi, circa il 12% riguarda l'aggiornamento del codice specifico per le architetture hardware, il 14% è legato allo stack di rete, il 4% ai file system e il 3% ai sottosistemi interni del kernel.
Novità principali nel kernel 6.17 (1, 2, 3):
- Sottosistema di disco, input/output e file system
- In Btrfs è stato aggiunto il supporto sperimentale per le grandi foliate di pagine di memoria (large folios), che consentono di ridurre le spese generali e aumentare le prestazioni in una serie di operazioni. È stata implementata la cache delle richieste a bitmap di allocazione dello spazio libero, grazie alla quale le prestazioni nella creazione di file vuoti sono aumentate del 20%. È stato migliorato il prefetching nei sistemi che utilizzano la compressione dei dati. È stata garantita una disposizione più compatta delle chiavi nella struttura XArray, aumentando la compattezza della memorizzazione dei nodi dell'albero degli extent e riducendo il numero di nodi finali del 50-70%. Sono state fornite ulteriori impostazioni per l'uso della compressione negli extent deframmentati.
- Nel file system ext4 è stato introdotto il supporto per l'I/O buffered con il flag RWF_DONTCACHE, in cui i dati vengono rimossi dalla cache delle pagine subito dopo il completamento dell'operazione.
- Nel file system EROFS è stato implementato il supporto per la compressione dei metadati.
- Il server NFS può ora delegare le operazioni di scrittura ai client che aprono file in modalità solo scrittura.
- Nella chiamata di sistema fallocate() è stato aggiunto il flag FALLOC_FL_WRITE_ZEROES, che consente di riempire di zeri l'intervallo specificato in un file, utilizzando il comando WRITE_ZERO supportato da alcuni SSD, che esegue la cancellazione senza operazioni di input/output. L'opzione è attualmente disponibile solo nel file system ext4.
- Sono state aggiunte le chiamate di sistema file_getattr() e file_setattr() per manipolare gli attributi dell'inode di un file specificato.
- È stato rimosso il driver «pktcdvd» per la gestione dei supporti ottici in modalità pacchetto, che era stato segnato come deprecato nel 2016.
- Il file system Bcachefs nel kernel Linux è stato trasferito in modalità di accompagnamento esterno, che implica la cessazione dell'accettazione delle modifiche per Bcachefs nel core del kernel, mantenendo questo file system nella base di codice del kernel. Lo sviluppo di Bcachefs avverrà al di fuori della base di codice del kernel fino a quando Kent Overstreet non dimostrerà effettivamente la possibilità di interagire correttamente con altri sviluppatori del kernel e la capacità di seguire le regole di sviluppo consolidate.
- Memoria e servizi di sistema
- È stata rimossa dal pianificatore di attività la supporto per configurazioni a singolo processore. Nei sistemi con un solo processore ora si dovrebbero utilizzare i kernel compilati per sistemi multiprocessore (SMP). Il codice per sistemi a singolo e multiprocessore è stato unificato ed è stato eliminato da elementi superflui legati al parametro di kernel CONFIG_SMP.
- È stato aggiunto il modulo del kernel DAMON_STAT (Data Access Monitoring Results Stat), che consente di monitorare l'accesso alla memoria, utilizzando il sottosistema DAMON (Data Access MONitor). Il modulo fornisce statistiche sull'inattività (memory_idle_ms_percentiles) e sulla larghezza di banda della memoria prevista (estimated_memory_bandwidth).
- Nei sistemi con architettura ARM64 è stata implementata la supporto per i Live patch, che consente di applicare correzioni al kernel Linux al volo, senza riavviare e fermare il sistema.
- Nella libreria C minimalista nolibc, fornita con i sorgenti del kernel Linux e che fornisce un'interfaccia per le chiamate di sistema di base, è stata implementata la supporto per le architetture SuperH, x32, MIPS n32 e MIPS n34.
- È stata ampliata la possibilità di inviare il contenuto dei core dump tramite socket AF_UNIX, consentendo di creare gestori di core dump più sicuri nello spazio utente, non vincolati alla chiamata del kernel di processi privilegiati. Nella nuova versione è stato aggiunto un protocollo per la creazione server, in grado di gestire l'elaborazione dei core dump a livello di singoli task. Ad esempio, per alcuni processi è possibile ignorare i core dump, mentre per altri è possibile trasferirli tramite socket. È stato inoltre preparato un prototipo di server per la gestione dei core dump.
- È stata aggiunta l'opzione della riga di comando del kernel «crashkernel=size,cma» per la riservazione di spazio in memoria attraverso il CMA (Contiguous Memory Allocator) per la conservazione del crash dump del kernel.
- Le capacità del meccanismo pidfd sono state ampliate, consentendo l'uso di identificatori associati a processi specifici, i quali, a differenza dei pid, non possono essere riutilizzati. È stata aggiunta la possibilità di legare a pidfd attributi avanzati dallo spazio utente. È consentita l'apertura dei descrittori di file per pidfd tramite la funzione open_by_handle_at() senza legame con il file system. Le informazioni interne, create dal kernel insieme al pidfd, ora sono legate al processo e non al pidfd, e vengono mantenute tra le ripetute aperture dello stesso processo.
- Nel sottosistema BPF è stata aggiunta la funzione bpf_cgroup_read_xattr() per la lettura degli attributi estesi dei file. È stata fornita la possibilità di utilizzare nelle BPF program le operazioni di stringa comuni, come bpf_strcmp, bpf_strnchr, bpf_strchrnul, bpf_strlen e bpf_strspn, che funzionano in modalità di sola lettura. È stata aggiunta la possibilità di utilizzare gli stream standard stdout e stderr per l'interazione con i componenti nello spazio utente. Per i sistemi basati sull'architettura LoongArch, è stata realizzata la possibilità di modifica dinamica del codice, il meccanismo «BPF trampoline» (che riduce l'overhead durante il passaggio di chiamate tra kernel e programmi BPF) e l'esecuzione di programmi che utilizzano struct_ops per creare gestori di funzioni del kernel tramite BPF.
- Nel sistema di registrazione del tempo è stata implementata la supporto per gli orologi ausiliari (auxiliary), che non sono collegati agli orologi di sistema standard e seguono un loro ritmo (in precedenza tutti gli orologi seguivano lo stesso ritmo e differivano solo per il ritmo di offset).
- È stato aggiunto il supporto iniziale per l'esecuzione proxy (Proxy Execution) per mitigare i problemi di inversione di priorità. L'esecuzione proxy consente a un task in attesa di liberare un blocco di trasferire il proprio contesto di esecuzione a un task che detiene il blocco, per accelerare il rilascio di quel blocco.
- Proseguita la trasposizione 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 per impostazione predefinita e non comporta l'inclusione di Rust tra le dipendenze di compilazione obbligatorie per il kernel). Aggiunte astrazioni per la gestione dei regolatori di tensione e corrente, delle proprietà dei firmware, delle risorse di input/output e della memoria di input/output. Realizzato il macro "warn_on!()". Aggiunto il tipo UserPtr per puntatori nello spazio utenti. Espansa la funzionalità dei moduli workqueue, uaccess, dma, time e list. Aggiunto il modulo 'bits' con le funzioni 'bit' e 'genmask'.
- Rielaborato il codice per il calcolo delle somme di controllo CRC e aggiunti nuovi invocazioni per la generazione di hash SHA-1 e SHA-2. Aggiunte ottimizzazioni specifiche per le architetture hardware. Incrementate le prestazioni della funzione crc32c() su nuove CPU x86_64 che supportano l'estensione VPCLMULQDQ (Vector Carry-Less Multiplication of Quadwords).
- Per i sistemi S390, implementato il supporto per lo scambio nella partizione di swap e la migrazione delle grandi pagine di memoria (transparent huge page).
- Aggiunta la possibilità di configurare l'aggressività del recupero delle pagine di memoria (proactive-reclaim) quando scarseggiano, legato a nodi NUMA specifici, consentendo di identificare nodi NUMA per i quali applicare un recupero della memoria più attivo. Ad esempio, "echo "512M swappiness=10" > /sys/devices/system/node/node1/reclaim".
- Nel meccanismo SCHED_EXT, che consente di utilizzare BPF per creare scheduler CPU, aggiunta la possibilità di gestire la larghezza di banda tramite cgroup. Ad esempio, è possibile utilizzare il parametro cpu.max per limitare il carico sulla CPU.
- Dichiarato obsoleto il montaggio automatico del filesystem virtuale tracefs nella directory /sys/kernel/debug/tracing, da sostituire con /sys/kernel/tracing.
- Virtualizzazione e sicurezza
- Aggiunta la possibilità di attivare la protezione contro le vulnerabilità della CPU tramite la scelta dei vettori di attacco bloccabili. invece di specificare nelle impostazioni specifiche vulnerabilità. I metodi di blocco vengono scelti in base al tipo di violazione dell'isolamento: tra utente e kernel (user-kernel), tra utente e altro utente (user-user), tra sistema ospite e ambiente host (guest-host), tra diversi sistemi ospiti (guest-guest) e tra diversi thread (cross-thread). L'approccio proposto consente di attivare solo la protezione contro quelle classi di vulnerabilità che realmente preoccupano l'utente. Ad esempio, i proprietari di ambienti cloud possono attivare le modalità guest-host e guest-guest, dopodiché verranno attivati i metodi di protezione contro le vulnerabilità BHI, GD, L1TF, MDS, MMIO, Retbleed, RFDS, Spectre_v2, SRBDS, SRSO e TAA.
- È stata aggiunta la supporto alla compilazione con il compilatore Clang con modalità di tracciamento della profondità dello stack, in cui viene eseguita l'inizializzazione di tutte le variabili memorizzate nello stack. L'inizializzazione viene effettuata per prevenire la perdita di informazioni dal kernel attraverso variabili non inizializzate, che possono contenere residui di dati precedentemente salvati nello stack. Fino ad ora una funzionalità simile era supportata quando si utilizzava il plugin GCC STACKLEAK.
- È stata aggiunta la protezione contro la sostituzione da parte di un attaccante del file system /proc tramite il montaggio in modalità 'bind'. Il numero inode della radice di /proc è ora fisso (PROCFS_ROOT_INO) e può essere verificato da un processo nello spazio utente.
- Nella sottosistema RV (Runtime Verification), progettato per verificare la correttezza del funzionamento dei sistemi ad alta affidabilità, è stato aggiunto un componente di monitoraggio rtapp (Real-time application monitor) per tracciare problemi tipici nelle applicazioni che operano in tempo reale, nonché componenti rp, sssw e opid per il collaudo dello scheduler. È stata implementata la possibilità di creare componenti di monitoraggio che utilizzano la logica temporale lineare invece di un automa deterministico per definire il modello di comportamento. Il controllo avviene durante l'esecuzione tramite l'attacco di gestori ai punti di tracciamento, confrontando il corso effettivo dell'esecuzione con un modello di riferimento precedentemente definito che definisce il comportamento atteso del sistema.
- Nel sistema AppArmor è stata aggiunta la supporto per la gestione dell'accesso ai socket AF_UNIX.
- Nel hypervisor KVM sui sistemi ARM è stata implementata la supporto per il controller delle interruzioni GICv5.
- È stata aggiunta l'impostazione CONFIG_KVM_IOAPIC, che consente di disabilitare il supporto per l'emulazione APIC, PIC e PIT in KVM.
- È stata aggiunta la protezione contro la vulnerabilità VMSCAPE.
- È stato aggiunto il comando ioctl FS_IOC_GETLBMD_CAP per ottenere informazioni dall'utente riguardo all'applicazione di strumenti per la protezione dell'integrità su un file.
- È stata dichiarata obsoleta l'interfaccia /sys/fs/selinux/user, che ora comporta un ritardo di cinque secondi e genera un avviso nel log quando viene chiamata.
- Sottosistema di rete
- Nell'implementazione della tecnologia PSE (Power Sourcing Equipment), utilizzata per fornire alimentazione tramite Ethernet a dispositivi come telecamere IP e punti di accesso wireless, è stata aggiunta la supporto per strategie di valutazione del budget energetico personalizzabili (potenza totale disponibile). Queste strategie consentono di determinare quali porte devono essere disabilitate per evitare sovraccarichi.
- Nell'implementazione del protocollo MCTP (Management Component Transport Protocol) è stato aggiunto il supporto per il routing dei pacchetti verso nodi esterni tramite nodi intermedi (gateway-routing). Ad esempio, le regole seguenti consentono di instradare i pacchetti verso il nodo con ID 10 (Endpoint ID 10) tramite il dispositivo mctpi2c0, utilizzando l'indirizzo 0x1d, direttamente collegato al nodo con ID 9. mctp route add 9 via mctpi2c0 mctp neigh add 9 dev mctpi2c0 lladdr 0x1d mctp route add 10 gw 9
- Per i socket UNIX (AF_UNIX) è stata implementata l'opzione SO_INC, mentre per la famiglia di indirizzi VSOCK è stata implementata l'opzione SIOCINQ. Le opzioni implementate sono simili all'opzione TCP_INQ per TCP e consentono di ottenere attraverso un messaggio di controllo informazioni sul numero di byte disponibili nel socket per la lettura.
- Per TCP è stata attivata la rigorosa osservanza della dimensione dichiarata della finestra di ricezione, che determina la dimensione dei dati consentiti per l'invio fino a quando non viene ricevuta una conferma ACK dall'altra parte. In precedenza, il kernel continuava a elaborare i dati che superavano la finestra di ricezione dichiarata, ma ora smetterà di farlo.
- In MPTCP (Multipath TCP) è stata aggiunta la possibilità di utilizzare l'opzione del socket TCP_MAXSEG per limitare la dimensione massima dei segmenti inviati. MPTCP è un'estensione del protocollo TCP per organizzare la consegna dei pacchetti contemporaneamente su più percorsi attraverso diverse interfacce di rete associate a diversi indirizzi IP.
- È stato aggiunto il supporto per l'algoritmo di controllo del sovraccarico TCP DualPI2 (RFC 9332), che consente di utilizzare controllori del sovraccarico scalabili per il traffico con elevate esigenze di qualità del servizio (ad esempio, TCP-Prague e DCTCP), senza ridurre le prestazioni del traffico classico, per il quale vengono utilizzati controllori di sovraccarico come Reno e Cubic.
- È stato aggiunto il sysctl «force_forwarding», tramite il quale è possibile attivare il reindirizzamento del traffico su interfacce di rete selezionate con IPv6.
- È stato rimosso il supporto per l'algoritmo di rilevamento della perdita di pacchetti SACK (Selective Acknowledgment), descritto nella RFC 6675. Questo algoritmo è stato dichiarato obsoleto nel 2018. Si raccomanda di utilizzare l'algoritmo RACK-TLP per rilevare la perdita di pacchetti TCP.
- Apparecchiatura
- È proseguito il lavoro sul driver drm (Direct Rendering Manager) Xe per GPU basate sull'architettura Intel Xe, utilizzate nelle schede grafiche Intel della serie Arc e nella grafica integrata, a partire dai processori Tiger Lake. Nella nuova versione è stato incluso di default il supporto per i chip basati sull'architettura microarchitetturale Panthor Lake ed è stato aggiunto il supporto per l'architettura microarchitetturale WildCat Lake.
- Nel driver AMDGPU per GPU GFX9.x è stato implementato il supporto per il meccanismo Cleaner Shader, che garantisce la pulizia della memoria GPU prima del suo riutilizzo per evitare perdite di dati rimasti a seguito dell'uso da parte di un altro processo. È stato migliorato il supporto per la modalità di attesa. È stata aggiunta la possibilità di passare alla modalità sleep in ambienti con AMD SR-IOV. È stato migliorato il controllo della retroilluminazione.
- Nel driver i915 è stato implementato il supporto per il meccanismo drm_panic, che visualizza durante i crash un'analoga del «blue screen of death». È stato aggiunto il supporto per il controller del display utilizzato nei chip della serie Wildcat Lake.
- È proseguita l'integrazione dei componenti del driver Nova per GPU NVIDIA dotate di firmware GSP, utilizzate a partire dalla serie NVIDIA GeForce RTX 2000 basata sull'architettura Turing. Il driver è scritto in linguaggio Rust. Nella nuova versione è stato aggiunto un livello di astrazione per la gestione del DMA, è stato implementato un parser VBIOS, è stato aggiunto codice per la configurazione del framebuffer ed è stato garantito il supporto per il caricamento accelerato in modalità Falcon.
- Nel driver adreno è stato aggiunto il supporto per GPU Qualcomm Adreno x1-45 e x1-85.
- Nel driver msm è stato aggiunto il supporto per GPU Adreno SM8750 e per la mappatura della memoria video (VM_BIND).
- Nel driver panfrost è stato aggiunto il supporto per GPU Mali, utilizzate negli SoC Mediatek mt8370.
- È stato aggiunto il supporto GPU nel driver lima, utilizzato nel SoC Rockchip RK3528.
- Aggiunto il driver mtd (Memory Technology Devices) per l'accesso alla memoria NVM integrata nella GPU Intel.
- Aggiunto supporto per i sistemi audio ASoC IMX WM8524, AMD ACP7.2, SoundWire ACP 7.1, Fairphone 4 & 5, Qualcomm QCS8275, Framework Laptop 13 (AMD Ryzen AI 300), CS35L41 HDA (usato nei portatili ASUS), Richtek RTQ9124, TI TAS5753, HP EliteBook x360 830 G6, EliteBook 830 G6, LG 16Z90R-A, HP 15-fc000. È stata effettuata una riorganizzazione del codice HD-audio.
- Aggiunto supporto per piattaforme ARM, SoC e dispositivi: NVIDIA Tegra264, Marvell PXA1908 (primo chip a 64 bit di Marvell per smartphone), CIX P1, Axiado AX3000, Sophgo SG2000 (combina core ARM e RISC-V), Mediatek mt6572, exynos2200 (utilizzato nel Samsung Galaxy S22), Renesas R-Car V4M-7, TI am62d2 e Sophgo sg2042, portatili basati su Mediatek mt8186 e Qualcomm Snapdragon X1, smartphone e tablet basati su SoC mt6572, tegra30 e msm8976.
Nel frattempo, la Fondazione del software libero latinoamericano ha creato una versione completamente libera del kernel 6.17 — Linux-libre 6.17-gnu, ripulita da elementi di firmware e driver che contengono componenti o sezioni di codice non liberi, la cui area di applicazione è limitata dal produttore. Nella versione 6.17 è stato aggiornato il codice di pulizia dei blob nei driver amdgpu, prueth, iwlwifi, btusb, pci mhi host, adreno a6xx, nova-core e Intel AVS. È stata eseguita la pulizia dei nomi dei blob nei file dts (devicetree) per chip ARM e Intel IPU7. È stata neutralizzata il caricamento dei blob nei nuovi driver pci hda. È cessata la pulizia dei blob nel driver QLogic infiniband, rimosso dal kernel.
Fonte: opennet.ru
