Dopo due mesi di sviluppo, Linus Torvalds ha presentato rilascio del kernel Linux 5.14. Tra le modifiche più significative ci sono: nuove chiamate di sistema quotactl_fd() e memfd_secret(), rimozione dei driver ide e raw, un nuovo controllore delle priorità I/O per cgroup, la modalità di pianificazione SCHED_CORE, e un'infrastruttura per la creazione di bootloader di programmi BPF verificati.
Nella nuova versione sono stati accolti 15883 correttivi da 2002 sviluppatori, la dimensione della patch è di 69 MB (le modifiche hanno riguardato 12580 file, aggiunte 861501 righe di codice e rimosse 321654 righe). Circa il 47% di tutte le modifiche introdotte in 5.14 riguardano i driver dei dispositivi, circa il 14% delle modifiche è relativo all'aggiornamento del codice specifico dell'architettura hardware, il 13% concerne lo stack di rete, il 3% sono legate ai filesystem e il 3% ai sottosistemi interni del kernel.
- sottosistema disco, I/O e filesystem:
- per cgroup implementato nuovo controllore di prioritizzazione I/O — rq-qos, che può gestire la priorità dei requisiti di elaborazione delle richieste verso i dispositivi a blocchi, generati dai membri di ogni cgroup. Il supporto per il nuovo controllore delle priorità è stato aggiunto al pianificatore I/O mq-deadline;
- nel filesystem ext4 è stata realizzata nuovo comando ioctl EXT4_IOC_CHECKPOINT, che costringe il ripristino su disco di tutte le transazioni in attesa dal registro e dei relativi buffer, oltre a riscrivere l'area usata dal registro nello storage. La modifica è stata preparata nell'ambito di un'iniziativa per prevenire perdite di informazioni dai file system;
- in Btrfs sono stati apportati ottimizzazione delle prestazioni: grazie all'esclusione di registrazioni non necessarie degli attributi estesi durante l'esecuzione di fsync, le prestazioni delle operazioni intensive sugli attributi estesi sono aumentate fino al 17%. Inoltre, durante le operazioni di troncamento che non interessano gli extent, è stata disabilitata l'esecuzione della sincronizzazione completa, riducendo il tempo di esecuzione dell'operazione del 12%. È stata aggiunta una configurazione in sysfs per limitare la capacità di input/output durante il controllo del file system. Sono state aggiunte chiamate ioctl per annullare operazioni di ridimensionamento e rimozione del dispositivo;
- in XFS ri-strutturata l'implementazione della cache buffer, che è stata convertita in allocazione di pagine di memoria in modalità batch. L'efficienza del lavoro della cache è aumentata;
- In F2FS, an option for read-only mode has been added, along with a compressed block caching mode (compress_cache) to enhance random read performance. Support for file compression reflected in memory using the mmap() operation has been implemented. A new mount option, nocompress, has been proposed for selectively disabling file compression by mask.
- Improvements have been made in the exFAT driver for better compatibility with storage devices from certain digital cameras.
- A system call has been added quotactl_fd(), which allows managing quotas not via a special device file, but through specifying a file descriptor associated with the filesystem to which the quota applies.
- Old drivers for block devices using the IDE interface have been removed from the kernel, which have long been replaced by the libata subsystem. Support for older devices remains fully intact; changes only pertain to the ability to use old drivers, where drives were named /dev/hd* instead of /dev/sd*.
- è stato rimosso dal kernel il driver «raw», che fornisce accesso non bufferizzato ai dispositivi a blocchi tramite l'interfaccia /dev/raw. Questa funzionalità è stata a lungo implementata nelle applicazioni utilizzando il flag O_DIRECT;
- memoria e servizi di sistema:
- è stata implementata una nuova modalità di scheduling nel pianificatore dei processi SCHED_CORE, che consente di gestire quali processi possano essere eseguiti congiuntamente su un singolo core CPU. A ciascun processo può essere assegnato un identificatore cookie, che definisce l'area di fiducia tra i processi (ad esempio, appartenenza a un utente o contenitore specifico). Quando si organizza l'esecuzione del codice, il pianificatore può garantire l'uso condiviso di un core CPU solo per i processi collegati a un singolo proprietario, il che può essere utilizzato per bloccare alcuni attacchi di tipo Spectre evitando l'esecuzione in un unico thread SMT (Hyper-Threading) di compiti fidati e non fidati;
- per il meccanismo cgroup è stata implementata la supporto per l'operazione kill, che consente di terminare tutti i processi associati a un gruppo (inviando un SIGKILL) scrivendo «1» nel file virtuale cgroup.kill;
- sono state ampliate le capacità di gestione delle interruzioni causate dai lock divisi («split lock»), che si verificano quando si accede a dati non allineati nella memoria a causa del fatto che, durante l'esecuzione di un'istruzione atomica, i dati attraversano due linee di cache della CPU. Questi lock possono causare un degrado significativo delle performance, quindi in passato era possibile forzare la chiusura dell'applicazione che causava il lock. Nella nuova versione è stato aggiunto un parametro della riga di comando del kernel «split_lock_detect=ratelimit:N», che consente di definire un limite complessivo della frequenza delle operazioni di lock al secondo; superato questo limite, qualsiasi processo che diventa la fonte di un lock diviso verrà forzatamente sospeso per 20 ms anziché terminato.
- Nel controller del bandwidth CFS (CFS bandwidth controller), che determina quanto tempo di CPU può essere allocato a ciascun cgroup, è stata implementata la possibilità di definire limiti temporizzati, consentendo una migliore regolazione dei carichi sensibili alla latenza. Ad esempio, impostare il valore cpu.cfs_quota_us a 50000 e cpu.cfs_period_us a 100000 permetterà a un gruppo di processi di utilizzare 50ms di tempo CPU ogni 100ms;
- aggiunta infrastruttura iniziale per la creazione di caricamenti di programmi BPF, che permetterà in seguito di consentire il caricamento solo di programmi BPF firmati con una chiave digitale di fiducia;
- è stata aggiunta una nuova operazione futex FUTEX_LOCK_PI2, che utilizza un timer monotono per calcolare il timeout, tenendo conto del tempo trascorso dal sistema in modalità di sospensione;
- per l'architettura RISC-V è stata implementata la supporto per le grandi pagine di memoria (Transparent Huge-Pages) e la possibilità di applicare il meccanismo KFENCE per identificare gli errori nella gestione della memoria;
- nella chiamata di sistema madvise(), che fornisce strumenti per ottimizzare la gestione della memoria del processo, sono stati aggiunti i flag MADV_POPULATE_READ e MADV_POPULATE_WRITE generano un "page fault" in tutte le pagine di memoria, collegate per operazioni di lettura o scrittura, senza eseguire letture o scritture effettive (prefault). L'uso dei flag può essere utile per ridurre le latenze durante l'esecuzione del programma, grazie all'esecuzione preventiva del gestore di "page fault" per tutte le pagine non allocate, senza attendere il loro effettivo accesso.
- nel sistema di unit testing kunit aggiunta supporto per l'esecuzione dei test in ambiente QEMU;
- aggiunti nuovi tracciatori: "osnoise" per monitorare le latenze nelle applicazioni causate dalla gestione delle interruzioni, e "timerlat" per fornire informazioni dettagliate sulle latenze di risveglio dal segnale del timer;
- virtualizzazione e sicurezza:
- è stato aggiunto chiamata di sistema memfd_secret(), che consente di creare un'area di memoria privata in uno spazio indirizzi isolato, visibile solo al processo proprietario, non riflessa in altri processi e direttamente inaccessibile al kernel;
- Nel sistema di filtraggio delle chiamate di sistema seccomp, l'estrazione dei gestori di blocco nello spazio utente offre la possibilità di utilizzare un'unica operazione atomica per creare un descrittore di file per un'attività isolata e restituirlo durante l'elaborazione della chiamata di sistema. L'operazione proposta risolve il problema con l'interruzione del gestore nello spazio utente al ricevimento di un segnale;
- è stato aggiunto un nuovo meccanismo per gestire la limitazione delle risorse nello spazio dei nomi degli identificatori utente, che associa contatori rlimit specifici all'utente nel 'user namespace'. La modifica risolve il problema dell'applicazione di contatori di risorse condivisi quando un utente avvia processi in contenitori diversi;
- Nel hypervisor KVM per sistemi ARM64 è stata aggiunta la possibilità di utilizzare nelle macchine virtuali le estensioni MTE (MemTag, Memory Tagging Extension), che consentono di associare tag a ogni operazione di allocazione della memoria e organizzare il controllo della correttezza dell'uso dei puntatori per prevenire il sfruttamento di vulnerabilità causate dall'accesso a blocchi di memoria già liberati, overflow di buffer, accessi prima dell'inizializzazione e utilizzo al di fuori del contesto attuale;
- Gli strumenti forniti dalla piattaforma ARM64 per l'autenticazione dei puntatori (Pointer Authentication) possono ora essere configurati separatamente per il kernel e lo spazio utente. Questa tecnologia permette di utilizzare istruzioni ARM64 specializzate per verificare gli indirizzi di ritorno tramite firme digitali memorizzate nei bit superiori inutilizzati dello stesso puntatore;
- in User-mode Linux aggiunta supporto per l'uso di driver per dispositivi PCI con bus virtuale PCI, implementato dal driver PCI-over-virtio;
- Per i sistemi x86 è stata aggiunta la supporto per il dispositivo para-virtualizzato virtio-iommu, che consente di inviare richieste IOMMU come ATTACH, DETACH, MAP e UNMAP sopra il trasporto virtio senza emulare le tabelle di pagina della memoria;
- Per le CPU Intel, dalle famiglie Skylake a Coffee Lake, l'uso delle estensioni Intel TSX (Transactional Synchronization Extensions) è disabilitato per impostazione predefinita. Queste estensioni forniscono strumenti per migliorare le prestazioni delle applicazioni multi-threading escludendo dinamicamente operazioni di sincronizzazione superflue. Le estensioni sono state disabilitate a causa della possibilità di attacchi Zombieload, che manipolano la fuga di informazioni tramite canali laterali, che si verifica durante il funzionamento del meccanismo di interruzione asincrona delle operazioni (TAA, TSX Asynchronous Abort);
- sottosistema di rete:
- è proseguita l'integrazione nel kernel MPTCP (MultiPath TCP), un'estensione del protocollo TCP per organizzare il funzionamento di una connessione TCP con la consegna dei pacchetti contemporaneamente su più percorsi attraverso diverse interfacce di rete collegate a indirizzi IP diversi. Nella nuova versione è stato aggiunto meccanismo per impostare politiche di hashing del traffico personalizzate per IPv4 e IPv6 (politica hash multipath), che consente di determinare dallo spazio utente quali campi nei pacchetti, comprese le incapsulazioni, verranno utilizzati per calcolare l'hash che determina la scelta del percorso per il pacchetto;
- aggiunta del supporto per socket nel trasporto virtuale virtio SOCK_SEQPACKET (trasmissione di datagrammi ordinati e affidabili);
- ampliate le funzionalità del meccanismo dei socket SO_REUSEPORT, che consente a più socket in ascolto di connettersi a una stessa porta per ricevere connessioni distribuendo simultaneamente le richieste in arrivo tra tutti i socket connessi tramite SO_REUSEPORT, semplificando così la creazione di applicazioni server multithread. Nella nuova versione sono stati aggiunti strumenti per trasferire il controllo a un altro socket in caso di errore durante l'elaborazione della richiesta da parte del socket inizialmente scelto (risolve il problema della perdita di singole connessioni durante il riavvio dei servizi);
- hardware:
- nel driver amdgpu è stata realizzata supporto per le nuove serie di GPU AMD Radeon RX 6000, sviluppate con i nomi in codice «Beige Goby» (Navi 24) e «Yellow Carp», è stata migliorata anche la compatibilità con le GPU Aldebaran (gfx90a) e APU Van Gogh. È stata aggiunta la possibilità di lavorare simultaneamente con più pannelli eDP. Per gli APU Renoir è stata implementata la compatibilità con la gestione dei buffer crittografati nella memoria video (TMZ, Trusted Memory Zone). È stata introdotta la supporto per lo stacco a caldo delle schede grafiche (hot-unplug). Per le GPU Radeon RX 6000 (Navi 2x) e le GPU AMD più vecchie, è attivata di default la funzionalità di gestione energetica ASPM (Active State Power Management), prima attivata solo per le GPU Navi 1x, Vega e Polaris;
- per i chip AMD è stata introdotta la supporto per la memoria virtuale condivisa (SVM, shared virtual memory) basata sul sottosistema HMM (Heterogeneous memory management), che consente di utilizzare dispositivi con unità di gestione della memoria proprie (MMU, memory management unit) che possono accedere alla memoria principale. Inoltre, tramite HMM è possibile organizzare uno spazio di indirizzamento condiviso tra GPU e CPU, in cui la GPU può accedere alla memoria principale del processo;
- è stato aggiunto il supporto iniziale per la tecnologia AMD Smart Shift, che modifica dinamicamente i parametri di consumo energetico della CPU e della GPU nei laptop con chipset e schede grafiche AMD per massimizzare le prestazioni durante il gioco, l'editing video e il rendering 3D;
- nel driver i915 per schede grafiche Intel è inclusa supporto per i chip Intel Alder Lake P;
- aggiunto il driver drm/hyperv per la scheda grafica virtuale Hyper-V;
- è stato aggiunto driver grafico simpledrm, che utilizza il framebuffer EFI-GOP o VESA fornito dal firmware UEFI o dal BIOS. Lo scopo principale del driver è fornire output grafico nelle fasi iniziali di avvio, prima che sia possibile utilizzare un driver DRM completo. Il driver può anche essere utilizzato come soluzione temporanea per hardware per il quale non sono ancora disponibili driver DRM nativi;
- aggiunta supporto per computer all-in-one Raspberry Pi 400;
- aggiunto il driver dell-wmi-privacy per supportare gli interruttori hardware per la fotocamera e il microfono forniti nei laptop Dell;
- per laptop Lenovo è stato aggiunto interfaccia WMI per modificare i parametri BIOS tramite sysfs /sys/class/firmware-attributes/;
- espansa supporto per dispositivi con interfaccia USB4;
- aggiunta supporto per schede audio e codec AmLogic SM1 TOACODEC, Intel AlderLake-M, NXP i.MX8, NXP TFA1, TDF9897, Rockchip RK817, Qualcomm Quinary MI2 e Texas Instruments TAS2505. Migliorato il supporto audio sui laptop HP e ASUS. Aggiunti patch per ridurre la latenza prima dell'inizio della riproduzione audio su dispositivi con interfaccia USB.
Fonte – opennet.ru.
Fonte: linux.org.ru
