Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.9. Tra le modifiche più significative: il modulo dm-vdo per la deduplicazione e la compressione dei dispositivi a blocchi, la modalità di accesso diretto ai file in FUSE, il supporto per la creazione di pidfd per thread singoli, il meccanismo dei token BPF, il supporto per Rust sui sistemi ARM64, la classificazione del filesystem Ext2 come obsoleto, la rimozione del vecchio driver NTFS e il supporto per il meccanismo Intel FRED.
Nella nuova versione sono state incluse 15680 correzioni da 2106 sviluppatori, la dimensione del patch è di 54 MB (le modifiche hanno interessato 11825 file, sono state aggiunte 687954 righe di codice e rimosse 225344 righe). Nella versione precedente c'erano 15641 correzioni da 2018 sviluppatori, la dimensione del patch era di 44 MB. Circa il 42% di tutte le modifiche presentate in 6.9 riguarda i driver dei dispositivi, circa il 17% delle modifiche è relativo all'aggiornamento del codice specifico per architetture hardware, il 13% è collegato allo stack di rete, il 7% ai filesystem e il 4% ai sottosistemi interni del kernel.
Novità principali nel kernel 6.9:
- Sottosistema di disco, input/output e file system
- Nel Device Mapper (DM) è stato aggiunto un nuovo gestore dm-vdo (virtual data optimizer), che consente di realizzare un dispositivo a blocchi virtuale basato su dispositivi a blocchi esistenti, dotato di funzionalità quali la deduplicazione dei dati ripetuti, la compressione dei dati, l'esclusione dei blocchi vuoti e l'aumento della capacità del dispositivo a blocchi man mano che si presenta la necessità (thin provisioning). Queste funzionalità sono implementate a livello di dispositivo a blocchi e non dipendono dal filesystem utilizzato (ad esempio, con dm-vdo è possibile attuare un unione automatica dei dati duplicati e la conservazione delle informazioni in forma compressa per qualsiasi filesystem). È supportato l'uso di dm-vdo per archiviazione fisica fino a 256TB e la creazione di volumi logici fino a 4PB. Per gestire le partizioni vdo si raccomanda di utilizzare lvm. La tecnologia VDO è stata sviluppata da Permabit ed è stata resa open source dopo la sua acquisizione da parte di Red Hat nel 2017.
- Nel sottosistema FUSE, utilizzato per implementare file system nello spazio utente, è stata aggiunta un'implementazione iniziale della modalità «passthrough», che consente di ricevere direttamente i dati dei file a livello di kernel, bypassando il processo che lavora nello spazio utente, il che può notevolmente migliorare le prestazioni in alcune situazioni. Ad esempio, le implementazioni FUSE di file system che operano in modalità di sola lettura e limitano l'accesso ai file possono restituire il contenuto dei file dall'originario file system senza passarli al processo FUSE.
- Il driver con implementazione del file system Ext2 è stato contrassegnato come obsoleto (deprecated). Il motivo indicato è che il driver supporta solo contatori di tempo a 32 bit negli inode, i quali si satureranno il 19 gennaio 2038. Si consiglia di utilizzare il driver ext4, che supporta il file system Ext2 ed è completamente compatibile con esso, ma può utilizzare timestamp nei partizioni ext2 che non sono soggetti al problema del 2038, se il file system è stato creato con inode di dimensioni superiori a 255 byte (nel driver ext2, i contatori di tempo a 32 bit erano utilizzati indipendentemente dalla dimensione dell'inode).
- Il vecchio driver del file system NTFS è stato rimosso, sostituito dal nuovo driver NTFS3 a partire dalla versione 5.15. La fornitura di due driver con implementazione NTFS nel kernel è stata ritenuta non opportuna, considerando che il vecchio driver non è stato aggiornato per molti anni, si trova in condizioni pessime e può operare solo in modalità di lettura.
- Nei file system zonefs e hugetlbfs è stata aggiunta la supporto per il mapping degli identificatori utenti di file system montati, utilizzato per associare file di un certo utente su una partizione montata di un'altra utente nel sistema corrente.
- Per i file system NFSv4 è stata data agli amministratori la possibilità di ripulire gli stati di apertura e di blocco dei file.
- Per il file system Ext4 sono state apportate solo correzioni di bug e aggiornamenti ai test kunit.
- In Btrfs è continuata la migrazione delle funzioni all'uso dei folios di pagina della memoria.
- Nel file system XFS è proseguito il lavoro sull'implementazione della possibilità di utilizzare l'utilità fsck per verificare e correggere i problemi rilevati in modalità online, senza smontare il file system.
- Nella chiamata di sistema pwritev2() è stato aggiunto il flag RWF_NOAPPEND, che consente di specificare un offset per la scrittura, anche se il file è stato aperto in modalità solo append.
- Sono stati aggiunti nuovi comandi ioctl: FS_IOC_GETUUID — restituisce l'identificativo UUID del file system specificato, e FS_IOC_GETFSSYSFSPATH — determina il percorso in /sys/fs del file system montato specificato.
- I file system efs, qnx4 e coda sono stati convertiti per utilizzare la nuova API di montaggio delle partizioni.
- È stata migliorata l'implementazione delle operazioni sui file eseguite in modalità senza distinzione tra maiuscole e minuscole. Le performance sono state ottimizzate eseguendo prima il confronto con distinzione tra maiuscole e minuscole e poi tornando alla ricerca senza distinzione. Sono stati risolti problemi durante il montaggio di overlayfs su directory configurate per l'assenza di distinzione tra maiuscole e minuscole.
- Memoria e servizi di sistema
- È stato implementato il supporto per il meccanismo Intel FRED (Flexible Return and Event Delivery), progettato per migliorare l'efficienza e l'affidabilità nella consegna delle informazioni sugli eventi a basso livello, rispetto al meccanismo attualmente utilizzato IDT (Interrupt Descriptor Table). L'aumento delle performance e la riduzione dei ritardi sono garantiti dal ritorno degli eventi tramite l'istruzione del processore IRET invece di passare gli eventi tramite la tabella IDT. L'affidabilità è migliorata grazie al trattamento separato dell'arrivo di eventi nel contesto del kernel e nel contesto utente, con protezione contro l'esecuzione annidata di NMI e il salvataggio nel frame esteso dello stack di tutti i registri CPU associati all'eccezione.
- È stata aggiunta la possibilità di ottimizzare l'accesso ai dati dei singoli core CPU tramite l'utilizzo nel codice del kernel di spazi di indirizzi nominati (Named Address Spaces), implementati in GCC sotto forma di estensione GNU C.
- Alla funzione pidfd_open() è stato aggiunto il flag PIDFD_THREAD, che consente di creare pidfd per singoli thread, e non solo di utilizzare pidfd nel contesto del leader del gruppo di thread. È stata anche proposta un'implementazione di pseudo-FS per l'accesso a pidfd tramite un file system virtuale. A differenza dell'identificazione dei processi tramite pid, l'identificatore pidfd è associato a un processo specifico e non cambia, mentre il PID dopo il completamento del processo attuale può essere associato a un altro processo.
- Nel sottosistema BPF è stato aggiunto un meccanismo di token BPF che consente di delegare in modo selettivo ai programmi i diritti di accesso a operazioni privilegiate di BPF; ad esempio, è possibile fornire a un'applicazione non privilegiata l'accesso a singoli sottosistemi BPF senza concedere diritti completi CAP_BPF.
- È stato aggiunto un nuovo tipo di memoria condivisa bpf_arena nel sottosistema BPF, che definisce un'area accessibile per la condivisione tra programmi BPF e processi nello spazio utente. È stata aggiunta l'istruzione may_goto, che consente di organizzare il funzionamento dei cicli, che possono essere interrotti dal verificatore. È stata introdotta la possibilità di generare cookie TCP SYN arbitrari da programmi BPF e di creare gestori BPF per combattere gli attacchi SYN flood.
- Continua il trasferimento delle modifiche dal ramo Rust-for-Linux, riguardanti l'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 del kernel). È stato aggiunto il supporto per l'utilizzo del linguaggio Rust su processori ARM a 64 bit. È stato effettuato il passaggio all'utilizzo della release Rust 1.76. È stato aggiunto il macro ‘container_of!’. Invece della funzionalità instabile ‘ptr_metadata’ è stato utilizzato il metodo stabile ‘byte_sub’. È stato aggiunto il modulo ‘time’ con la funzione di conversione del tempo ‘msecs_to_jiffies()’.
- Nel sottosistema io_uring è stata aggiunta la possibilità di troncamento dei file (ftruncate_file).
- È stata aggiunta una nuova tipologia di code di lavoro WQ_BH (workqueue Bottom Halves) per l'esecuzione asincrona del codice nel contesto delle interruzioni software, destinata ad essere utilizzata al posto dei tasklet obsoleti.
- Il sottosistema di gestione dei timer è stato notevolmente rielaborato, migliorando la logica di selezione del core CPU attivo per l'esecuzione del timer scattato, in modo da non risvegliare core inattivi.
- È stata implementata la possibilità di aggiornare il modello di consumo energetico del core (EM, Energy Model) durante l'operatività, che può essere utilizzato, ad esempio, per tenere conto dell'impatto della temperatura di lavoro sull'efficienza energetica della CPU. La performance della funzione em_cpu_energy() è stata significativamente migliorata, eseguendo ora più velocemente di 1,43 volte nei test su un sistema stazionario e di 1,69 volte nel test su scheda RockPi 4B.
- È stato aggiunto il supporto per eseguire sistemi basati su architettura ARM64 in modalità LPA2 con uno spazio di indirizzi virtuali a 52 bit.
- Per i sistemi ARM64 è stata implementata la registrazione continua delle PTE (Page Table Entry), che consente di migliorare le prestazioni aumentando l'efficienza nell'utilizzo della TLB (Translation Lookaside Buffer).
- Sono stati approvati patch per migliorare le prestazioni del sottosistema di gestione della memoria riducendo l'insorgenza di concorrenza nei blocchi in vmalloc().
- Per l'architettura LoongArch è stato realizzato un meccanismo di hot patching del kernel, che consente di applicare correzioni al kernel senza riavviarlo.
- Per i sistemi RISC-V è stato implementato il supporto per la syscall membarrier(), che stabilisce barriere di memoria per i thread in esecuzione nel sistema.
- Sono stati elevati i requisiti per la versione di LLVM/Clang da utilizzare per la compilazione del kernel. Ora è necessaria almeno la versione 13.0.1 di LLVM (precedentemente era supportata la compilazione con LLVM 11+).
- Nel meccanismo "User trace events", che consente di creare eventi di tracciamento dai processi utente per monitorare l'attività nello spazio utente, è stato aggiunto il supporto per l'esportazione delle informazioni sugli eventi in vari formati (USER_EVENT_REG_MULTI_FORMAT).
- Nel meccanismo di tracciamento delle chiamate di funzione è stata aggiunta la possibilità di monitorare lo stato degli argomenti in ingresso alla funzione durante il tracciamento dell'uscita. I valori dell'operatore di ritorno ora possono essere associati agli argomenti utilizzati nella chiamata della funzione.
- Nell'utilità perf è stato aggiunto il supporto per la modalità di aggregazione dell'output "cluster" ("perf stat -a --per-cluster") per unire le statistiche delle risorse condivise. È stata implementata la possibilità di utilizzare la libreria libcapstone per la disassemblazione delle istruzioni del processore ("perf script -F disasm"). Sono state effettuate ottimizzazioni nel consumo di memoria durante l'esecuzione dei comandi perf report e perf annotate.
- Virtualizzazione e sicurezza
- È stata aggiunta la protezione contro la vulnerabilità RFDS (Register File Data Sampling) nei processori Intel Atom, che consente di estrarre informazioni residue dai file di registro (RF, Register File) del processore, utilizzati per memorizzare congiuntamente il contenuto dei registri in tutti i compiti sulla stessa core CPU. Per bloccare la vulnerabilità è necessario un aggiornamento del microcodice e utilizzare l'istruzione VERW per cancellare il contenuto dei buffer microarchitetturali al momento del ritorno dallo spazio kernel allo spazio utente. Per attivare la protezione al caricamento del kernel è possibile specificare il flag "reg_file_data_sampling=on". Le informazioni sulla vulnerabilità e sulla presenza del microcodice necessario per la protezione possono essere valutate nel file "/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling".
- È stato aggiunto il supporto di base per la protezione dei sistemi guest tramite l'estensione AMD SEV-SNP (Secure Nested Paging), che garantisce un funzionamento sicuro con le tabelle di pagina di memoria annidate e protegge dagli attacchi "undeSErVed" e "SEVerity" sui processori AMD EPYC, consentendo di superare il meccanismo di protezione AMD SEV (Secure Encrypted Virtualization). KVM Le modifiche necessarie per l'utilizzo di SNP sono pianificate per essere aggiunte nella versione 6.10.
- I moduli con implementazione delle tecnologie IMA (Integrity Measurement Architecture) ed EVM (Extended Verification Module) sono stati convertiti per utilizzare il framework LSM (Linux Security Modules), il che ha notevolmente semplificato il codice senza perdita di funzionalità, unendo la funzionalità duplicata e sfruttando le capacità tipiche disponibili tramite LSM. Il modulo IMA è progettato per controllare l'integrità dei componenti del sistema operativo attraverso firme digitali e hash. Il modulo EVM consente di proteggere gli attributi estesi dei file (xattrs) dagli attacchi mirati a compromettere la loro integrità (EVM non permetterà di effettuare un attacco offline, in cui un malintenzionato può modificare i metadati, ad esempio avviando da un proprio disco).
- Le chiamate di sistema lsm_list_modules(), lsm_get_self_attr() e lsm_set_self_attr() sono state riprogettate per una maggiore compatibilità con ambienti a 32 bit, destinate a elencare i moduli LSM (Linux Security Modules) caricati e ottenere/impostare gli attributi del modulo LSM. La modifica rompe la compatibilità retroattiva, ma dato che le nuove chiamate di sistema sono state aggiunte nella versione precedente del kernel e al momento non sono utilizzate nelle applicazioni, Linus Torvalds ha ritenuto che la modifica sia accettabile.
- È stato intrapreso un tentativo di ripristinare l'uso del meccanismo UBSAN (Undefined Behavior Sanitizer). Il problema fondamentale è che i compilatori gestiscono diversamente i sovraccarichi aritmetici nei tipi interi firmati e non firmati. I sovraccarichi firmati e i sovraccarichi di puntatori rientrano nella categoria del comportamento indefinito, mentre i sovraccarichi non firmati vengono troncati modulo 2n conservando solo i bit meno significativi del risultato («wrap-around») e non rientrano nel comportamento indefinito. Per escludere situazioni che causano comportamento indefinito, il kernel viene compilato con l'opzione «-fno-strict-overflow», che porta ad utilizzare il «wrap-around» per tutti i sovraccarichi aritmetici. GCC e Clang non possono diagnosticare correttamente alcuni problemi quando viene utilizzato il flag «-fno-strict-overflow», e l'inclusione di UBSAN mira a condurre un lavoro collaborativo con gli sviluppatori di compilatori per eliminare i falsi allarmi e rilevare sovraccarichi aritmetici in luoghi in cui mancano controlli espliciti.
Per verificare i possibili sovraccarichi nel kernel vengono utilizzate costrutti del tipo «var + offset PAGE_SHIFT) < pgoff){..}»), che sono legati alla compilazione con il flag «-fno-strict-overflow» e non coprono tutto il codice in cui potrebbero potenzialmente verificarsi sovraccarichi. Il problema è che, utilizzando UBSAN, tali verifiche portavano alla generazione di un numero elevato di falsi avvisi, e per questo motivo nel 2021 UBSAN è stato disabilitato. Nella nuova implementazione è stato proposto di utilizzare annotazioni speciali __signed_wrap e __unsigned_wrap, oltre a macro pronte con controlli add_would_overflow(a, b) e add_wrap(a, b), che permettono di distinguere l'uso previsto degli sviluppatori delle sovraccariche aritmetiche dalla comparsa di sovraccarichi casuali che potrebbero portare a vulnerabilità. La proposta di una riscrittura più ampia del kernel con l'inserimento di ulteriori definizioni di tipi è stata rifiutata da Linus Torvalds.
- Sottosistema di rete
- Nella sottosistema di rete sono stati fatti progressi per ridurre l'insorgere di contese di blocchi («lock contention», tentativo di acquisire un blocco detenuto da un altro thread). È stato ridotto l'uso dei blocchi RTNL.
- È stata aggiunta la possibilità di attivare il supporto per il busy polling nei contesti delle singole chiamate epoll. La dimensione del pool e i parametri di budget possono essere impostati separatamente dai parametri di sistema predefiniti.
- È stata realizzata la struttura net_hotdata per migliorare l'efficienza della memorizzazione nella cache delle variabili di configurazione di rete più utilizzate.
- In MPTCP è stato aggiunto il supporto per impostare l'opzione TCP_NOTSENT_LOWAT sui socket, consentendo di limitare la dimensione del buffer di invio. Nell'API per i socket MCTP è stato aggiunto il supporto per gli identificatori di rete, permettendo di utilizzare più reti MCTP non sovrapposte su un singolo host.
- In IPSec è stato aggiunto il supporto per il reindirizzamento dei messaggi ICMP con informazioni sugli errori (RFC 4301).
- Il processo di scansione dei percorsi con tempo di vita scaduto è stato accelerato.
- Le prestazioni di XDP sono state accelerate, grazie a una maggiore attenzione nell'evitare l'allocazione di grandi blocchi di memoria.
- È stata aggiunta la possibilità di allegare metadati ai messaggi netconsole.
- In Netfilter è consentita la definizione delle tabelle dallo spazio utente, che si collegano a un processo in background di gestione e non vengono eliminate automaticamente al termine dell'applicazione utente.
- In nftables è stata accelerata l'aggiunta di elementi nei set con intervalli uniti.
- Apparecchiatura
- Nel driver i915 è proseguito il lavoro per l'implementazione del supporto per i chip Intel LunarLake (Xe 2). Sono stati aggiunti nuovi identificatori PCI per dispositivi basati su chip Intel Arrow Lake e Alder Lake N. Per DisplayPort è stato aggiunto il supporto per il tunneling DP e l'allocazione di larghezza di banda. Per tutte le piattaforme è stata attivata la modalità fastboot. È stato aggiunto il supporto per l'output di debug associato a dispositivi specifici.
- Nel driver AMDGPU è stata effettuata la preparazione per l'implementazione del supporto per la GPU AMD RDNA3.5 e RDNA4. È stato aggiunto il supporto per ATHUB 4.1, LSDMA 7.0, JPEG DPG, IH 7.0, HDP 7.0, VCN 5.0, SMU 13.0.6, NBIO 7.11, SDMA 6.1, MMHUB 3.3, DCN 3.5.1, NBIF 6.3.1, VPE 6.1.1 e il framework RAS ACA. Nel modulo del kernel è stato aggiunto il parametro freesync_video per attivare il supporto sperimentale all'ottimizzazione del cambio delle modalità video utilizzando la tecnologia di sincronizzazione adattiva FreeSync.
- Nel driver Nouveau, il codice di gestione dello schermo è stato aggiornato per utilizzare la funzione kmemdup().
- Continua 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.
- Aggiunto il driver DRM per i chip Mediatek MT8188 VDOSYS1.
- Le impostazioni del kernel relative ai sottosistemi video sono state spostate nella sezione CONFIG_VIDEO.
- Aggiunto il supporto per ARM64 SoC: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
- Aggiunto il supporto per schede e dispositivi ARM: telefoni Android basati sul chip Tegra30, modelli Chromebook basati su Mediatek MT8186, NAS, tablet e console da gioco basati su Rockchips RK35xx, schede White Hawk basate su SoC Renesas, schede basate su Qualcomm SM8550 (Snapdragon 8 Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
- Eseguito il refactoring del codice del sottosistema audio ALSA. Aggiunto il supporto per i sistemi audio Microchip SAM9x7, NXP i.MX95 e Qualcomm WCD939x. Nel driver SoundWire è stato aggiunto il supporto ASoC per i co-processori audio AMD ACP 6.3, mentre per i sistemi Intel è stata implementata la modalità DSPless. Aggiunto il supporto per codec audio aggiuntivi Cirrus HD. Nel driver virtio è stato migliorato il controllo dei dispositivi audio.
- Aggiunto il supporto per i controllori Ethernet Marvell Octeon PCI Endpoint NIC VF e Intel E825-C 100G.
Contemporaneamente, il Fondo latinoamericano per il software libero ha formato una versione completamente libera del kernel 6.9 — Linux-libre 6.9-gnu, ripulita da elementi di firmware e driver contenenti componenti non liberi o porzioni di codice limitate dal produttore. Nella versione 6.9 è stato aggiornato il codice per la pulizia dei blob nei driver amdgpu, ath12k, adreno, btusb e r8169. Effettuata la pulizia del nuovo driver ptp_fc3. Puliti i nomi dei blob nei file dts (devicetree) per l'architettura Aarch64. Risolti problemi di pulizia del driver i915 che causavano il blocco durante l'inizializzazione. Apportate modifiche relative alla gestione dei blob forniti come dump esadecimali.
Fonte: opennet.ru
