Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.19. Tra le modifiche più significative ci sono: il supporto per l'architettura dei processori LoongArch, l'integrazione delle patch "BIG TCP", la modalità "on-demand" in fscache, la rimozione del codice per il supporto del formato a.out, la possibilità di applicare ZSTD per la compressione dei firmware, un'interfaccia per gestire il dumping della memoria dallo spazio utente, l'aumento dell'affidabilità e delle prestazioni del generatore di numeri pseudocasuali, il supporto per le estensioni Intel IFS (In-Field Scan), AMD SEV-SNP (Secure Nested Paging), Intel TDX (Trusted Domain Extensions) e ARM SME (Scalable Matrix Extension).
Nell'annuncio, Linus ha dichiarato che è probabile che alla prossima versione del kernel venga assegnato il numero 6.0, poiché nella serie 5.x si sono accumulate sufficienti versioni da giustificare il cambiamento del numero principale. Il cambiamento della numerazione avviene per motivi estetici ed è un passo formale che allevia il disagio causato dall'accumulo di un gran numero di versioni nella serie.
Linus ha anche menzionato di aver utilizzato un laptop Apple basato sull'architettura ARM64 (Apple Silicon) con un ambiente Linux basato sulla distribuzione Asahi Linux per compilare il rilascio. Non è la workstation principale di Linus, ma ha utilizzato questa piattaforma per verificarne l'idoneità per lavorare sul kernel e per essere sicuro di poter compilare i rilasci del kernel in viaggio, avendo a disposizione un laptop leggero. Molti anni fa, Linus ha avuto esperienza nell'utilizzo di hardware Apple per la sua programmazione — un tempo usava un computer basato su CPU ppc970 e un laptop Macbook Air.
Nella nuova versione sono stati incorporati 16.401 aggiornamenti da 2.190 sviluppatori (nell'ultima versione c'erano 16.206 aggiornamenti da 2.127 sviluppatori), la dimensione della patch è di 90 MB (le modifiche hanno interessato 13.847 file, sono state aggiunte 1.149.456 righe di codice, e 349.177 righe sono state rimosse). Circa il 39% di tutte le modifiche presentate in 5.19 riguardano i driver di dispositivo, circa il 21% delle modifiche è relativo all'aggiornamento del codice specifico per le architetture hardware, l'11% è correlato allo stack di rete, il 4% ai file system e il 3% ai sottosistemi interni del kernel.
Le principali novità nel kernel 5.19:
- Sottosistema disco, I/O e file system
- Il file system EROFS (Enhanced Read-Only File System), progettato per essere utilizzato su partizioni disponibili in modalità di sola lettura, è stato aggiornato per utilizzare il sottosistema fscache, che supporta la memorizzazione nella cache dei dati. Questa modifica ha notevolmente migliorato le prestazioni dei sistemi in cui viene avviato un gran numero di container da un'immagine basata su EROFS.
- Il sottosistema fscache ha introdotto una modalità di lettura su richiesta («on-demand»), attivata per ottimizzare EROFS. Questa nuova modalità consente di organizzare la memorizzazione nella cache delle letture da immagini di file system presenti nel sistema locale. A differenza della modalità di lavoro originale, orientata alla memorizzazione nella cache dei dati nella filesystem locale trasmessi tramite sistemi di file di rete, la modalità «on-demand» delega le funzioni di estrazione dei dati e la loro scrittura nella cache a un processo in background separato che viene eseguito nello spazio utente.
- In XFS è stata implementata la possibilità di memorizzare miliardi di attributi estesi nell'i-node. Il numero massimo di extent per un singolo file è stato aumentato da 4 miliardi a 247. È stato introdotto un regime per l'aggiornamento atomico di più attributi estesi del file.
- Nel file system Btrfs è stato ottimizzato il funzionamento delle lock, permettendo un aumento delle prestazioni di circa il 7% durante la scrittura diretta in modalità nowait. Le prestazioni delle operazioni in modalità NOCOW (senza copy-on-write) sono aumentate di circa il 3%. Il carico sulla cache delle pagine è stato ridotto durante l'esecuzione del comando 'send'. La dimensione minima delle sottopagine è stata ridotta da 64K a 4K (ora è possibile utilizzare sottopagine di dimensioni inferiori alle pagine del kernel). È avvenuto un passaggio dall'uso dell'albero di radix (radix tree) all'algoritmo XArrays.
- Nel server NFS è stata aggiunta una modalità per estendere il salvataggio dello stato di blocco impostato da un cliente che ha smesso di rispondere alle richieste. La nuova modalità consente di ritardare la pulizia del blocco fino a 24 ore, a meno che un altro cliente non richieda un blocco concorrente. In modalità standard, il blocco viene pulito dopo 90 secondi dall'ultima risposta del cliente.
- Nella sottosistema di tracciamento eventi nel FS fanotify è stato implementato il flag FAN_MARK_EVICTABLE, che consente di disattivare il fissaggio degli i-node target nella cache, ad esempio, per ignorare i rami senza fissare le loro parti nella cache.
- Nel driver per FS FAT32 è stata aggiunta la supporto per ottenere informazioni sulla data di creazione del file tramite la chiamata di sistema statx, implementando una versione più efficiente e funzionale di stat(), che restituisce informazioni estese sul file.
- Sono state apportate significative ottimizzazioni al driver exFAT, relative alla pulizia simultanea di gruppi di settori in modalità 'dirsync', anziché la pulizia settoriale sequenziale. Grazie alla riduzione del numero di richieste di blocchi dopo l'ottimizzazione, le prestazioni nella creazione di un gran numero di directory su schede SD sono aumentate di oltre il 73-85%, in base alle dimensioni dei cluster.
- Nel kernel è stato incluso il primo aggiornamento correttivo del driver ntfs3. Da quando ntfs3 è stato integrato nel kernel 5.15 nell'ottobre dello scorso anno, il driver non è stato aggiornato e la comunicazione con gli sviluppatori è stata interrotta, ma ora gli sviluppatori hanno ripreso a pubblicare modifiche. Nei patch proposti sono stati risolti bug che provocavano perdite di memoria e arresti anomali, sono stati risolti problemi con l'esecuzione di xfstests, è stata effettuata una pulizia del codice non utilizzato e sono stati corretti errori di battitura.
- Per OverlayFS è stata implementata la possibilità di mappare gli identificatori degli utenti delle filesystem montati, applicata per associare i file di un determinato utente su una partizione montata di un altro utente con un altro utente nel sistema corrente.
- Memoria e servizi di sistema
- È stata aggiunta la supporto iniziale per l'architettura del set di istruzioni LoongArch, utilizzata nei processori Loongson 3 5000 e che implementa un nuovo ISA RISC, simile a MIPS e RISC-V. L'architettura LoongArch è disponibile in tre varianti: 32 bit ridotto (LA32R), 32 bit normale (LA32S) e 64 bit (LA64).
- È stato rimosso il codice per il supporto del formato di file eseguibili a.out, declassato nella versione 5.1. Il formato a.out non è più utilizzato nei sistemi Linux, e la generazione di file a.out non è supportata dagli strumenti moderni nelle configurazioni predefinite per Linux. Un caricatore per file a.out può essere implementato completamente nello spazio utente.
- È stata interrotta la supporto per le opzioni di avvio specifiche per l'architettura x86: nosep, nosmap, nosmep, noexec e noclflush.
- È stata interrotta la supporto per l'architettura CPU h8300 obsoleta (Renesas H8/300), che non è più mantenuta da tempo.
- Sono state ampliate le funzionalità relative alla gestione dei blocchi di tipo «split lock», che si verificano quando si accede a dati non allineati in memoria a causa del fatto che, durante l'esecuzione di un'istruzione atomica, i dati attraversano due linee di cache della CPU. Tali blocchi comportano un notevole calo delle prestazioni. Se in passato il core emetteva un avviso con informazioni sul processo che causava il blocco, ora il processo problematico verrà ulteriormente rallentato per mantenere le prestazioni del resto del sistema.
- È stata aggiunta la supporto per il meccanismo IFS (In-Field Scan) implementato nei processori Intel, che consente l'esecuzione di test diagnostici a basso livello sul CPU, in grado di rilevare problemi non identificabili dai normali strumenti basati sui codici di correzione degli errori (ECC) o sui bit di parità. I test possono essere eseguiti sotto forma di firmware caricabile, simile agli aggiornamenti del microcodice. I risultati dei test sono disponibili tramite sysfs.
- È stata aggiunta la possibilità di integrare nel kernel il file bootconfig, che consente di stabilire i parametri di funzionamento del kernel tramite un file di configurazione oltre alle opzioni della riga di comando. L'integrazione avviene utilizzando l'opzione di compilazione ‘CONFIG_BOOT_CONFIG_EMBED_FILE=»/PATH/TO/BOOTCONFIG/FILE»‘. In precedenza, bootconfig era definito tramite attaccamento all'immagine initrd. L'integrazione nel kernel consente di utilizzare bootconfig nelle configurazioni senza initrd.
- È stata implementata la possibilità di caricare firmware compressi utilizzando l'algoritmo Zstandard. In sysfs è stato aggiunto un insieme di file di controllo /sys/class/firmware/*, che consente di avviare il caricamento del firmware dallo spazio utente.
- Nell'interfaccia di input/output asincrono io_uring è stato introdotto un nuovo flag IORING_RECVSEND_POLL_FIRST, il quale, se attivato, consente che un'operazione di rete venga inizialmente elaborata utilizzando il polling, risparmiando così risorse in situazioni dove è accettabile un ritardo nell'elaborazione dell'operazione. Inoltre, io_uring supporta anche la chiamata di sistema socket(), presentando nuovi flag per semplificare la gestione dei descrittori di file, è stata aggiunta la modalità 'multi-shot' per accettare più connessioni in una volta con la chiamata accept(), e sono state introdotte operazioni per inoltrare comandi NVMe direttamente al dispositivo.
- Per l'architettura Xtensa è stato fornito il supporto per lo strumento di debug KCSAN (Kernel Concurrency Sanitizer), progettato per la rilevazione dinamica delle condizioni di race all'interno del kernel. È stato anche aggiunto il supporto per la modalità sleep e per i coprocessori.
- Per l'architettura m68k (Motorola 68000) è stata implementata la macchina virtuale (simulatore della piattaforma), basata sull'emulatore Android Goldfish.
- Per l'architettura AArch64 è stato implementato il supporto per le estensioni Armv9-A SME (Scalable Matrix Extension).
- Nel sottosistema eBPF è consentito memorizzare puntatori tipizzati nelle strutture map, ed è stata aggiunta la supporto per i puntatori dinamici.
- È stato proposto un nuovo meccanismo proattivo di espulsione della memoria, che supporta la gestione dallo spazio utente tramite il file memory.reclaim. Scrivere un numero nel file specificato tenterà di espellere il corrispondente numero di byte dal set associato al cgroup.
- È stata aumentata la precisione nel conteggio dell'utilizzo della memoria durante la compressione dei dati nella sezione di swap grazie al meccanismo zswap.
- Per l'architettura RISC-V è stata fornita la supporto per eseguire file eseguibili a 32 bit su sistemi a 64 bit, è stata aggiunta una modalità per associare attributi restrittivi alle pagine di memoria (ad esempio, per vietare la memorizzazione nella cache) ed è stata realizzata la funzione kexec_file_load().
- L'implementazione del supporto per i sistemi a 32 bit Armv4T e Armv5 è stata adattata per l'uso in assemblaggi del kernel multifunzionali universali, adatti per diversi sistemi ARM.
- Virtualizzazione e sicurezza
- Nel sottosistema EFI è implementata la possibilità di trasmettere in modo sicuro informazioni riservate ai sistemi guest senza rivelarle al sistema host. I dati vengono forniti tramite la directory security/coco in securityfs.
- In modalità di protezione Lockdown, che limita l'accesso dell'utente root al kernel e blocca i percorsi di bypass del UEFI Secure Boot, è stata rimossa una vulnerabilità che consentiva di eludere la protezione attraverso manipolazioni del debugger del kernel.
- Sono stati inclusi patch mirati a migliorare l'affidabilità e le prestazioni del generatore di numeri pseudo-casuali.
- Con la compilazione utilizzando Clang 15 è stata implementata la supporto per il meccanismo di randomizzazione delle strutture del kernel.
- Nel meccanismo Landlock, che consente di limitare l'interazione di un gruppo di processi con l'ambiente esterno, è stata aggiunta la supporto per le regole che consentono di controllare l'esecuzione delle operazioni di rinomina dei file.
- Il sottosistema IMA (Integrity Measurement Architecture), progettato per verificare l'integrità dei componenti del sistema operativo tramite firme digitali e hash, è stato adattato per utilizzare il modulo fs-verity per la verifica dei file.
- Modificata la logica delle azioni quando si disabilita l'accesso non privilegiato al sottosistema eBPF: in precedenza venivano disabilitate tutte le comandi correlati alla chiamata di sistema bpf(), ma a partire dalla versione 5.19 è stato mantenuto l'accesso ai comandi che non portano alla creazione di oggetti. Con questo comportamento, per caricare un programma BPF è necessario un processo privilegiato, ma successivamente i processi non privilegiati possono interagire con quel programma.
- Aggiunto il supporto per l'estensione AMD SEV-SNP (Secure Nested Paging), che garantisce un funzionamento sicuro con tabelle delle pagine di memoria annidate e protegge dagli attacchi «undeSErVed» e «SEVerity» sui processori AMD EPYC, che possono aggirare il meccanismo di protezione AMD SEV (Secure Encrypted Virtualization).
- Aggiunto il supporto per il meccanismo Intel TDX (Trusted Domain Extensions), che consente di bloccare i tentativi di accesso esterno alla memoria crittografata. di macchine virtuali.
- Nel driver virtio-blk, utilizzato per l'emulazione dei dispositivi di blocco, è stato aggiunto il supporto per l'input/output tramite polling, il che, secondo i test condotti, ha permesso di ridurre i ritardi di circa il 10%.
- Sottosistema di rete
- Nel pacchetto è inclusa una serie di patch BIG TCP che consentono di aumentare la dimensione massima del pacchetto TCP fino a 4 GB, ottimizzando le prestazioni delle reti interne ad alta velocità nei datacenter. Tale incremento della dimensione del pacchetto, tenendo conto del campo delle intestazioni di 16 bit, è realizzato tramite l'implementazione dei "jumbo"-pacchetti, la cui dimensione nell'intestazione IP è impostata a 0, mentre la dimensione effettiva viene trasmessa in un campo separato a 32 bit in un'intestazione allegata. Durante il test delle prestazioni, impostare la dimensione del pacchetto a 185 KB ha consentito di aumentare la larghezza di banda del 50% e di ridurre significativamente le latenze di trasmissione dei dati.
- Prosegue il lavoro per l'integrazione nelle stack di rete di strumenti per il monitoraggio delle cause di scarto dei pacchetti (codici reason). Il codice della causa viene trasmesso durante il rilascio della memoria associata al pacchetto e permette di tenere conto di situazioni come lo scarto di pacchetti a causa di errori nel riempimento dei campi nell'intestazione, l'individuazione di spoofing da parte del filtro rp_filter, checksum non validi, esaurimento della memoria, attivazione delle regole IPSec XFRM, numero di sequenza TCP errato, ecc.
- Aggiunta la supporto per il ripristino delle connessioni MPTCP (MultiPath TCP) a TCP normale, in situazioni in cui determinate funzionalità di MPTCP non possono essere utilizzate. MPTCP è un'estensione del protocollo TCP per gestire le connessioni TCP consegnando pacchetti simultaneamente attraverso più percorsi tramite diverse interfacce di rete collegate a diversi indirizzi IP. È stata aggiunta un'API per gestire i flussi MPTCP dallo spazio utente.
- Attrezzature
- Sono state aggiunte oltre 420.000 righe di codice relative al driver amdgpu, di cui circa 400.000 righe appartengono a file di intestazione generati automaticamente contenenti dati per i registri ASIC nel driver per GPU AMD, e ulteriori 22.500 righe offrono un'implementazione iniziale del supporto per AMD SoC21. La dimensione totale del driver per GPU AMD ha superato i 4 milioni di righe di codice. Oltre al SoC21, il driver AMD include il supporto per SMU 13.x (System Management Unit), ha aggiornato il supporto USB-C e GPUVM, ed è stata effettuata una preparazione per il supporto delle prossime generazioni di piattaforme RDNA3 (RX 7000) e CDNA (AMD Instinct).
- Nel driver i915 (Intel) sono state ampliate le funzionalità relative alla gestione dell'energia. Sono stati aggiunti gli identificatori GPU Intel DG2 (Arc Alchemist), utilizzati nei notebook, è stato garantito un supporto iniziale per la piattaforma Intel Raptor Lake-P (RPL-P), è stata aggiunta la documentazione sulle schede grafiche Arctic Sound-M, è stato implementato l'ABI per gli engine di calcolo, per le schede DG2 è stato aggiunto il supporto per il formato Tile4, e per i sistemi basati sull'architettura micro Haswell è stato implementato il supporto per DisplayPort HDR.
- Nel driver Nouveau è stato introdotto l'uso del gestore drm_gem_plane_helper_prepare_fb, e per alcune strutture e variabili è stata applicata l'allocazione statica della memoria. Per quanto riguarda l'uso dei codici sorgente dei moduli del kernel forniti da NVIDIA, il lavoro è attualmente concentrato sull'individuazione e la correzione degli errori. In futuro, il firmware pubblicato sarà utilizzato per migliorare le prestazioni del driver.
- È stato aggiunto un driver per il controller NVMe utilizzato nei computer Apple basati sul chip M1.
Nel contesto del software libero, la Fondazione latinoamericana del software libero ha rilasciato una variante completamente libera del kernel 5.19 — Linux-libre 5.19-gnu, ripulito da componenti di firmware e driver contenenti elementi non liberi o segmenti di codice, la cui area di applicazione è limitata dal produttore. Questa nuova versione include la pulizia dei driver per pureLiFi X/XL/XC e TI AMx3 Wkup-M3 IPC. È stato aggiornato il codice di pulizia dei blob nei driver e nelle sottosistemi di Silicon Labs WFX, AMD amdgpu, Qualcomm WCNSS Peripheral Image Loader, Realtek Bluetooth, Mellanox Spectrum, Marvell WiFi-Ex, Intel AVS, IFS, pu3-imgu drivers. È stata implementata la gestione dei file devicetree per Qualcomm AArch64. È stata aggiunta la supporto per un nuovo schema di denominazione dei componenti Sound Open Firmware. La pulizia del driver ATM Ambassador, rimosso dal kernel, è stata interrotta. La gestione della pulizia dei blob in HDCP e Mellanox Core è stata trasferita in tag kconfig separati.
Fonte: opennet.ru
