Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 5.14. Tra le modifiche più significative: nuove chiamate di sistema quotactl_fd() e memfd_secret(), rimozione dei driver ide e raw, nuovo controllore delle priorità di input/output per cgroup, modalità di pianificazione dei task SCHED_CORE, infrastruttura per la creazione di bootloader di programmi BPF verificati.
La nuova versione include 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 riguardano driver per dispositivi, circa il 14% concerne l'aggiornamento del codice specifico per 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 di disco, input/output e file system
- Per cgroup è stato implementato un nuovo controllore di priorità di input/output — rq-qos, che può gestire la priorità di elaborazione delle richieste agli dispositivi a blocchi generate dai membri di ciascun cgroup. Il supporto per il nuovo controllore di priorità è stato aggiunto al pianificatore di input/output mq-deadline.
- Nel file system ext4 è stata implementata una nuova ioctl-command EXT4_IOC_CHECKPOINT, che forzosamente svuota su disco tutte le transazioni pendenti dal registro e i relativi buffer, e riscrive inoltre l'area usata dal registro nel deposito. La modifica è stata preparata nell'ambito di un'iniziativa per prevenire perdite di informazioni dai file system.
- In Btrfs sono state effettuate ottimizzazioni delle prestazioni: eliminando la registrazione non necessaria degli attributi estesi durante l'esecuzione di fsync, la prestazione delle operazioni intensive con attributi estesi è aumentata fino al 17%. Inoltre, durante le operazioni di troncamento che non interessano gli extents, è stata disabilitata la completa sincronizzazione, riducendo il tempo di esecuzione dell'operazione del 12%. In sysfs è stata aggiunta un'impostazione per limitare la larghezza di banda di input/output durante la verifica del FS. Sono state aggiunte chiamate ioctl per annullare le operazioni di ridimensionamento e rimozione di dispositivi.
- In XFS è stata riprogettata l'implementazione della cache dei buffer, che è stata trasferita all'allocazione di pagine di memoria in modalità batch. È stata migliorata l'efficienza del funzionamento della cache.
- In F2FS è stata aggiunta un'opzione per lavorare in modalità di sola lettura e implementato un modo di caching dei blocchi compressi (compress_cache) per migliorare le performance della lettura casuale. È stata implementata la supporto per la compressione dei file riflessi in memoria tramite l'operazione mmap(). Per disabilitare selettivamente la compressione dei file in base a una maschera, è stata proposta una nuova opzione di montaggio nocompress.
- Nel driver exFAT sono stati effettuati miglioramenti per la compatibilità con i dispositivi di archiviazione di alcune fotocamere digitali.
- È stata aggiunta la chiamata di sistema quotactl_fd(), che permette di gestire le quote non tramite un file di dispositivo speciale, ma specificando un descrittore di file associato al file system a cui si applica la quota.
- Dal kernel sono stati rimossi i vecchi driver per i dispositivi a blocchi con interfaccia IDE, sostituiti da tempo dalla sottosistema libata.
- Dal kernel è stato rimosso il driver "raw", che forniva accesso non buffering ai dispositivi a blocchi tramite l'interfaccia /dev/raw. Questa funzionalità è ormai da tempo realizzata nelle applicazioni tramite il flag O_DIRECT.
- Memoria e servizi di sistema
- Nel pianificatore di attività è stata implementata una nuova modalità di pianificazione SCHED_CORE, che permette 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 (per esempio, appartenenza a un singolo utente o contenitore). Nella pianificazione dell'esecuzione del codice, il pianificatore può garantire la condivisione di un core CPU solo per i processi legati a un unico proprietario, cosa che può essere utilizzata per bloccare alcuni attacchi di tipo Spectre, impedendo l'esecuzione nello stesso thread SMT (Hyper Threading) di attività fidate e non fidate.
- Per cgroup è stata implementata la supporto per l'operazione kill, che consente di terminare in un colpo solo tutti i processi collegati al gruppo (inviare SIGKILL), tramite la scrittura di "1" nel file virtuale cgroup.kill.
- Le funzionalità legate alla gestione delle interruzioni create dai blocchi divisi («split lock»), che si verificano quando si accede ai 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, sono state ampliate. Questi blocchi portano a una significativa riduzione delle prestazioni, motivo per cui in precedenza era possibile forzare l'interruzione dell'applicazione che aveva causato il blocco. Nella nuova versione è stato aggiunto il parametro della riga di comando del kernel «split_lock_detect=ratelimit:N», che consente di definire un limite generale sul numero di operazioni di blocco al secondo, superato il quale qualsiasi processo che diventa sorgente di un blocco diviso verrà forzatamente sospeso per 20 ms.
- Nel controllore di bandwidth CFS (CFS bandwidth controller), che determina quanto tempo di CPU può essere assegnato a ciascun cgroup, è stata implementata la possibilità di definire limiti vincolati a un determinato periodo di validità, consentendo una migliore regolazione dei carichi sensibili ai ritardi. Ad esempio, impostare il valore di cpu.cfs_quota_us a 50000 e cpu.cfs_period_us a 100000 permetterà a un gruppo di processi di utilizzare 50 ms di tempo CPU ogni 100 ms.
- È stata aggiunta l'infrastruttura iniziale per la creazione di loader per programmi BPF, che in seguito consentirà di caricare solo 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, considerando il tempo trascorso dal sistema in modalità sleep.
- Per l'architettura RISC-V è stata implementata la supporto per le grandi pagine di memoria (Transparent Huge-Pages) e la possibilità di utilizzare il meccanismo KFENCE per la rilevazione di 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 per generare «page fault» su tutte le pagine di memoria mappate per operazioni di lettura o scrittura, senza eseguire effettivamente letture o scritture (prefault). L’uso di questi flag può essere utile per ridurre i ritardi nell’esecuzione del programma, grazie all'esecuzione anticipata del gestore del «page fault» per tutte le pagine non allocate, senza aspettare l'effettivo accesso a esse.
- Nel sistema di unit testing kunit è stata aggiunta la supporto per l'esecuzione dei test in un ambiente 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 attivati da segnali di timer.
- Virtualizzazione e sicurezza
- È stata aggiunta la chiamata di sistema memfd_secret(), che consente di creare un'area di memoria privata in uno spazio di indirizzi isolato, visibile solo al processo proprietario, non mappata in altri processi e non accessibile direttamente dal kernel.
- Nel sistema di filtraggio delle chiamate di sistema seccomp, con il trasferimento dei gestori di blocco nello spazio utente, è stata fornita la possibilità di utilizzare un'unica operazione atomica per creare un file descriptor per il compito isolato e restituirlo durante l'elaborazione della chiamata di sistema. L'operazione proposta risolve il problema dell'interruzione del gestore nello spazio utente al ricevimento di un segnale.
- È stato aggiunto un nuovo meccanismo per gestire le limitazioni delle risorse nello spazio dei nomi degli identificatori utente, che collega contatori rlimit separati all'utente nel «user namespace». Questa modifica risolve il problema dell'uso dei contatori delle risorse condivisi quando un utente avvia processi in contenitori diversi.
- Nel hypervisor KVM Per i sistemi ARM64 è stata aggiunta la possibilità di utilizzare l'estensione MTE (MemTag, Memory Tagging Extension) nei sistemi guest, che consente di associare i tag a ciascuna operazione di allocazione della memoria e di organizzare un controllo sulla correttezza dell'uso dei puntatori per bloccare l'exploitation delle vulnerabilità causate da accessi a blocchi di memoria già liberati, sovrascritture di buffer, accessi prima dell'inizializzazione e utilizzo al di fuori del contesto attuale.
- I mezzi di autenticazione dei puntatori (Pointer Authentication) forniti dalla piattaforma ARM64 possono ora essere configurati separatamente per il kernel e lo spazio utente. Questa tecnologia consente l'uso di istruzioni ARM64 specializzate per la verifica degli 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 è stato aggiunto il supporto per il dispositivo paravirtualizzato virtio-iommu, che consente di inviare richieste IOMMU, come ATTACH, DETACH, MAP e UNMAP, attraverso il trasporto virtio senza l'emulazione delle tabelle delle pagine di memoria.
- Per le CPU Intel, dalla famiglia Skylake fino a Coffee Lake, per impostazione predefinita è disabilitato l'uso delle estensioni Intel TSX (Transactional Synchronization Extensions), che forniscono strumenti per migliorare le prestazioni delle applicazioni multithread attraverso l'eccezione dinamica delle operazioni di sincronizzazione non necessarie. Le estensioni sono disabilitate a causa della possibilità di attacchi Zombieload, che manipolano le perdite di informazioni tramite canali laterali, manifestandosi durante il funzionamento del meccanismo di interruzione asincrona delle operazioni (TAA, TSX Asynchronous Abort).
- Sottosistema di rete
- Proseguono le integrazioni nel kernel di MPTCP (MultiPath TCP), l'estensione del protocollo TCP per gestire le connessioni TCP con la consegna dei pacchetti simultaneamente su più percorsi attraverso diversi interfacce di rete, legati a diversi indirizzi IP.. Nella nuova versione è stato aggiunto un meccanismo per definire politiche di hashing personalizzate per il traffico IPv4 e IPv6 (multipath hash policy), permettendo dallo spazio utente di determinare quali campi nei pacchetti, inclusi quelli incapsulati, saranno utilizzati per calcolare l'hash che determina il percorso per il pacchetto.
- Transport virtio ha aggiunto il supporto per i socket SOCK_SEQPACKET (trasmissione ordinata e affidabile di datagrammi).
- Le capacità del meccanismo di socket SO_REUSEPORT sono state ampliate, consentendo a più socket in ascolto di collegarsi a una sola porta per ricevere connessioni distribuendo le richieste in arrivo contemporaneamente a tutti i socket collegati tramite SO_REUSEPORT, facilitando 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 dal socket inizialmente selezionato (risolve il problema della perdita di singole connessioni durante il riavvio dei servizi).
- Apparecchiatura
- Il driver amdgpu ha implementato il supporto per le nuove serie di GPU AMD Radeon RX 6000, sviluppate con i nomi in codice "Beige Goby" (Navi 24) e "Yellow Carp", e migliorato il supporto per la GPU Aldebaran (gfx90a) e l'APU Van Gogh. È stata aggiunta la possibilità di lavorare contemporaneamente con più pannelli eDP. Per l'APU Renoir è stato implementato il supporto per il funzionamento con buffer crittografati nella memoria video (TMZ, Trusted Memory Zone). È stato aggiunto il supporto per lo scollegamento a caldo delle schede grafiche (hot-unplug). Per le GPU Radeon RX 6000 (Navi 2x) e le vecchie GPU AMD è stato abilitato per impostazione predefinita il supporto per il meccanismo di gestione dell'energia ASPM (Active State Power Management), attivato in precedenza 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) sulla base della sottosistema HMM (Heterogeneous memory management), che consente di utilizzare dispositivi con propri blocchi di gestione della memoria (MMU, memory management unit), che possono accedere alla memoria principale. Grazie a HMM è possibile organizzare uno spazio di indirizzamento congiunto tra GPU e CPU, nel quale 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 di CPU e GPU nei laptop con chipset e scheda grafica AMD, per migliorare le prestazioni durante il gioco, l'editing video e il rendering 3D.
- Nel driver i915 per schede grafiche Intel è stato incluso il supporto per i chip Intel Alderlake P.
- È stato aggiunto il driver drm/hyperv per l'adattatore grafico virtuale Hyper-V.
- È stato aggiunto il supporto per il computer all-in-one Raspberry Pi 400.
- È stato aggiunto il driver dell'privacy dell'WMI Dell per il supporto degli interruttori hardware per telecamera e microfono forniti nei laptop Dell.
- Per i laptop Lenovo è stato aggiunto un'interfaccia WMI per modificare i parametri del BIOS tramite sysfs /sys/class/firmware-attributes/.
- È stato ampliato il supporto per i dispositivi con interfaccia USB4.
- È stato aggiunto il supporto per le schede audio e i codec AmLogic SM1 TOACODEC, Intel AlderLake-M, NXP i.MX8, NXP TFA1, TDF9897, Rockchip RK817, Qualcomm Quinary MI2 e Texas Instruments TAS2505. È stato migliorato il supporto audio sui laptop HP e ASUS. Sono stati aggiunti patch per ridurre i ritardi all'inizio della riproduzione audio sui dispositivi con interfaccia USB.
Fonte: opennet.ru
