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, le chiamate di sistema file_getattr() e file_setattr(), unificazione delle configurazioni a singolo e multiplo processore nel task scheduler, modulo DAMON_STAT con statistiche di accesso alla memoria, supporto per i Live patch sui sistemi ARM64, invio di core dump tramite socket AF_UNIX, limitazione di SCHED_EXT tramite cgroup, semplificazione della configurazione per la protezione contro le vulnerabilità della CPU, build in Clang con inizializzazione delle variabili nello stack, protezione contro la sostituzione di /proc, estensione del sottosistema RV (Runtime Verification), limitazione dei socket AF_UNIX tramite AppArmor, algoritmo di controllo dei sovraccarichi TCP DualPI2.
Nella nuova versione sono stati apportati 14334 correttivi da 2118 sviluppatori, la dimensione della patch è di 46 MB (sono stati modificati 12841 file, aggiunte 646654 righe di codice e rimosse 398782 righe). Nella precedente versione ci sono stati 15924 correttivi da 2145 sviluppatori, la dimensione della patch era di 50 MB. Circa il 43% di tutte le modifiche presenti in 6.17 è relativo ai driver dei dispositivi, circa il 12% riguarda l'aggiornamento del codice specifico per le architetture hardware, il 14% è collegato 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 disco, I/O e file system
- In Btrfs, experimental support for large memory page folios has been added, allowing for reduced overhead and improved performance of several operations. Request caching for bitmaps of free space distribution has been implemented, resulting in a 20% increase in the performance of creating empty files. The pre-reading functionality in systems using data compression has been enhanced. A denser placement of keys in the XArray structure has ensured more compact storage of extent tree nodes and has reduced the number of leaf nodes by 50-70%. Additional settings for compression usage in defragmented extents have been provided.
- The ext4 filesystem now supports buffered I/O with the RWF_DONTCACHE flag, which removes data from the page cache immediately after the operation completes.
- The EROFS filesystem has implemented support for metadata compression.
- The NFS server can now delegate write operations to clients that open files in write-only mode.
- 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 alcune unità SSD, che esegue lo azzeramento senza operazioni di input/output. Questa 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 lavorare con i supporti ottici in modalità pacchetto, che era stato contrassegnato come obsoleto nel 2016.
- Il file system Bcachefs nel kernel Linux è stato trasferito a una modalità di supporto esterno, che implica la sospensione dell'accettazione delle modifiche per Bcachefs nella composizione principale del kernel, mantenendo questo file system nel codice sorgente del kernel. Lo sviluppo di Bcachefs avverrà al di fuori del codice sorgente del kernel fino a quando Kent Overstreet non dimostrerà effettivamente la possibilità di un'interazione corretta con altri sviluppatori del kernel e la capacità di seguire le regole di sviluppo consolidate.
- Memoria e servizi di sistema
- È stata rimossa la supporto per le configurazioni a singolo processore dal pianificatore dei compiti. Nei sistemi con un solo processore, ora è necessario utilizzare i kernel compilati per sistemi multiprocessore (SMP). Il codice per sistemi a singolo e multiprocessore è stato unificato ed è stato liberato da legami superflui con il parametro di kernel CONFIG_SMP.
- È stato aggiunto il modulo kernel DAMON_STAT (Statistica dei risultati di monitoraggio dell'accesso ai dati), 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 stimata (estimated_memory_bandwidth).
- Nei sistemi con architettura ARM64 è stata implementata la supporto per i Live patch, che consentono di applicare correzioni al kernel Linux in tempo reale, senza riavviare o fermare il sistema.
- Nella biblioteca C minimalista nolibc, fornita con il codice sorgente 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 contenuti core dump attraverso il socket AF_UNIX, consentendo la creazione di gestori core dump più sicuri nell'utente space, senza dipendere dalla chiamata del kernel di processi privilegiati. Nella nuova versione è stato aggiunto un protocollo per la creazione server, capace di gestire l'elaborazione dei core dump a livello di singole attività. Ad esempio, per alcuni processi è possibile ignorare i core dump, mentre per altri trasferirli tramite socket. È stato preparato un prototipo di server per la gestione dei core dump.
- Aggiunta l'opzione della riga di comando del kernel "crashkernel=size,cma" per riservare tramite CMA (Contiguous Memory Allocator) spazio in memoria per la conservazione del crash dump del kernel.
- Le funzionalità del meccanismo pidfd sono state ampliate, consentendo di utilizzare identificatori associati a processi specifici, i quali non possono essere ri-assegnati, a differenza dei pid. È stata aggiunta la possibilità di associare attributi estesi al pidfd dallo spazio utente. È consentito aprire file descriptor per pidfd tramite la funzione open_by_handle_at() senza vincoli sul file system. Le informazioni interne create dal kernel insieme al pidfd sono ora collegate al processo, anziché al pidfd, e vengono mantenute tra le aperture successive 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 programmi BPF operazioni stringa standard, come bpf_strcmp, bpf_strnchr, bpf_strchrnul, bpf_strlen e bpf_strspn, operanti in modalità di sola lettura. È stata implementata la possibilità di utilizzare i flussi standard stdout e stderr per interagire con i componenti nello spazio utente. Per i sistemi basati sull'architettura LoongArch, è stata realizzata la possibilità di modifica dinamica del codice nel BPF, il meccanismo "BPF trampoline" (riduce i costi di trasferimento delle chiamate tra il kernel e i programmi BPF) e l'esecuzione di programmi che utilizzano struct_ops per creare gestori di funzioni del kernel tramite BPF.
- Nel sistema di gestione del tempo è stata implementata la supporto per orologi ausiliari (auxiliary), che non sono collegati ai normali orologi di sistema e seguono un proprio ritmo (in precedenza, tutti gli orologi si muovevano con lo stesso ritmo e differivano solo per il fuso orario).
- È stata aggiunta la supporto iniziale per l'esecuzione proxy (Proxy Execution) al fine di attenuare i problemi di inversione delle priorità. L'esecuzione proxy consente al compito in attesa di sblocco di trasmettere il proprio contesto di esecuzione al compito che attualmente detiene il blocco, accelerando così il rilascio di quest'ultimo.
- Continuano i trasferimenti 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 implica che Rust diventi una dipendenza di compilazione obbligatoria per il kernel). Sono state aggiunte astrazioni per la gestione dei regolatori di tensione e corrente, delle proprietà del firmware, delle risorse di input/output e della memoria di input/output. È stato implementato il macro "warn_on!()". È stato aggiunto il tipo UserPtr per i puntatori nello spazio utente. Sono state ampliate le funzionalità dei moduli workqueue, uaccess, dma, time e list. È stato aggiunto il modulo 'bits' con le funzioni 'bit' e 'genmask'.
- Il codice per il calcolo delle somme di controllo CRC è stato rielaborato e sono stati aggiunti nuovi invocazioni per la generazione degli hash SHA-1 e SHA-2. Ottimizzazioni specifiche per architetture hardware sono state implementate. Le prestazioni della funzione crc32c() sono state migliorate su nuove CPU x86_64 che supportano l'estensione VPCLMULQDQ (Moltiplicazione senza riporto vettoriale di quadword).
- Per i sistemi S390 è stata implementata la supporto per il paging trasparente e la migrazione di pagine di memoria grandi (transparent huge page).
- È stata aggiunta la possibilità di configurare l'aggressività del rilascio delle pagine di memoria (proactive-reclaim) in caso di scarsità legata a singoli nodi NUMA, consentendo di designare nodi NUMA per i quali verrà applicato un rilascio di memoria più attivo. Ad esempio, «echo «512M swappiness=10″ > /sys/devices/system/node/node1/reclaim».
- Nel meccanismo SCHED_EXT, che consente l'uso di BPF per la creazione di pianificatori CPU, è stata aggiunta la possibilità di gestire la larghezza di banda tramite cgroup. Ad esempio, si può utilizzare il parametro cpu.max per limitare il carico sulla CPU.
- È stata dichiarata obsoleta la montatura automatica del file system virtuale tracefs nella directory /sys/kernel/debug/tracing, e si consiglia di utilizzare /sys/kernel/tracing.
- Virtualizzazione e sicurezza
- È stata aggiunta la possibilità di attivare protezione dalle vulnerabilità della CPU tramite la selezione dei vettori d'attacco da bloccare anziché specificare nel configuratore vulnerabilità concrete. I metodi di blocco sono scelti a seconda del 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 suggerito consente di attivare solo la protezione da quelle classi di vulnerabilità che interessano realmente 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 per la costruzione con il compilatore Clang attivando la modalità di tracciamento della profondità dello stack, che inizializza tutte le variabili memorizzate nello stack. L'inizializzazione viene eseguita per prevenire la perdita di informazioni dal kernel attraverso variabili non inizializzate che potrebbero contenere residui di dati precedentemente salvati nello stack. Prima di ciò, una possibilità simile era supportata mediante l'utilizzo del plugin GCC STACKLEAK.
- È stata aggiunta una protezione contro attacchi di sostituzione 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.
- Nel sottosistema RV (Runtime Verification), destinato a verificare la correttezza delle operazioni dei sistemi ad alta affidabilità, è stato aggiunto un componente di monitoraggio rtapp (Real-time application monitor) per monitorare i problemi comuni nelle applicazioni che operano in tempo reale, insieme a componenti rp, sssw e opid per il testing dello scheduler. È stata implementata la possibilità di creare componenti di monitoraggio che utilizzano una logica temporale lineare invece di un automa deterministico per definire il modello comportamentale. Il controllo avviene durante l'esecuzione tramite l'attacco di gestori a punti di tracciamento, che confrontano il percorso effettivo di esecuzione con un modello di riferimento predefinito, che definisce il comportamento atteso del sistema.
- Nel sistema AppArmor è stata aggiunta la supporto per la gestione degli accessi ai socket AF_UNIX.
- Nel hypervisor KVM sui sistemi ARM è stata implementata la supporto per il controller delle interrupzioni GICv5.
- È stata aggiunta la configurazione CONFIG_KVM_IOAPIC, che consente di disabilitare il supporto dell'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 sull'uso dei mezzi di protezione dell'integrità di un file dallo spazio utente.
- L'interfaccia /sys/fs/selinux/user è stata dichiarata obsoleta; ora, quando viene acceduta, viene introdotto un ritardo di cinque secondi e un avviso viene registrato nel log.
- 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 personalizzabili di valutazione del budget energetico (potenza totale disponibile). Queste strategie consentono di determinare quali porte devono essere disattivate per prime per prevenire sovraccarichi.
- Nell'implementazione del protocollo MCTP (Management Component Transport Protocol) è stata aggiunta la supporto per il routing dei pacchetti a nodi esterni attraverso nodi intermedi (gateway-routing). Ad esempio, le seguenti regole consentono di indirizzare i pacchetti al nodo con identificativo 10 (Endpoint ID 10) attraverso il dispositivo mctpi2c0, utilizzando l'indirizzo 0x1d, direttamente collegato al nodo con identificativo 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 è disponibile l'opzione SIOCINQ. Le opzioni implementate sono analoghe all'opzione TCP_INQ per TCP e consentono, tramite un messaggio di controllo, di ottenere informazioni sulla quantità di byte disponibili nel socket per la lettura.
- Per TCP è stata introdotta una rigorosa conformità alle dimensioni dichiarate della finestra di ricezione, che definisce la quantità di dati consentita per l'invio fino al ricevimento dell'ACK di conferma dall'altra parte. In precedenza, il kernel continuava a elaborare i dati che arrivavano oltre 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 che consente la consegna dei pacchetti simultaneamente su più percorsi attraverso diversi interfacce di rete, collegate a indirizzi IP differenti.
- È stato aggiunto il supporto per l'algoritmo di controllo del congestionamento TCP DualPI2 (RFC 9332), che consente di utilizzare controllori di congestione scalabili per traffico con elevate esigenze di qualità del servizio (come TCP-Prague e DCTCP), senza compromettere le prestazioni del traffico tradizionale, per cui vengono utilizzati controllori di congestione come Reno e Cubic.
- È stato aggiunto il sysctl «force_forwarding», tramite il quale è possibile attivare l'inoltro 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. Per rilevare la perdita di pacchetti TCP, si raccomanda di utilizzare l'algoritmo RACK-TLP.
- Attrezzature
- È 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. Nella nuova versione è stata inclusa per impostazione predefinita la compatibilità con i chip basati sull'architettura Panthor Lake ed è stato aggiunto il supporto per l'architettura WildCat Lake.
- Nella driver AMDGPU per GPU GFX9.x è stata implementata la supporto per il meccanismo Cleaner Shader, che garantisce la pulizia della memoria GPU prima del suo riutilizzo, prevenendo così la perdita di dati residui da altri processi. È stata migliorata la gestione della modalità di attesa. Aggiunta la possibilità di entrare in modalità sleep in ambienti con AMD SR-IOV. Migliorata la gestione dell'illuminazione.
- Nella driver i915 è stata implementata la supporto per il meccanismo drm_panic, che visualizza un'analoga al 'blue screen of death' in caso di crash. È stata aggiunta la supporto per il controller del display utilizzato nei chip della famiglia Wildcat Lake.
- Continua 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 Rust. Nella nuova versione è stato aggiunto un livello di astrazione per il lavoro con DMA, implementato un parser VBIOS, aggiunto codice per la configurazione del framebuffer e garantita la supporto per il caricamento accelerato in modalità Falcon.
- Nella driver adreno è stata aggiunta la supporto per GPU Qualcomm Adreno x1-45 e x1-85.
- Nella driver msm è stata aggiunta la supporto per GPU Adreno SM8750 e il mapping della memoria video (VM_BIND).
- Nel driver panfrost è stata aggiunta la supporto per la GPU Mali, utilizzata nel SoC Mediatek mt8370.
- Nel driver lima è stata aggiunta la supporto per la GPU, utilizzata nel SoC Rockchip RK3528.
- È stato aggiunto il driver mtd (Memory Technology Devices) per accedere alla memoria NVM integrata nella GPU Intel.
- È stata aggiunta la 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 (utilizzato nei laptop 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.
- È stata aggiunta la 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 (combinando i nuclei ARM e RISC-V), Mediatek mt6572, exynos2200 (utilizzato nel Samsung Galaxy S22), Renesas R-Car V4M-7, TI am62d2 e Sophgo sg2042, laptop basati su Mediatek mt8186 e Qualcomm Snapdragon X1, smartphone e tablet basati su SoC mt6572, tegra30 e msm8976.
Allo stesso tempo, il Fondo Latinoamericano per il Software Libero ha formato una variante completamente libera del kernel 6.17 — Linux-libre 6.17-gnu, purificato da elementi di firmware e driver contenenti componenti non liberi o sezioni di codice il cui utilizzo è limitato dal produttore. Nella versione 6.17 è stato aggiornato il codice di purificazione dei blob nei driver amdgpu, prueth, iwlwifi, btusb, pci mhi host, adreno a6xx, nova-core e Intel AVS. È stata effettuata la pulizia dei nomi dei blob nei file dts (devicetree) per chip ARM e Intel IPU7. È stata neutralizzata la caricamento dei blob nei nuovi driver pci hda. È stata interrotta la pulizia dei blob nel driver QLogic infiniband, rimosso dal kernel.
Fonte: opennet.ru
