După două luni de dezvoltare, Linus Torvalds lansarea nucleului . Printre cele mai notabile modificări se numără: o nouă implementare a sistemului de fișiere exFAT, modulul bareudp pentru crearea de tuneluri UDP, protecția bazată pe autentificarea pointerilor pentru ARM64, posibilitatea de a atașa programe BPF la handlerii LSM, o nouă implementare a Curve25519, detectorul „split-lock”, compatibilitatea BPF cu PREEMPT_RT, eliminarea limitării de 80 de caractere pentru stringuri în cod, luarea în considerare a temperaturii CPU în planificatorul de sarcini, posibilitatea utilizării clone() pentru crearea de procese în alt cgroup, protecția împotriva scrierii în memorie folosind userfaultfd.
În noua versiune au fost incluse 15033 de corecții de la 1961 de dezvoltatori,
dimensiunea patch-ului fiind de 39 MB (modificările au afectat 11590 de fișiere, adăugând 570560 de linii de cod,
și eliminând 297401 de linii). Aproximativ 41% din toate modificările prezentate în 5.7
sunt legate de driverele de dispozitive, aproximativ 16% din modificări au
de a face cu actualizarea codului specific arhitecturilor hardware, 13%
legătură cu stiva de rețea, 4% cu sistemele de fișiere și 4% cu internele.
interne ale nucleului.
:
- Subsistemul de disc, I/O și sistemele de fișiere
- A fost adăugată o nouă implementare a driverului exFAT, pe codul sursă actual «sdfat» (2.x), dezvoltat de Samsung pentru smartphone-urile sale Android. Driverul adăugat anterior în kernel se baza pe un cod învechit de la Samsung (versiunea 1.2.9) și rămânea în urmă în performanță față de noul driver cu aproximativ 10%. Să reamintim că adăugarea suportului pentru exFAT în kernel a fost posibilă după ce compania Microsoft a făcut publice specificațiile și a oferit posibilitatea de utilizare gratuită a brevetelor pentru exFAT în Linux.
- În Btrfs a fost implementat un nou comandament ioctl() — BTRFS_IOC_SNAP_DESTROY_V2, care permite eliminarea unui subdirector după identificatorul său. A fost asigurată suportul complet pentru clonarea extințiilor inline. A fost extins numărul punctelor de anulare pentru operațiunile de redistribuire, ceea ce a permis reducerea timpilor de așteptare în executarea comenzii ‘balance cancel’. A fost accelerată determinarea referințelor inverse la extinții (de exemplu, timpul de execuție al unui scenariu de testare a fost redus de la o oră la câteva minute). A fost adăugată posibilitatea de a atașa la fiecare inode al arborelui de extinții al fișierului. A fost reproiectată schema de blocare utilizată pentru scrierea în subdirectoare și pentru excluziunea NOCOW. A fost îmbunătățită eficiența execuției fsync pentru intervale.
- În XFS, a fost îmbunătățită verificarea metadatelor și executarea fsck pentru partițiile active. A fost propusă o bibliotecă pentru reconstruirea structurilor btree, care va fi utilizată în viitor pentru refacerea xfs_repair și implementarea opțiunii de recuperare fără deconectarea partiției.
- În CIFS, a fost adăugată suport experimental pentru plasarea partiției de swap în stocările SMB3. Au fost implementate extensii POSIX în readdir, definite în specificația SMB3.1.1. Performanța scrierii pentru paginile de 64KB a fost crescută atunci când este activat modul cache=strict și se folosesc versiunile protocolului 2.1+.
- FS EXT4 a fost transformată din bmap și iopoll în utilizarea iomap.
- În F2FS, a fost implementat suport opțional pentru compresia datelor folosind algoritmul zstd. Implicit, pentru compresie este utilizat algoritmul LZ4. A fost adăugată suport pentru comanda „chattr -c commit”. A fost asigurată afișarea timpului de montare. A fost adăugat ioctl F2FS_IOC_GET_COMPRESS_BLOCKS pentru a obține informații despre numărul de blocuri compressate. Au fost adăugate date despre compresie, afișate prin statx.
- În sistemul de fișiere Ceph a fost adăugată posibilitatea de a executa local operațiuni de creare și ștergere (unlink) a fișierelor fără a aștepta răspunsul serverului (funcționare în mod asincron). Schimbarea, de exemplu, permite creșterea semnificativă a performanței în utilizarea utilitarului rsync.
- În OVERLAYFS, a fost adăugată posibilitatea de a utiliza virtiofs ca FS de nivel superior.
- codul de traversare a căilor în VFS, a fost refăcut codul de analiză a link-urilor simbolice și a fost unificată traversarea punctelor de montare.
- În subsistemul scsi, utilizatorilor nepăgubiți executarea comenzilor ZBC.
- În dm_writecache posibilitatea de a curăța gradual cache-ul pe baza parametrului max_age, care definește timpul maxim de viață al unui bloc.
- În dm_integrity suport pentru operația „discard”.
- În null_blk suport pentru simularea erorilor pentru simularea defectelor în timpul testării.
- posibilitatea de a trimite notificări udev cu privire la modificarea dimensiunii dispozitivului bloc.
- Subsystema de rețea
- În Netfilter au fost incluse , accelerând semnificativ procesarea listelor mari de corelare (nftables set), în care este necesară verificarea combinației dintre subneturi, porturi de rețea, protocol și adrese MAC.
Optimizări În modulul nft_set_pipapo (PIle PAcket POlicies), care rezolvă problema corelării conținutului pachetului cu intervalele de stări ale câmpurilor aplicate în regulile de filtrare, cum ar fi intervalele IP și porturile de rețea (nft_set_rbtree și nft_set_hash manipulează corelarea intervalelor și reflectarea directă a valorilor). Versiunea pipapo vectorizată cu instrucțiuni AVX2 de 256 de biți pe un sistem cu procesor AMD Epyc 7402 a arătat o creștere a performanței de 420% la analiza a 30.000 de înregistrări, incluzând ansambluri port-protocol. Creșterea corelării ansamblului între subnet și numărul portului la analiza a 1000 de înregistrări a fost de 87% pentru IPv4 și 128% pentru IPv6. - Modulul bareudp, care permite encapsularea în tunel UDP a diferitelor protocoale L3, cum ar fi MPLS, IP și NSH.
- Continua integrarea componentelor MPTCP (MultiPath TCP), o extensie a protocolului TCP pentru organizarea funcționării conexiunii TCP cu livrarea pachetelor simultan pe mai multe rute prin diferite interfețe de rețea, legate de adrese IP diferite.
- Suport pentru mecanismele de accelerare hardware pentru encapsularea cadrelor Ethernet în 802.11 (Wi-Fi).
- Atunci când un dispozitiv este mutat dintr-un spațiu de nume al subsistemului rețelei (network namespace) în altul, este asigurată corectarea drepturilor de acces și a proprietarului fișierelor corespunzătoare în sysfs.
- A fost oferită posibilitatea utilizării flag-ului SO_BINDTODEVICE de către utilizatorii care nu dețin privilegii de root.
- A fost acceptată a treia parte a patch-urilor, care traduc instrumentele ethtool de la ioctl() la utilizarea interfeței netlink. Noua interfață simplifică adăugarea de extensii, îmbunătățește gestionarea erorilor, permite trimiterea de notificări cu privire la schimbarea stării, simplifică interacțiunea între kernel și spațiul utilizatorului și reduce numărul listelor nominalizate care trebuie sincronizate.
- A fost adăugată posibilitatea utilizării acceleratorilor hardware speciali pentru efectuarea operațiunilor de urmărire a conexiunilor.
- În netfilter hook pentru conectarea clasificatoarelor de pachete ieșite (egress), completând hook-ul existent anterior pentru pachetele de intrare (ingress).
- În Netfilter au fost incluse , accelerând semnificativ procesarea listelor mari de corelare (nftables set), în care este necesară verificarea combinației dintre subneturi, porturi de rețea, protocol și adrese MAC.
- Virtualizare și securitate
- A fost adăugată o implementare hardware a autentificării pointerilor (), care utilizând instrucțiuni CPU ARM64 specializate pentru a proteja împotriva atacurilor care folosesc tehnici de programare orientată spre retur (ROP), în care atacatorul nu încearcă să plaseze codul său în memorie, ci operează cu bucăți existente de instrucțiuni mașină din bibliotecile încărcate, terminând cu o instrucțiune de retur al controlului. Protecția constă în utilizarea semnăturilor digitale pentru a verifica adresele de retur la nivel de nucleu. Semnătura este stocată în biții superiori neutilizați ai pointerului. Spre deosebire de implementările software, crearea și verificarea semnăturilor digitale se face cu ajutorul unor instrucțiuni speciale ale CPU.
- capacitatea de a proteja zona de memorie împotriva scrierii prin intermediul apelului de sistem userfaultfd(), destinat gestionării erorilor de pagină (accesarea paginilor de memorie nealocate) în spațiul utilizatorului. Ideea este de a folosi userfaultfd() și pentru a urmări violările accesului la paginile marcate ca protejate împotriva scrierii, și de a apela un handler care poate reacționa la astfel de încercări de scriere (de exemplu, pentru a gestiona modificările în procesul de creare a instantaneelor live ale proceselor în execuție, a salva starea în momentul în care se descarcă dump-uri de memorie pe disc, implementarea memoriei partajate, urmărirea modificărilor din memorie). Funcționalitatea cu utilizarea mprotect() în combinație cu handlerul semnalului SIGSEGV, dar funcționează semnificativ mai rapid.
- În SELinux, parametrul „checkreqprot” a fost declarat învechit, permițând dezactivarea verificării protecției memoriei în procesul de gestionare a regulilor (permițând utilizarea zonelor de memorie executabile, indiferent de cerințele specificate în reguli). Legăturile simbolice în kernfs au fost autorizate să moștenească contextul directoarelor părinte.
- Include modul , care permite atașarea programelor BPF la orice hook-uri LSM din nucleu. Schimbarea permite crearea de module LSM (Linux Security Module) sub formă de programe BPF pentru a aborda sarcini de audit și control de acces mandat.
- optimizarea performanței /dev/random prin transmiterea în loturi a valorilor CRNG în loc de apeluri individuale ale instrucțiunilor RNG. A fost îmbunătățită funcționarea getrandom și /dev/random pe sistemele ARM64 care oferă instrucțiuni RNG.
- Implementarea curbei eliptice Curve25519 pe o variantă din biblioteca , pentru care demonstrarea matematică a verificării formale a fiabilității.
- mecanism de informare cu privire la paginile libere din memorie. Prin acest mecanism, sistemele gazdă pot transmite sistemului gazdă informații despre paginile care nu mai sunt utilizate, iar sistemul gazdă poate recupera acele pagini.
- în vfio/pci suport pentru SR-IOV (Single-Root I/O Virtualization).
- Memorie și servicii de sistem
- De la 80 la 100 de caractere limita maximă a lungimii unei linii în textele sursă. În acest context, dezvoltatorii sunt în continuare încurajați să se încadreze în limita de 80 de caractere pe linie, dar aceasta nu mai este o restricție strictă. În plus, depășirea limitei lungimii unei linii va duce la un mesaj de avertizare în timpul compilării doar dacă utilitarul checkpatch este rulat cu opțiunea „—strict”. Această modificare va permite dezvoltatorilor să nu fie distrași de spații și să se simtă mai liberi în alinierea codului, precum și fragmentarea excesivă a liniilor, înțelegerea codului și căutarea.
- suport pentru modul mixt de boot EFI, care permite pornirea unui nucleu pe 64 de biți dintr-o firmware pe 32 de biți, executat pe un CPU pe 64 de biți.
- sistem de detectare și depanare a blocajelor divizate („„), care apar atunci când se accesează date nealiniate în memorie, din cauza faptului că, în timpul execuției unei instrucțiuni atomice, datele traversează două linii de cache ale CPU-ului. Astfel de blocaje duc la o scădere semnificativă a performanței (cu 1000 de cicluri mai lent decât o operație atomică cu datele care se află într-o singură linie de cache). În funcție de parametrul de boot „split_lock_detect”, nucleul poate detecta în timp real aceste blocaje și poate genera mesaje de avertizare sau trimite un semnal SIGBUS aplicației care a cauzat blocajul.
- În planificatorul de sarcini, este asigurat urmărirea indicatorilor senzorilor de temperatură () și a fost implementat monitorizarea supraîncălzirii atunci când se plasează sarcini. Folosind statisticile furnizate, gestionarul de temperatură (thermal governor) poate ajusta frecvența maximă a CPU-ului în caz de supraîncălzire, iar planificatorul de sarcini ia acum în considerare reducerea puterii de calcul din cauza reducerii frecvenței atunci când planifică execuția sarcinilor (anterior, planificatorul reacționa la schimbările de frecvență cu o întârziere, făcând inițial decizii bazate pe estimări exagerate ale resurselor de calcul disponibile).
- În planificatorul de sarcini sunt implicate ai monitorizării sarcinii, ce permit evaluarea corectă a sarcinii, indiferent de frecvența actuală de funcționare a CPU-ului. Schimbarea permite previziuni mai precise ale comportamentului sarcinilor în condiții de variație dinamică a tensiunii și frecvenței CPU-ului. De exemplu, o sarcină care consuma 1/3 din resursele CPU la o frecvență de 1000 MHz va consuma 2/3 din resurse la reducerea frecvenței la 500 MHz, ceea ce anterior crea o presupunere falsă despre funcționarea la capacitate maximă (adică, sarcinile pentru planificator păreau mai mari doar din cauza reducerii frecvenței, ceea ce ducea la luarea unor decizii greșite în schedutil cpufreq governor).
- Driverul Intel P-state, responsabil pentru alegerea modurilor de performanță, a fost actualizat pentru a utiliza .
- S-a implementat posibilitatea utilizării subsistemului BPF în modul de funcționare a nucleului în timp real (PREEMPT_RT). Anterior, activarea PREEMPT_RT impunea dezactivarea BPF.
- A fost adăugat un nou tip de programe BPF — BPF_MODIFY_RETURN, care pot fi atașate la funcțiile din nucleu și pot modifica valoarea returnată de această funcție.
- Adăugat utilizarea apelului de sistem clone3() pentru a crea un proces într-un cgroup diferit de cgroup-ul părinte, permițând astfel procesului părinte să aplice restricții și să activeze contabilizarea imediat după generarea unui nou proces sau fir. De exemplu, managerul de servicii poate aloca direct servicii noi în cgroup-uri distincte, iar noile procese care sunt încadrate în cgroup-uri 'înghețate' vor fi imediat oprite.
- în Kbuild suport pentru variabila de mediu 'LLVM=1' pentru a comuta la instrumentul Clang/LLVM în timpul compilării nucleului. Cerințele pentru versiunea binutils (2.23) au fost ridicate.
- În debugfs a fost adăugată o secțiune /sys/kernel/debug/kunit/ cu rezultatele testelor kunit.
- A fost adăugat parametrul de încărcare a nucleului pm_debug_messages (analog /sys/power/pm_debug_messages), care include ieșirea de informații de depanare despre sistemul de gestionare a energiei (util în depanarea problemelor cu modul de somn și așteptare).
- În interfața de intrare/ieșire asincronă s-a adăugat suport pentru și .
- Profilarea cgroup a fost îmbunătățită cu ajutorul instrumentului perf. Anterior, perf putea profila sarcini doar într-un anumit cgroup și nu putea determina la ce cgroup aparține mostrele curente. Acum, perf obține informații despre cgroup pentru fiecare mostră, permițând profilarea mai multor cgroup-uri și aplicarea ordonării pe
cgroup în rapoarte. - În cgroupfs, sistemul de fișiere pseudo pentru gestionarea cgroups, a fost adăugat suport pentru atribute extinse (xattrs) prin care, de exemplu, se poate lăsa informații suplimentare pentru handlerii în spațiul utilizatorului.
- În cgroup memory controller au suportul pentru protecția recursivă a valorii „memory.low”, care reglează volumul minim de RAM oferit participanților grupului. Atunci când se montează o ierarhie cgroup cu opțiunea „memory_recursiveprot”, valoarea „memory.low”, care este setată pentru nodurile inferioare, va fi distribuită automat tuturor nodurilor fiice.
- framework-ul Uacce (Unified/User-space-access-intended Accelerator Framework) pentru partajarea adreselor virtuale (SVA, Shared Virtual Addressing) între CPU și dispozitive periferice, permițând acceleratoarelor hardware accesul la structurile de date din CPU-ul principal.
- Arhitecturi hardware
- Pentru arhitectura ARM a fost implementată posibilitatea extragerii calde a memoriei.
- Pentru arhitectura RISC-V a fost adăugat suportul pentru conectarea și extragerea caldă a CPU-ului (CPU hotplug). Pentru RISC-V pe 32 de biți a fost implementat eBPF JIT.
- S-a eliminat posibilitatea utilizării sistemelor ARM pe 32 de biți pentru rularea mediilor guest KVM.
- A fost eliminată implementarea „fictivă” NUMA pentru arhitectura s390, pentru care nu au fost găsite scenarii de utilizare pentru a obține îmbunătățiri de performanță.
- Pentru ARM64 a fost adăugat suportul pentru extensia AMU (Activity Monitors Unit), definită în ARMv8.4, care oferă contoare de performanță folosite pentru calcularea coeficientului de corecție a scalării frecvenței în planificatorul de sarcini.
- Echipament
- suport pentru dispozitive vDPA, care folosesc un canal de transfer de date conform specificațiilor virtio. Dispozitivele vDPA pot fi atât hardware fizic conectat, cât și dispozitive virtuale emulate software.
- În subsistemul GPIO o nouă comandă ioctl() pentru monitorizarea schimbărilor, permițând notificarea procesului asupra modificării stării oricărei linii GPIO. Ca exemplu de utilizare a noii comenzi utilitarul gpio-watch.
- În driverul DRM i915 pentru plăcile grafice Intel în mod implicit suport pentru cipurile Tigerlake („Gen12”) și a fost adăugat suport inițial pentru controlul iluminării OLED. Suportul pentru cipurile Ice Lake, Elkhart Lake, Baytrail și Haswell a fost îmbunătățit.
- În driverul amdgpu posibilitatea de a încărca firmware-uri în cipul USBC pentru ASIC. Suportul pentru cipurile AMD Ryzen 4000 „Renoir” a fost îmbunătățit. A fost adăugat suport pentru controlul panourilor OLED. A fost asigurată vizualizarea stării firmware-ului în debugfs.
- În driverul DRM vmwgfx pentru sistemele de virtualizare VMware a fost adăugată posibilitatea utilizării OpenGL 4 în sistemele guest (anterior era suportat OpenGL 3.3).
- A fost adăugat un nou driver DRM tidss pentru sistemul de afișare al platformei TI Keystone.
- Au fost adăugate drivere pentru panouri LCD: Feixin K101 IM2BA02, Samsung s6e88a0-ams452ef01, Novatek NT35510, Elida KD35T133, EDT, NewEast Optoelectronics WJFH116008A, Rocktech RK101II01D-CT, Frida FRD350H54004.
- În sistemul de gestionare a energiei suport pentru platforma Intel Jasper Lake (JSL) bazată pe Atom.
- A fost adăugat suport pentru laptopul Pinebook Pro bazat pe Rockchip RK3399, tableta Pine64 PineTab și smartphone-ul bazat pe Allwinner A64.
- Au fost adăugate suport pentru noi codecuri audio și cipuri:
Amlogic AIU, Amlogic T9015, Texas Instruments TLV320ADCX140, Realtek RT5682, ALC245, Broadcom BCM63XX I2S, Maxim MAX98360A, Presonus Studio 1810c, MOTU MicroBook IIc. - A fost adăugat suport pentru platformele ARM și platformele Qualcomm Snapdragon 865 (SM8250), IPQ6018, NXP i.MX8M Plus, Kontron „sl28”, 11 variante de placă i.MX6 TechNexion Pico, trei variante noi Toradex Colibri, Samsung S7710 Galaxy Xcover 2 bazat pe ST-Ericsson u8500, DH Electronics DHCOM SoM și PDK2, Renesas M3ULCB, Hoperun HiHope, Linutronix Testbox v2, PocketBook Touch Lux 3.
Sursa: opennet.ro
