Dopo due mesi di sviluppo, Linus Torvalds rilascio del kernel . Tra le modifiche più evidenti: nuova implementazione del file system exFAT, modulo bareudp per la creazione di tunnel UDP, protezione basata su autenticazione dei puntatori per ARM64, possibilità di allegare programmi BPF ai gestori LSM, nuova implementazione di Curve25519, rilevatore "split-lock", compatibilità BPF con PREEMPT_RT, rimozione del limite di 80 caratteri per la lunghezza delle righe nel codice, considerazione delle temperature della CPU nell'allocatore di compiti, possibilità di utilizzare clone() per generare processi in un altro cgroup, protezione dalla scrittura in memoria tramite userfaultfd.
Nella nuova versione sono stati accettati 15033 correzioni da 1961 sviluppatori,
la dimensione della patch è di 39 MB (le modifiche hanno riguardato 11590 file, sono state aggiunte 570560 righe di codice,
sono state rimosse 297401 righe). Circa il 41% di tutte le modifiche presentate in 5.7
è relativo ai driver dei dispositivi, circa il 16% delle modifiche è
l'aggiornamento del codice specifico per le architetture hardware, il 13%
relativo allo stack di rete, il 4% ai file system e il 4% a interni.
interni del kernel.
:
- Sottosistema di disco, input/output e file system
- È stata aggiunta una nuova implementazione del driver exFAT, sulla base di codice attuale "sdfat" (2.x), sviluppata da Samsung per i propri smartphone Android. Il driver precedentemente aggiunto nel kernel era basato su codice obsoleto di Samsung (versione 1.2.9) e presentava prestazioni inferiori rispetto al nuovo driver di circa il 10%. Ricordiamo che l'aggiunta del supporto exFAT nel kernel è diventata possibile dopo che Microsoft ha reso pubbliche le specifiche e ha fornito la possibilità di utilizzare senza compenso i brevetti su exFAT in Linux.
- In Btrfs è stato implementato un nuovo comando ioctl() — BTRFS_IOC_SNAP_DESTROY_V2, che consente di eliminare un sottodirectory in base al suo identificatore. È stato garantito il supporto completo per il cloning di estensioni inline. È stata ampliata la numero di punti di annullamento delle operazioni di ridistribuzione, il che ha permesso di ridurre i lunghi tempi di attesa durante l'esecuzione del comando 'balance cancel'. È stata accelerata la determinazione dei rimandi agli estremi (ad esempio, il tempo di esecuzione di uno scenario di test è stato ridotto da un'ora a pochi minuti). È stata aggiunta la possibilità di allegare a ciascun inode dell'albero delle estensioni dei file. È stata rielaborata la schematica di blocco utilizzata durante la scrittura in sottodirectory e durante l'esclusione di NOCOW. È stata aumentata l'efficienza dell'esecuzione di fsync per le aree.
- In XFS è migliorato il controllo dei metadati e l'esecuzione di fsck per le partizioni attive. È stata proposta una libreria per la ricostruzione delle strutture btree, che in futuro sarà utilizzata per la revisione di xfs_repair e per implementare la possibilità di recupero senza smontare la partizione.
- In CIFS è stata aggiunta la supporto sperimentale per la collocazione della partizione di swap negli archivi SMB3. È stata implementata l'estensione POSIX in readdir, specificata nella documentazione SMB3.1.1. È stata migliorata la velocità di scrittura per le pagine di dimensione 64KB attivando la modalità cache=strict e utilizzando versioni del protocollo 2.1+.
- Il file system EXT4 è stato convertito da bmap e iopoll all'uso di iomap.
- In F2FS è stata implementata un'opzione di supporto per la compressione dei dati utilizzando l'algoritmo zstd. Per impostazione predefinita, viene utilizzato l'algoritmo LZ4 per la compressione. È stato aggiunto il supporto per il comando "chattr -c commit". È stata garantita la visualizzazione del tempo di montaggio. È stata aggiunta l'ioctl F2FS_IOC_GET_COMPRESS_BLOCKS per ottenere informazioni sul numero di blocchi compressi. Sono stati forniti dati sulla compressione, visualizzati tramite statx.
- Nel file system Ceph è stata aggiunta la possibilità di eseguire localmente operazioni di creazione e rimozione (unlink) di file senza attendere una risposta dal server (funzionamento in modalità asincrona). Questa modifica, ad esempio, consente di aumentare notevolmente la velocità durante l'uso dell'utilità rsync.
- In OVERLAYFS è stata aggiunta la possibilità di utilizzare virtiofs come file system di livello superiore.
- il codice di attraversamento dei percorsi in VFS, ristrutturato il codice di analisi dei link simbolici e unificato il passaggio attraverso i punti di montaggio.
- Nel sottosistema scsi gli utenti non privilegiati possono eseguire comandi ZBC.
- In dm_writecache è stata implementata la possibilità di svuotare gradualmente la cache basata sul parametro max_age, che definisce il tempo massimo di vita di un blocco.
- In dm_integrity è stato introdotto il supporto per l'operazione "discard".
- In null_blk è stato introdotto il supporto per la simulazione di errori per testare le interruzioni durante il collaudo.
- è stata introdotta la possibilità di inviare notifiche udev relative alla modifica della dimensione del dispositivo a blocchi.
- Sottosistema di rete
- In Netfilter sono stati inclusi , che accelerano notevolmente l'elaborazione di grandi elenchi di corrispondenza (nftables set), dove è necessaria la verifica della combinazione di subnet, porte di rete, protocollo e indirizzi MAC.
Ottimizzazioni nel modulo nft_set_pipapo (PIle PAcket POlicies), che affronta il compito di abbinare il contenuto del pacchetto agli intervalli di stato dei campi utilizzati nelle regole di filtraggio, come intervalli IP e porte di rete (nft_set_rbtree e nft_set_hash manipolano l'abbinamento degli intervalli e la corrispondenza diretta dei valori). La versione pipapo vettorializzata utilizzando istruzioni AVX2 a 256 bit su un sistema con processore AMD Epyc 7402 ha mostrato un incremento delle prestazioni del 420% durante l'analisi di 30.000 record contenenti coppie porta-protocollo. L'incremento nell'abbinare una coppia di sottorete e numero di porta durante l'analisi di 1.000 record è stato del 87% per IPv4 e del 128% per IPv6. - il modulo bareudp, che consente di incapsulare vari protocolli L3 in un tunnel UDP, come MPLS, IP e NSH.
- Continua l'integrazione dei componenti MPTCP (MultiPath TCP), un'estensione del protocollo TCP per gestire le connessioni TCP con la consegna dei pacchetti contemporaneamente tramite più percorsi attraverso diverse interfacce di rete legate a diversi indirizzi IP.
- supporto per meccanismi di accelerazione hardware per l'incapsulamento dei frame Ethernet in 802.11 (Wi-Fi).
- Quando un dispositivo viene spostato da un namespace della sottosistema di rete a un altro, è stata garantita la correzione dei diritti di accesso e del proprietario dei relativi file in sysfs.
- È stata fornita la possibilità di utilizzare il flag SO_BINDTODEVICE per gli utenti che non hanno diritti di root.
- È stata accettata la terza parte delle patch che traducono gli strumenti ethtool da ioctl() all'uso dell'interfaccia netlink. La nuova interfaccia semplifica l'aggiunta di estensioni, migliora la gestione degli errori, consente di inviare notifiche in caso di modifica dello stato, facilita l'interazione tra il kernel e l'utente e riduce il numero di liste nominate da sincronizzare.
- È stata aggiunta la possibilità di utilizzare acceleratori hardware speciali per eseguire operazioni di tracciamento delle connessioni.
- In netfilter un hook per collegare i classificatori dei pacchetti in uscita (egress), che ha completato un hook precedentemente esistente per i pacchetti in entrata (ingress).
- In Netfilter sono stati inclusi , che accelerano notevolmente l'elaborazione di grandi elenchi di corrispondenza (nftables set), dove è necessaria la verifica della combinazione di subnet, porte di rete, protocollo e indirizzi MAC.
- Virtualizzazione e sicurezza
- è stata aggiunta un'implementazione hardware per l'autenticazione dei puntatori (), utilizzando istruzioni specializzate della CPU ARM64 per proteggersi da attacchi che utilizzano tecniche di programmazione orientata al ritorno (ROP), in cui l'attaccante non tenta di posizionare il proprio codice in memoria, ma opera su porzioni già esistenti di istruzioni macchina nelle librerie caricate, che terminano con un'istruzione di ritorno del controllo. La protezione consiste nell'uso di firme digitali per verificare gli indirizzi di ritorno a livello di kernel. La firma è memorizzata nei bit superiori non utilizzati del puntatore stesso. A differenza delle implementazioni software, la creazione e la verifica delle firme digitali avviene tramite istruzioni specializzate della CPU.
- la possibilità di proteggere un'area di memoria da scritture tramite la chiamata di sistema userfaultfd(), destinata a gestire i page fault (accesso a pagine di memoria non allocate) nello spazio utente. L'idea è quella di utilizzare userfaultfd() anche per monitorare le violazioni di accesso a pagine contrassegnate come protette da scrittura e chiamare un gestore che può reagire a tali tentativi di scrittura (ad esempio, per gestire le modifiche durante la creazione di live snapshot dei processi in esecuzione, fissare lo stato durante il salvataggio di dump di memoria su disco, implementare la memoria condivisa, monitorare le modifiche in memoria). La funzionalità all'uso di mprotect() in combinazione con il gestore di segnali SIGSEGV, ma funziona significativamente più velocemente.
- In SELinux è dichiarato obsoleto il parametro «checkreqprot», che consente di disattivare la verifica della protezione della memoria durante l'elaborazione delle regole (consentiva l'uso di aree di memoria eseguibili, indipendentemente dalle prescrizioni stabilite nelle regole). I collegamenti simbolici in kernfs sono autorizzati ad ereditare il contesto delle directory genitore.
- Fanno parte modulo , che consente di collegare programmi BPF a qualsiasi hook LSM nel kernel. La modifica consente di creare moduli LSM (Linux Security Module) sotto forma di programmi BPF per affrontare questioni di audit e controllo mandatorio degli accessi.
- ottimizzazione delle prestazioni di /dev/random grazie alla trasmissione batch dei valori CRNG invece di singole chiamate alle istruzioni RNG. Migliorato il funzionamento di getrandom e /dev/random sui sistemi ARM64, che forniscono istruzioni RNG.
- Implementazione della curva ellittica Curve25519 sulla variante della libreria , per la quale dimostrazione matematica della verifica formale dell'affidabilità.
- meccanismo di informazione sulle pagine di memoria libere. Grazie a questo meccanismo, i sistemi guest possono fornire alla sistema host informazioni sulle pagine che non sono più in uso, e le pagine possono essere recuperate dal host.
- In vfio/pci supporto SR-IOV (Single-Root I/O Virtualization).
- Memoria e servizi di sistema
- Da 80 a 100 caratteri limite sulla lunghezza massima della stringa nei testi sorgente. Gli sviluppatori sono comunque incoraggiati a rimanere all'interno dei 80 caratteri per riga, ma ora non è più un limite rigido. Inoltre, superare il limite sulla dimensione della stringa ora comporterà l'emissione di un avviso durante la compilazione solo se lo strumento checkpatch viene eseguito con l'opzione «—strict». La modifica consentirà di non distrarre gli sviluppatori e con spazi e sentirsi più a proprio agio nell'allineamento del codice, e anche una eccessiva suddivisione delle righe, con la comprensione del codice e la ricerca.
- supporto per la modalità di avvio mista EFI, che consente di avviare un kernel a 64 bit da un firmware a 32 bit in esecuzione su una CPU a 64 bit senza l'uso di un bootloader specializzato.
- sistema di rilevamento e debug dei blocchi divisi (««), che si verificano quando si accede a dati non allineati in memoria a causa del fatto che, nell'esecuzione di un'istruzione atomica, i dati attraversano due linee di cache della CPU. Tali blocchi portano a una riduzione significativa delle prestazioni (fino a 1000 cicli più lenti rispetto a un'operazione atomica con dati che rientrano in una sola linea di cache). A seconda del parametro di avvio «split_lock_detect», il kernel può rilevare tali blocchi al volo e generare avvisi o inviare il segnale SIGBUS all'applicazione che ha causato il blocco.
- Nell'allocazione del piano di lavoro è garantito il monitoraggio delle metriche dei sensori di temperatura () e implementato il monitoraggio del surriscaldamento durante l'assegnazione dei compiti. Utilizzando le statistiche fornite, il gestore della temperatura (thermal governor) può regolare la frequenza massima della CPU in caso di surriscaldamento, e ora lo scheduler tiene conto della riduzione della potenza di calcolo a causa di tale abbassamento della frequenza durante la pianificazione dell'esecuzione dei compiti (precedentemente, lo scheduler reagiva al cambiamento di frequenza con un certo ritardo, prendendo decisioni per un certo periodo su supposizioni sovrastimate riguardo alle risorse di calcolo disponibili).
- Nello scheduler sono coinvolti del monitoraggio del carico, che consentono di valutare correttamente il carico, indipendentemente dalla frequenza operativa corrente della CPU. Questa modifica consente di prevedere in modo più preciso il comportamento dei compiti in condizioni di variazione dinamica della tensione e della frequenza della CPU. Ad esempio, un compito che consumava 1/3 delle risorse della CPU a una frequenza di 1000 MHz, consumerà 2/3 delle risorse se la frequenza sarà ridotta a 500 MHz, il che in passato creava false impressioni di funzionamento a piena potenza (ossia, i compiti sembravano più grandi solo a causa della riduzione della frequenza, il che portava a decisioni errate nel gestore cpufreq di schedutil).
- Il driver Intel P-state, responsabile della scelta delle modalità di prestazione, è stato tradotto per utilizzare .
- È stata implementata la possibilità di utilizzare il sottosistema BPF quando il kernel funziona in modalità tempo reale (PREEMPT_RT). In precedenza, con l'attivazione di PREEMPT_RT, era richiesto disabilitare BPF.
- È stato aggiunto un nuovo tipo di programmi BPF — BPF_MODIFY_RETURN, che possono essere allegati a funzioni nel kernel e modificare il valore restituito da queste funzioni.
- È stata aggiunta l'uso della chiamata di sistema clone3() per creare un processo in cgroup, differente dal cgroup del genitore, il che consente al processo genitore di applicare restrizioni e abilitare il monitoraggio subito dopo la creazione di un nuovo processo o thread. Ad esempio, il gestore dei servizi può direttamente allocare nuovi servizi in cgroup separati, e i nuovi processi, una volta collocati in cgroup 'congelati', verranno immediatamente arrestati.
- in Kbuild supporto per la variabile di ambiente 'LLVM=1' per passare all'istrumentazione Clang/LLVM durante la compilazione del kernel. Sono stati elevati i requisiti per la versione di binutils (2.23).
- In debugfs è stata aggiunta una sezione /sys/kernel/debug/kunit/ con i risultati dei test kunit.
- È stato aggiunto il parametro di caricamento del nucleo pm_debug_messages (analogo a /sys/power/pm_debug_messages), che include l'uscita delle informazioni di debug sul funzionamento del sistema di gestione dell'alimentazione (utile per il debug di problemi con le modalità di sospensione e attesa).
- Nell'interfaccia di input/output asincrono aggiunto il supporto per e .
- È stato migliorato il profilo cgroup utilizzando gli strumenti perf. In precedenza, perf poteva profilare i task solo in un determinato cgroup e non poteva sapere a quale cgroup appartenesse il campione corrente. Ora perf riceve informazioni sul cgroup per ogni campione, il che consente di profilare più di un cgroup e applicare un ordinamento per
cgroup nei report. - In cgroupfs, il pseudo-FS per la gestione dei cgroups, è stata aggiunta la supporto per gli attributi estesi (xattrs) attraverso i quali, ad esempio, è possibile lasciare ulteriori informazioni per i gestori nello spazio utente.
- Nel cgroup memory controller è stata aggiunta la supporto per la protezione ricorsiva del valore 'memory.low', che regolamenta la quantità minima di RAM fornita ai membri del gruppo. Quando viene montata una gerarchia cgroup con l'opzione 'memory_recursiveprot', il valore 'memory.low' impostato per i nodi più bassi verrà automaticamente distribuito a tutti i nodi figli.
- il framework Uacce (Unified/User-space-access-intended Accelerator Framework) per la condivisione degli indirizzi virtuali (SVA, Shared Virtual Addressing) tra CPU e dispositivi periferici, consente agli acceleratori hardware di accedere alle strutture dati nel CPU principale.
- Architetture hardware
- Per l'architettura ARM è stata implementata la possibilità di rimuovere memoria a caldo.
- Per l'architettura RISC-V è stata aggiunta la supporto per il collegamento e la rimozione a caldo della CPU (CPU hotplug). Per i RISC-V a 32 bit è stato implementato eBPF JIT.
- È stata rimossa la possibilità di utilizzare sistemi ARM a 32 bit per eseguire ambienti guest KVM.
- È stata rimossa l'implementazione 'fittizia' di NUMA per l'architettura s390, per la quale non sono stati trovati scenari d'uso che consentano di ottenere un aumento delle prestazioni.
- Per ARM64 è stata aggiunta la supporto per l'estensione AMU (Activity Monitors Unit), definita in ARMv8.4 e che fornisce contatori di prestazioni utilizzati per calcolare i coefficienti di correzione della scalabilità della frequenza nel pianificatore dei task.
- Apparecchiatura
- supporto per dispositivi vDPA, che utilizzano un canale di trasferimento dati conforme alle specifiche virtio. I dispositivi vDPA possono essere sia hardware fisicamente connesso che dispositivi virtuali emulati a livello software.
- Nella sottosistema GPIO nuovo comando ioctl() per monitorare le modifiche, che consente di informare il processo su qualsiasi cambiamento di stato di una linea GPIO. Come esempio dell'uso del nuovo comando l'utilità gpio-watch.
- Nel driver DRM i915 per schede grafiche Intel aggiunta di supporto predefinito per i chip Tigerlake («Gen12») e supporto iniziale per il controllo della retroilluminazione OLED. Migliorato il supporto per i chip Ice Lake, Elkhart Lake, Baytrail e Haswell.
- Nel driver amdgpu la possibilità di caricare firmware nel chip USBC per ASIC. Migliorato il supporto per i chip AMD Ryzen 4000 «Renoir». Introdotto il controllo dei pannelli OLED. Fornita la visualizzazione dello stato del firmware in debugfs.
- Nel driver DRM vmwgfx per i sistemi di virtualizzazione VMware è stata aggiunta la possibilità di utilizzare OpenGL 4 nei sistemi guest (in precedenza era supportato OpenGL 3.3).
- Aggiunto un nuovo driver DRM tidss per il sistema di visualizzazione della piattaforma TI Keystone.
- Aggiunti driver per pannelli LCD: Feixin K101 IM2BA02, Samsung s6e88a0-ams452ef01, Novatek NT35510, Elida KD35T133, EDT, NewEast Optoelectronics WJFH116008A, Rocktech RK101II01D-CT, Frida FRD350H54004.
- Nel sistema di gestione dell'alimentazione supporto per la piattaforma Intel Jasper Lake (JSL) basata su Atom.
- Aggiunto supporto per il laptop Pinebook Pro basato su Rockchip RK3399, tablet Pine64 PineTab e smartphone basato su Allwinner A64.
- Aggiunto supporto per nuovi codec audio e chip:
Amlogic AIU, Amlogic T9015, Texas Instruments TLV320ADCX140, Realtek RT5682, ALC245, Broadcom BCM63XX I2S, Maxim MAX98360A, Presonus Studio 1810c, MOTU MicroBook IIc. - Aggiunto supporto per schede ARM e piattaforme Qualcomm Snapdragon 865 (SM8250), IPQ6018, NXP i.MX8M Plus, Kontron «sl28», 11 varianti della scheda i.MX6 TechNexion Pico, tre nuove varianti Toradex Colibri, Samsung S7710 Galaxy Xcover 2 basato su ST-Ericsson u8500, DH Electronics DHCOM SoM e PDK2, Renesas M3ULCB, Hoperun HiHope, Linutronix Testbox v2, PocketBook Touch Lux 3.
Fonte: opennet.ru
