Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.14. Tra le modifiche più significative ci sono: le nuove chiamate di sistema quotactl_fd() e memfd_secret(), la rimozione dei driver ide e raw, un nuovo controllore delle priorità di input/output per cgroup, la modalità di pianificazione dei task SCHED_CORE e l'infrastruttura per la creazione di caricamenti di programmi BPF verificati.
Nella nuova versione sono stati accettati 15883 correzioni da 2002 sviluppatori, la dimensione della patch è di 69 MB (le modifiche hanno interessato 12580 file, sono state aggiunte 861501 righe di codice e rimosse 321654 righe). Circa il 47% di tutte le modifiche presentate in 5.14 è relativo ai driver dei dispositivi, circa il 14% riguarda l'aggiornamento del codice specifico per le architetture hardware, il 13% è collegato allo stack di rete, il 3% ai file system e il 3% ai sottosistemi interni del kernel.
Novità principali:
- Sottosistema disco, I/O e file system
- Per i cgroup è stato implementato un nuovo controllore di priorità input/output — rq-qos, che può gestire la priorità di elaborazione delle richieste ai dispositivi di blocco generate dai partecipanti di ciascun cgroup. Il supporto per il nuovo controllore di priorità è stato aggiunto allo scheduler input/output mq-deadline.
- Nel filesystem ext4 è stata implementata una nuova chiamata ioctl, EXT4_IOC_CHECKPOINT, che forza il salvataggio su disco di tutte le transazioni in attesa dal log e dei relativi buffer, oltre a riscrivere l'area utilizzata dal log nella memoria. Questa modifica è stata preparata nell'ambito di un'iniziativa per prevenire perdite di informazioni dai filesystem.
- In Btrfs sono state apportate ottimizzazioni delle prestazioni: escludendo la registrazione superflua di attributi estesi durante l'esecuzione di fsync, le prestazioni delle operazioni intensive su attributi estesi sono aumentate fino al 17%. Inoltre, durante le operazioni di troncamento che non interessano gli extent, è stata disabilitata la sincronizzazione completa, riducendo il tempo di esecuzione dell'operazione del 12%. È stata aggiunta una configurazione in sysfs per limitare la larghezza di banda I/O durante il controllo del FS. Sono state aggiunte chiamate ioctl per annullare le operazioni di ridimensionamento e rimozione del dispositivo.
- In XFS è stata riprogettata l'implementazione della cache dei buffer, che ora utilizza l'allocazione delle pagine di memoria in modalità batch. È stata migliorata l'efficienza della cache.
- In F2FS, an option for read-only mode has been added, and a cache mode for compressed blocks (compress_cache) has been implemented to enhance random read performance. Support for file compression reflected in memory using mmap() has been added. A new mounting option, nocompress, has been proposed for selectively disabling file compression based on a mask.
- In the exFAT driver, work has been done to improve compatibility with storage from some digital cameras.
- A system call, quotactl_fd(), has been added, allowing quota management not through a special device file but via the specification of a file descriptor associated with the file system for which the quota applies.
- Old drivers for block devices with the IDE interface have been removed from the kernel, which have long been replaced by the libata subsystem.
- The 'raw' driver, which provided unbuffered access to block devices through the /dev/raw interface, has been removed from the kernel. This functionality has long been implemented in applications using the O_DIRECT flag.
- Memoria e servizi di sistema
- Nel pianificatore delle attività è stata implementata una nuova modalità di pianificazione SCHED_CORE, che consente di gestire quali processi possono essere eseguiti insieme su un unico core CPU. A ciascun processo può essere assegnato un identificatore cookie, che definisce l'area di fiducia tra i processi (ad esempio, l'appartenenza a un singolo utente o contenitore). Durante l'esecuzione del codice, il pianificatore può garantire la condivisione di un core CPU solo per i processi associati a un unico proprietario, il che può essere utilizzato per bloccare alcuni attacchi di tipo Spectre prevenendo l'esecuzione in un singolo thread SMT (Hyper Threading) di attività fidate e non fidate.
- Per le cgroup è stata implementata la supporto all'operazione kill, che consente di terminare in una sola volta tutti i processi associati al gruppo (inviando SIGKILL), scrivendo «1» nel file virtuale cgroup.kill.
- Sono state ampliate le funzionalità relative alla gestione delle blocchi "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 della cache CPU. Questi blocchi portano a un significativo calo delle prestazioni, quindi in passato era disponibile la possibilità di terminare forzatamente l'applicazione che aveva causato il blocco. Nella nuova versione è stato aggiunto un parametro della riga di comando del kernel "split_lock_detect=ratelimit:N", che consente di impostare un limite generale sull'intensità delle operazioni di blocco al secondo; superato tale limite, qualsiasi processo che diventa fonte di un blocco split verrà forzatamente fermato per 20 ms anziché terminato.
- Nel controller di bandwidth CFS (CFS bandwidth controller), che determina quanto tempo CPU può essere assegnato a ciascun cgroup, è stata implementata la possibilità di stabilire limiti vincolati da un intervallo di tempo, permettendo una migliore regolazione dei carichi sensibili alla latenza. Ad esempio, impostando cpu.cfs_quota_us a 50000 e cpu.cfs_period_us a 100000, il gruppo di processi avrà la possibilità di utilizzare 50 ms di tempo CPU ogni 100 ms.
- È stata aggiunta l'infrastruttura iniziale per la creazione di caricamenti di programmi BPF, che in seguito consentirà il caricamento solo di programmi BPF firmati con una chiave digitale affidabile.
- È 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à sleep.
- Per l'architettura RISC-V è stato implementato il supporto per le grandi pagine di memoria (Transparent Huge-Pages) e la possibilità di utilizzare il meccanismo KFENCE per rilevare errori nella gestione della memoria.
- Nella chiamata di sistema madvise(), sono stati aggiunti i flag MADV_POPULATE_READ e MADV_POPULATE_WRITE per generare un «page fault» in tutte le pagine di memoria associate a operazioni di lettura o scrittura, senza eseguire realmente la lettura o la scrittura (prefault). L'uso di questi flag può essere utile per ridurre i ritardi durante l'esecuzione del programma, grazie all'esecuzione anticipata del gestore del «page fault» per tutte le pagine non allocate, senza attendere l'accesso effettivo ad esse.
- Nel sistema di unit testing kunit è stata aggiunta la supporto per l'esecuzione dei test in ambienti QEMU.
- Sono stati aggiunti nuovi tracciatori: «osnoise» per monitorare i ritardi nelle applicazioni causati dalla gestione delle interruzioni, e «timerlat» per fornire informazioni dettagliate sui ritardi durante i risvegli a causa del segnale del timer.
- Virtualizzazione e sicurezza
- È stata aggiunta la 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 consente l'uso di un'unica operazione atomica per creare un descrittore di file per il compito isolato e la sua restituzione durante la gestione della chiamata di sistema. L'operazione proposta risolve il problema del'interruzione del gestore nello spazio utente all'arrivo di un segnale.
- È stato aggiunto un nuovo meccanismo per la gestione dei limiti di risorse nello spazio dei nomi degli identificatori utente, che associa contatori rlimit specifici all'utente nel 'user namespace'. Questa modifica risolve il problema dell'applicazione di contatori di risorse condivisi quando un utente avvia processi in contenitori diversi.
- Nel hypervisor KVM per i sistemi ARM64 è stata aggiunta la possibilità di utilizzare nelle macchine virtuali l'estensione MTE (MemTag, Memory Tagging Extension), che consente di associare tag a ogni operazione di allocazione della memoria e di organizzare il controllo della correttezza nell'uso dei puntatori per prevenire l'exploitation di vulnerabilità causate da accessi a blocchi di memoria già liberati, overflow di buffer, accessi prima dell'inizializzazione e utilizzi 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. La tecnologia consente di utilizzare istruzioni specializzate ARM64 per verificare gli indirizzi di ritorno tramite firme digitali, che sono memorizzate nei bit superiori non utilizzati dello stesso puntatore.
- In User-mode Linux è stata aggiunta la supporto per l'uso di driver per dispositivi PCI con un bus PCI virtuale, implementato dal driver PCI-over-virtio.
- Per i sistemi x86 è stata aggiunta la supporto per il dispositivo virtualizzato virtio-iommu, che consente di inviare richieste IOMMU, come ATTACH, DETACH, MAP e UNMAP, attraverso il trasporto virtio senza emulare le tabelle di paging della memoria.
- Per le CPU Intel, dalla famiglia Skylake fino a Coffee Lake, è disabilitato di default l'uso delle estensioni Intel TSX (Transactional Synchronization Extensions), che forniscono strumenti per migliorare le prestazioni delle applicazioni multi-thread attraverso l'eccezione dinamica di operazioni di sincronizzazione superflue. Le estensioni sono disabilitate a causa della possibilità di attacchi Zombieload, che manipolano le perdite di informazioni tramite canali laterali durante il funzionamento del meccanismo di interruzione asincrona (TAA, TSX Asynchronous Abort).
- Sottosistema di rete
- Prosegue l'integrazione nel kernel MPTCP (MultiPath TCP), un'estensione del protocollo TCP per gestire le connessioni TCP con la consegna dei pacchetti simultaneamente su diversi percorsi attraverso diverse interfacce di rete collegate a diversi indirizzi IP. Nella nuova versione è stato aggiunto un meccanismo per definire politiche di hashing del traffico personalizzate per IPv4 e IPv6 (multipath hash policy), che consente di specificare dallo spazio utente quali campi nei pacchetti, inclusi quelli incapsulati, saranno utilizzati per calcolare l'hash che determina la scelta del percorso per il pacchetto.
- Nel trasporto virtuale virtio è stata aggiunta la supporto per i socket SOCK_SEQPACKET (trasmissione ordinata e affidabile dei datagrammi).
- Sono state ampliate le funzionalità del meccanismo dei socket SO_REUSEPORT, che consente a più socket in ascolto di connettersi a una sola porta per ricevere connessioni, distribuendo le richieste in ingresso tra tutti i socket connessi tramite SO_REUSEPORT, semplificando la creazione di applicazioni server multithreading. Nella nuova versione sono stati aggiunti strumenti per trasferire il controllo a un altro socket in caso di errore durante l'elaborazione di una richiesta da parte del socket inizialmente selezionato (risolvendo il problema della perdita di singole connessioni durante il riavvio dei servizi).
- Attrezzature
- Il driver amdgpu supporta le nuove serie di GPU AMD Radeon RX 6000, sviluppate con i nomi in codice "Beige Goby" (Navi 24) e "Yellow Carp", e migliora il supporto per le GPU Aldebaran (gfx90a) e APU Van Gogh. È stata aggiunta la possibilità di lavorare simultaneamente con più pannelli eDP. Per l'APU Renoir è stato implementato il supporto per l'uso di buffer crittografati nella memoria video (TMZ, Trusted Memory Zone). È stata aggiunta la supporto per lo svuotamento a caldo delle schede grafiche (hot-unplug). Per le GPU Radeon RX 6000 (Navi 2x) e le vecchie GPU AMD, è stata attivata di default la gestione del risparmio energetico ASPM (Active State Power Management), che in precedenza era attiva solo per le GPU Navi 1x, Vega e Polaris.
- Per i chip AMD è stato aggiunto il supporto per la memoria virtuale condivisa (SVM, shared virtual memory) basata sul sottosistema HMM (Heterogeneous memory management), che consente di utilizzare dispositivi con propri blocchi di gestione della memoria (MMU, memory management unit) in grado di accedere alla memoria principale. Grazie all'HMM, è possibile organizzare uno spazio di indirizzamento comune tra GPU e CPU, in cui la GPU può accedere alla memoria principale del processo.
- Aggiunta la 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 scheda grafica AMD per migliorare le prestazioni durante il gaming, l'editing video e il rendering 3D.
- Nel driver i915 per le schede grafiche Intel è stata inclusa la supporto per i chip Intel Alderlake P.
- Aggiunto il driver drm/hyperv per l'adattatore grafico virtuale Hyper-V.
- Aggiunta la supporto per il computer all-in-one Raspberry Pi 400.
- Aggiunto il driver dell-wmi-privacy per supportare i pulsanti hardware per la disattivazione della camera e del microfono nei laptop Dell.
- Per i laptop Lenovo è stato aggiunto un'interfaccia WMI per modificare le impostazioni del BIOS tramite sysfs /sys/class/firmware-attributes/.
- Espansa la supporto per dispositivi con interfaccia USB4.
- Aggiunta la 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 i ritardi prima dell'inizio della riproduzione audio sui dispositivi con interfaccia USB.
Fonte: opennet.ru
