Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.12. Tra le modifiche più rilevanti: supporto per dispositivi a blocchi zonati in Btrfs, possibilità di mappare gli identificatori utente per il file system, pulizia delle architetture ARM obsolete, modalità di scrittura "ansiosa" in NFS, meccanismo LOOKUP_CACHED per determinare i percorsi dei file dalla cache, supporto per istruzioni atomiche in BPF, sistema di debug KFENCE per rilevare errori nella gestione della memoria, funzionamento in un thread separato della modalità di polling NAPI nello stack di rete, hypervisor ACRN, possibilità di modificare al volo il modello di preemption nel pianificatore di task e supporto per ottimizzazioni LTO durante la compilazione in Clang.
Nella nuova versione sono stati inclusi 14170 aggiornamenti (nel rilascio precedente 15480) provenienti da 1946 sviluppatori (1991), con una dimensione del patch di 38 MB (le modifiche hanno interessato 12102 file, sono state aggiunte 538599 righe di codice e sono state rimosse 333377 righe). Circa il 43% di tutte le modifiche presentate in 5.12 riguarda i driver dei dispositivi, circa il 17% delle modifiche si riferisce all'aggiornamento del codice specifico per le architetture hardware, il 12% riguarda lo stack di rete, il 5% i filesystem e il 4% i sottosistemi interni del kernel.
Novità principali:
- Sottosistema disco, I/O e file system
- È stata implementata la possibilità di mappare gli identificatori degli utenti per i file system montati (è possibile associare i file di un utente su una partizione montata di un altro utente nel sistema attuale). Il mappaggio è supportato per i file system FAT, ext4 e XFS. Questa funzionalità proposta semplifica la condivisione di file tra diversi utenti e su diversi computer; in particolare, il mappaggio sarà utilizzato nel meccanismo delle home directory portatili systemd-homed, consentendo agli utenti di spostare le loro home directory su supporti esterni e utilizzarle su computer diversi, i cui identificatori degli utenti non corrispondono. Un'altra applicazione utile è l'organizzazione dell'accesso condiviso a file da un host esterno, senza modificare effettivamente le informazioni sui proprietari dei file nel file system.
- Nel kernel sono stati adottati i patch LOOKUP_CACHED, che consentono di eseguire operazioni di determinazione del percorso dei file dallo spazio utente senza blocco, basandosi solo sui dati presenti nella cache. La modalità LOOKUP_CACHED si attiva nella chiamata openat2() tramite la trasmissione del flag RESOLVE_CACHED, che restituisce i dati esclusivamente dalla cache, e se la determinazione del percorso richiede l'accesso al dispositivo di memorizzazione, restituisce l'errore EAGAIN.
- Nel file system Btrfs è stata aggiunta una supporto iniziale per i dispositivi di blocco zonati (dispositivi su dischi fissi o NVMe SSD, il cui spazio di archiviazione è suddiviso in zone, composte da gruppi di blocchi o settori, nei quali è consentita solo l'aggiunta sequenziale di dati con un aggiornamento dell'intero gruppo di blocchi). È stata implementata una supporto in modalità di sola lettura per i blocchi con metadati e dati di dimensioni inferiori alla pagina (subpage).
- Nel file system F2FS è stata introdotta la possibilità di scegliere l'algoritmo e il livello di compressione. È stata aggiunta la supporto per un livello elevato di compressione per l'algoritmo LZ4. È stata realizzata un'opzione di montaggio per checkpoint_merge.
- È stata implementata una nuova comando ioctl FS_IOC_READ_VERITY_METADATA per la lettura dei metadati da file protetti tramite fs-verity.
- Nel client NFS è stata introdotta la modalità di scrittura "eager" (writes=eager), che consente di inviare immediatamente le operazioni di scrittura al server, bypassando la cache delle pagine. Questa modalità riduce il consumo di memoria, garantisce un'immediata informazione sul completamento dello spazio libero nel file system e, in alcune situazioni, consente di migliorare le prestazioni.
- In CIFS (SMB) sono state aggiunte nuove opzioni di montaggio: acregmax per gestire la cache dei file e acdirmax per gestire la cache dei metadati delle directory.
- In XFS è stata abilitata la modalità di verifica delle quote multi-thread, accelerata l'esecuzione di fsync e preparato il codice growfs per implementare la funzionalità di riduzione delle dimensioni del file system.
- Memoria e servizi di sistema
- È stata aggiunta la sottosistema DTMP (Dynamic Thermal Power Management), che consente di regolare dinamicamente il consumo energetico dei diversi dispositivi in base ai limiti di temperatura stabiliti.
- È stata implementata la possibilità di compilare il kernel con il compilatore Clang includendo le ottimizzazioni a livello di collegamento (LTO, Link Time Optimization). Le ottimizzazioni LTO si distinguono per la considerazione dello stato di tutti i file coinvolti nel processo di compilazione, mentre le modalità di ottimizzazione tradizionali ottimizzano ciascun file singolarmente e non tengono conto delle condizioni di invocazione delle funzioni definite in altri file. Ad esempio, con LTO, è possibile l'inlining per le funzioni di altri file, il codice non utilizzato non viene incluso nel file eseguibile, viene effettuato un controllo dei tipi e una ottimizzazione globale a livello di progetto. Il supporto per LTO è attualmente limitato alle architetture x86 e ARM64.
- È stata fornita la possibilità di scegliere le modalità di preemption (PREEMPT) nel pianificatore di attività durante il boot (preempt=none/voluntary/full) o durante il funzionamento tramite debugfs (/debug/sched_debug), se è stata specificata la configurazione PREEMPT_DYNAMIC al momento della compilazione del kernel. In precedenza, la modalità di preemption poteva essere impostata solo a livello di configurazione di compilazione. Questa modifica consente alle distribuzioni di fornire kernel con la modalità PREEMPT attivata, garantendo latenze minime per le workstation a costo di una leggera riduzione della larghezza di banda, e di tornare, se necessario, alle modalità PREEMPT_VOLUNTARY (modalità intermedia per le workstation) o PREEMPT_NONE (che offre la massima larghezza di banda per server).
- Nella sottosistema BPF è stata aggiunta la supporto per le operazioni atomiche BPF_ADD, BPF_AND, BPF_OR, BPF_XOR, BPF_XCHG e BPF_CMPXCHG.
- Alle applicazioni BPF hanno ora la possibilità di accedere ai dati nello stack tramite puntatori con offset variabile. Ad esempio, in passato era possibile accedere a un array nello stack solo tramite un indice fisso, mentre ora è possibile utilizzare uno variabile. Il controllo dell'accesso è gestito dal verificatore BPF entro i limiti esistenti. Questa funzionalità è disponibile solo per programmi privilegiati a causa del rischio di sfruttamento delle vulnerabilità legate all'esecuzione speculativa del codice.
- È stata aggiunta la possibilità di allegare programmi BPF a 'bare tracepoints', che non sono collegati a eventi di tracing visibili nello spazio utente (per tali tracepoints non è garantita la preservazione dell'ABI).
- È stata implementata la supporto per il bus CXL 2.0 (Compute Express Link), utilizzato per organizzare comunicazioni ad alta velocità tra la CPU e i dispositivi di memoria (consente di utilizzare dispositivi di memoria esterni come parte della RAM o memoria persistente, come se tale memoria fosse connessa attraverso un controller di memoria standard nella CPU).
- È stato aggiunto il driver nvmem per acquisire dati da aree di memoria riservate dai firmware, direttamente non accessibili a Linux (ad esempio, memoria EEPROM accessibile fisicamente solo dal firmware o dati disponibili solo nelle fasi iniziali di avvio).
- È stata rimossa la supporto per il sistema di profilazione «oprofile», che non ha avuto una diffusione adeguata ed è stato sostituito da meccanismi più moderni come perf.
- Nell'interfaccia di input/output asincrono io_uring è stata integrata la gestione con cgroup, che controllano l'uso della memoria.
- Per l'architettura RISC-V è stato implementato il supporto per i sistemi NUMA, così come i meccanismi kprobes e uprobes.
- È stata aggiunta la possibilità di utilizzare la chiamata di sistema kcmp() indipendentemente dalle funzionalità dei checkpoint/processi di ripristino.
- È stato rimosso il macro EXPORT_UNUSED_SYMBOL() e EXPORT_SYMBOL_GPL_FUTURE(), che non sono stati utilizzati in pratica da molti anni.
- Virtualizzazione e sicurezza
- È stato aggiunto un meccanismo di protezione KFence (Kernel Electric Fence) che cattura gli errori nella gestione della memoria, come gli accessi oltre i limiti del buffer e l'accesso dopo la liberazione della memoria. A differenza del meccanismo di debug KASAN, il sottosistema KFence è caratterizzato da alta velocità di esecuzione e basse spese generali, consentendo di rilevare errori di memoria che si manifestano solo su sistemi in produzione o durante un lungo periodo di funzionamento.
- È stato aggiunto il supporto per l'hypervisor ACRN, progettato con un occhio di riguardo verso la prontezza nell'esecuzione di compiti in tempo reale e l'idoneità per l'uso in sistemi critici. ACRN offre spese generali minime, garantisce bassa latenza e una ritenzione adeguata nelle interazioni con l'hardware. Supporta la virtualizzazione delle risorse CPU, input/output, sottosistema di rete, operazioni grafiche e audio. ACRN può essere utilizzato per l'esecuzione di più ambienti isolati. di macchine virtuali nei blocchi di controllo elettronici, nei cruscotti, nei sistemi informativi automobilistici, nei dispositivi IoT di consumo e in altre tecnologie embedded. ACRN supporta due tipi di sistemi guest: i Service VM privilegiati, utilizzati per gestire le risorse del sistema (CPU, memoria, input/output, ecc.), e i User VM, in cui possono essere eseguiti distribuzioni Linux, Android e Windows.
- Nel sottosistema IMA (Integrity Measurement Architecture), che mantiene un database di hash per verificare l'integrità dei file e dei metadati associati, è stata introdotta la possibilità di controllare l'integrità dei dati stessi del kernel, ad esempio per monitorare le modifiche alle regole SELinux.
- Nel hypervisor KVM è stata aggiunta la possibilità di intercettare le chiamate ipervisor di Xen e di inoltrarle a un emulatore che opera nello spazio utente.
- È stata aggiunta la possibilità di utilizzare Linux come ambiente radice per l'ipervisor Hyper-V. L'ambiente radice ha accesso diretto all'hardware e viene utilizzato per avviare sistemi guest (simile a Dom0 in Xen). Fino ad ora, Hyper-V (Microsoft Hypervisor) supportava Linux solo negli ambienti guest, mentre l'ipervisor stesso era gestito da un ambiente basato su Windows.
- È stato aggiunto il supporto per la crittografia inline per le schede eMMC, che consente di sfruttare i meccanismi di crittografia integrati nel controller di archiviazione, i quali effettuano una crittografia e decrittografia trasparenti per le operazioni di input/output.
- È stata rimossa dal sottosistema crittografico la supporto per gli hash RIPE-MD 128/256/320 e Tiger 128/160/192 non più utilizzati nel kernel, così come per il cifrario a flusso Salsa20, sostituito dall'algoritmo ChaCha20. L'algoritmo blake2 è stato aggiornato alla sua implementazione blake2s.
- Sottosistema di rete
- È stata aggiunta la possibilità di eseguire il gestore NAPI per il polling dei dispositivi di rete in un thread kernel separato, il che consente di migliorare le prestazioni per alcuni tipi di carico. Prima, il polling veniva eseguito nel contesto di softirq e non era gestito dal pianificatore di task, rendendo difficile l'ottimizzazione fine per ottenere le massime prestazioni. L'esecuzione in un thread kernel separato consente di monitorare il gestore di polling dallo spazio utente, di associarlo a singoli core CPU e di tenerlo in considerazione nella pianificazione del passaggio di task. Per attivare la nuova modalità è stato proposto il parametro /sys/class/net//threaded.
- È proseguita l'integrazione nel kernel di MPTCP (MultiPath TCP), un'estensione del protocollo TCP per gestire le connessioni TCP con la consegna dei pacchetti contemporaneamente su più percorsi attraverso diverse interfacce di rete associate a indirizzi IP differenti. Nel nuovo rilascio è stata aggiunta la possibilità di assegnare una priorità a determinati flussi, il che consente, ad esempio, di organizzare il funzionamento di flussi di backup che si attivano solo in caso di problemi con il flusso primario.
- In IGMPv3 è stata aggiunta la supporto per il meccanismo EHT (Explicit Host Tracking).
- Nel meccanismo di filtraggio dei pacchetti netfilter è stata implementata la possibilità di possedere determinate tabelle per ottenere un controllo esclusivo (ad esempio, un processo in background del firewall può bloccare determinate tabelle, vietando ad altri di interferire con esse).
- Attrezzature
- È stata effettuata una pulizia delle piattaforme ARM obsolete e non più supportate. È stato rimosso il codice delle piattaforme efm32, picoxcell, prima2, tango, u300, zx e c6x, così come i driver associati.
- Nel driver amdgpu è stata introdotta la funzionalità di overclocking (OverDrive) per le schede basate su GPU Sienna Cichlid (Navi 22, Radeon RX 6xxx). È stato aggiunto il supporto per il formato pixel FP16 per DCE (display controller engine) dalla 8ª alla 11ª generazione. Per la GPU Navy Flounder (Navi 21) e l'APU Van Gogh è stata implementata la possibilità di reset della GPU.
- Nel driver i915 per schede grafiche Intel è stato implementato il parametro i915.mitigations per disabilitare meccanismi di isolamento e protezione a favore di un aumento delle prestazioni. Per i chip a partire da Tiger Lake è inclusa la supporto per il meccanismo VRR (Variable Rate Refresh), che consente di adattare in modo dinamico la frequenza di aggiornamento del monitor per garantire fluidità e assenza di problemi durante il gioco. È incluso il supporto per la tecnologia Intel Clear Color per migliorare la precisione nella rappresentazione dei colori. Aggiunto supporto per DP-HDMI 2.1. È stata implementata la possibilità di gestire l'illuminazione dei pannelli eDP. Per le GPU Gen9 con supporto LSPCON (Level Shifter e Protocol Converter) è incluso il supporto HDR.
- Nel driver nouveau è stato aggiunto il supporto iniziale per le GPU NVIDIA basate sull'architettura GA100 (Ampere).
- Nel driver msm è stato aggiunto il supporto per le GPU Adreno 508, 509 e 512, utilizzate nei chip SDM (Snapdragon) 630, 636 e 660.
- È stato aggiunto il supporto per le schede audio Sound BlasterX AE-5 Plus, Lexicon I-ONIX FW810s e Pioneer DJM-750. È stato aggiunto il supporto per la sottosistema audio Intel Alder Lake PCH-P. Implementato il supporto per la simulazione software della connessione e disconnessione dell'uscita audio per il debug dei gestori nello spazio utente.
- È stata aggiunta la compatibilità con le console di gioco Nintendo 64, prodotte dal 1996 al 2003 (precedenti tentativi di portare Linux per Nintendo 64 non sono stati portati a termine e sono stati considerati Vaporware). La motivazione per la creazione di un nuovo port per una piattaforma obsoleta, non più in produzione da quasi vent'anni, è la volontà di stimolare lo sviluppo degli emulatori e semplificare il porting dei giochi.
- È stato aggiunto il driver per il controller di gioco Sony PlayStation 5 DualSense.
- È stata aggiunta la compatibilità con piattaforme ARM, dispositivi e piattaforme: PineTab, Snapdragon 888 / SM8350, Snapdragon MTP, Two Beacon EmbeddedWorks, Intel eASIC N5X, Netgear R8000P, Plymovent M2M, Beacon i.MX8M Nano, NanoPi M4B.
- È stata aggiunta la compatibilità con gli smartphone Purism Librem5 Evergreen, Xperia Z3+/Z4/Z5, ASUS Zenfone 2 Laser, BQ Aquaris X5, OnePlus6, OnePlus6T, Samsung GT-I9070.
- È stato aggiunto il driver bcm-vk per le schede di accelerazione Broadcom VK (ad esempio, le schede PCIe Valkyrie e Viper), che possono essere utilizzate per esternalizzare a un dispositivo separato le operazioni di elaborazione audio, video e immagini, oltre ad attività relative alla crittografia.
- È stata aggiunta la supporto per la piattaforma Lenovo IdeaPad con gestione della ricarica continua e retroilluminazione della tastiera. È stata inoltre fornita la compatibilità con il profilo ACPI della piattaforma ThinkPad, consentendo la gestione delle modalità di risparmio energetico. Aggiunto il driver per il sottosistema HID del Lenovo ThinkPad X1 Tablet Gen 2.
- Aggiunto il driver ov5647 con supporto per il modulo fotocamera per Raspberry Pi.
- Aggiunta la supporto per RISC-V SoC FU740 e schede HiFive Unleashed. È stato aggiunto anche un nuovo driver per il chip Kendryte K210.
Fonte: opennet.ru
