După două luni de dezvoltare, Linus Torvalds a prezentat versiunea 7.2 a nucleului Linux. Printre cele mai notabile modificări se numără: mecanismul de transfer de date USB4STREAM, optimizări de performanță pentru btrfs, xfs și ext4, continuarea eliminării codului pentru suportul CPU i486, posibilitatea de a crea planificatoare înfășurate SCHED_EXT, reducerea consumului de memorie în subsistemul de schimb de date, accelerarea canalelor neinregistrate, suport pentru extensiile Intel MBEC și AMD GMET în KVM, eliminarea protocolului AppleTalk, suport inițial pentru HDMI 2.1 FRL în driverul AMDGPU.
Noutățile principale în nucleul 7.2 (1, 2, 3):
- Subsistemul de disc, I/O și sistemele de fișiere
- În mecanismul iomap a fost eliminată apelul inutil al funcției memset pentru iterațiile deja finalizate în funcția iomap_iter(), ceea ce a crescut numărul operațiunilor de intrare/ieșire pe secundă (IOPS) cu 5% în testele efectuate, în condiții de intensitate mare a I/O, pe stocarea NVMe folosind sistemele de fișiere ext4 și xfs.
- În XFS a fost anunțat suportul stabil pentru dispozitivele de stocare zonate (împărțirea în zone de grupuri de blocuri sau sectoare, în care este permisă doar adăugarea secvențială de date prin actualizarea întregului grup de blocuri).
- În Btrfs, suportul pentru folii de memorie mari (large folios) a fost activat implicit, permițând reducerea costurilor operaționale și îmbunătățirea performanței în cazul I/O-ului secvențial intensiv. A fost adăugat suport experimental pentru foi enorme (''huge folios'') de până la 2 MB. A fost introdus un nou ioctl GET_CSUMS pentru obținerea informațiilor despre sumele de control în spațiul utilizatorului, de exemplu, pentru utilitarul mkfs și optimizarea deduplicării. Performanța scrierii secvențiale a fost îmbunătățită cu 15%, iar I/O-ul direct cu 59%.
- În sistemul de fișiere Ext4, implementarea mecanismului „fast commit” a fost semnificativ îmbunătățită pentru a elimina blocajele concurente și reciproce. A fost adăugat un export al statisticilor despre instantaneele inode prin /proc/fs/ext4/*/fc_info. Performanța calculării hash-urilor directoare a fost optimizată (pentru nume de 255 de caractere, viteză crescută aproape de două ori, 64 de caractere cu 27%, 32 de caractere — 11%).
- În F2FS a fost adăugat suportul pentru returnarea erorilor fserror, permițând urmărirea problemelor cu FS din spațiul utilizatorului. Timpul petrecut în contextul gestionării întreruperilor a fost redus.
- În Device Mapper (DM) a fost adăugat un nou handler dm-inlinecrypt pentru implementarea criptării și decriptării transparente a dispozitivelor bloc, folosind dispozitive hardware cu funcționalitate de criptare inline.
- A fost propusă documentația pentru adăugarea de noi sisteme de fișiere în kernel.
- În NFS, dimensiunea blocului implicit a fost crescută la 4 MB pe sistemele care au cel puțin 16 GB RAM (pentru a modifica manual dimensiunea blocului, se poate folosi /proc/fs/nfsd/max_block_size). A fost adăugată suport pentru delegarea gestionării directorului clientului, ceea ce permite efectuarea de operațiuni în acest director pentru o anumită perioadă fără a verifica modificarea stării. server.
- În serverul SMB a fost adăugat suport pentru fișierele stocate într-o formă comprimată, precum și pentru comprimarea datelor în timpul transmiterii lor prin rețea.
- În noua implementare NTFS (ntfsplus) a fost adăugat suport pentru linkuri simbolice Windows și a fost asigurată gestionarea corectă a multor tipuri de corupții ale metadatelor.
- Backend-ul fscache pentru caching-ul datelor sistemului de fișiere EROFS (Enhanced Read-Only File System) a fost eliminat, acesta fiind declarat învechit acum doi ani.
- În sistemul de fișiere Ceph a fost adăugat suport pentru resetarea manuală a sesiunilor clientului.
- În sistemul de fișiere 9P au fost efectuate optimizări care au accelerat performanța în scenarii precum construirea proiectelor.
- În apelul de sistem file_getattr() au fost adăugate flașe pentru obținerea informațiilor despre sensibilitatea majusculelor în sistemul de fișiere. Flagra FS_XFLAG_CASEFOLD indică faptul că verificarea numelui fișierelor se face fără a ține cont de sensibilitatea la majuscule, iar flagra FS_XFLAG_CASENONPRESERVING semnalează că la crearea de noi nume de fișiere nu se păstrează informația despre sensibilitatea la majuscule. Flagrele specificate pot fi utilizate în clienții NFS care nu țin cont de sensibilitatea la majuscule.
- În apelul de sistem openat2() a fost adăugată flagra O_EMPTYPATH, care permite transmiterea unui calea fișierului goală. În acest caz, calea către fișierul deschis este determinată pe baza descriptorului de fișier transmis.
- În apelul de sistem openat2() a fost adăugată flagra OPENAT2_REGULAR, care permite deschiderea doar a fișierelor obișnuite (în cazul în care se încearcă deschiderea unui fișier special, de exemplu, un socket, un canal sau un dispozitiv, va fi returnată o eroare EFTYPE).
- Memorie și servicii de sistem
- A fost implementat mecanismul USB4STREAM pentru transferul de date între calculatoare, conectate prin cabluri prin intermediul porturilor USB4. A fost adăugat dispozitivul /dev/tbstreamX, prin care pot fi citite și scrise date, folosind funcțiile standard read() și write() similar cu citirea și scrierea în fișiere. De exemplu, pe un host se poate trimite informația cu comanda „echo hello > /dev/tbstream0”, iar pe celălalt se poate citi cu comanda „cat /dev/tbstream0”. Mecanismul USB4STREAM poate fi combinat cu posibilitatea de a stabili o conexiune de rețea prin cablu USB4 (thunderbolt_net) sau utilizat separat atunci când este necesar transferul de date între aplicații care nu suportă socket-uri de rețea.
- A doua serie de modificări pentru a opri suportul pentru procesoarele i486 a fost inclusă. Au fost eliminate mai bine de 13 linii de cod legate de emularea blocului pentru calculele cu virgulă mobilă pentru procesoarele fără FPU. Suportul pentru procesoarele i486 fără operațiuni hardware CX8 (compară și schimbă 8 octeți) și TSC (numărătorul ciclurilor CPU, utilizat în planificatorul de sarcini) a fost eliminat, iar codul pentru emularea acestora a fost șters.
- A fost declarată suportul rămas fără însoțire (orphaned) pentru procesoarele AMD Geode, utilizate în computerul OLPC XO-1.
- A fost adăugat suportul pentru actualizarea implementării mecanismului Intel TDX (Trusted Domain Extensions), utilizat pentru criptarea memoriei RAM a sistemelor oaspete. TDX este implementat sub forma unui modul special de runtime software, care în timpul inițializării este transferat din BIOS din memoria Flash în memoria RAM. Kernelul a fost extins cu funcționalități pentru a gestiona acest modul și a-l înlocui cu o versiune mai nouă pe un sistem în funcțiune fără a fi necesară o repornire.
- A fost implementat un nou programator de resurse GPU (Fair GPU scheduler), utilizat pentru a determina ordinea de execuție pe GPU a muncii trimise de procesele care folosesc GPU. În loc să folosească tradiționala coadă FIDO pentru cererile către GPU, noul programator implică mecanisme de distribuție corectă a resurselor, realizate având în vedere programatorul de sarcini CFS (Completely Fair Scheduler), care aplică un plan de execuție cu un timp de tranziție pentru execuția următorului proces. Cel mai evident efect al utilizării noului programator este observat în timpul execuției paralele a sarcinilor interactive, care lucrează activ cu GPU-ul. Cu ultimele ajustări înainte de lansarea nucleului 7.2, activarea Fair GPU scheduler a fost anulată și s-a revenit la vechiul programator FIFO din cauza necesității de a depana o regresie care ducea la scăderea performanței și o încărcătură de 100% pe GPU la pornirea unor jocuri individuale în Proton.
- Modificări în subsistemul eBPF: A fost adăugată posibilitatea de a atașa un program BPF la mai multe puncte de urmărire (tracepoint). În programele BPF legate de punctele de urmărire a fost adăugată posibilitatea de acces la memoria componentelor care rulează în spațiul utilizatorului, cu o gestionare corectă a accesului la paginile de memorie nealoate (page fault). În apelul de sistem bpf() a fost adăugată suport pentru atributele standard (log_buf, log_size, log_level și log_true_size), care permite unificarea transmiterea meta-datelor în toate comenzile BPF, fără a se limita la comenzile BPF_PROG_LOAD, BPF_BTF_LOAD și BPF_MAP_CREATE. Limita de transmitere a mai mult de 5 parametri în funcția BPF a fost eliminată. A fost adăugată posibilitatea accesului sigur la memoria partajată bpf_arena fără a se teme de accesul la paginile de memorie nealoate (page fault). A fost implementată o nouă variantă a structurii BPF hash map, care permite modificarea dinamică a dimensiunii.
- S-a optimizat generarea ieșirii „/proc/interrupts” cu statistici de intreruperi, iar structurile pentru stocarea contorilor de intreruperi au fost modernizate și adăugat caching.
- S-a accelerat generarea fișierului „/proc/filesystems”, folosit în libselinux.
- În programatorul de sarcini a fost implementat suport pentru echilibrarea încărcării între nuclee CPU, luând în considerare starea cache-ului intern al procesorului. Programatorul încearcă acum să grupeze procesele care utilizează resurse comune, de exemplu, firele unui singur proces, pentru a le utiliza în contextul aceluiași cache de nivel superior, ceea ce îmbunătățește eficiența accesului la date prin creșterea probabilității de a găsi datele necesare în cache.
- În mecanismul SCHED_EXT, care permite utilizarea BPF pentru crearea programatorilor CPU, a fost continuată implementarea capacității de a crea programatori imbricați (sub-scheduler), prin care pentru fiecare cgroup se poate utiliza un programator de sarcini propriu.
- Continuarea transferului modificărilor din ramura Rust-for-Linux, legate de utilizarea limbajului Rust ca al doilea limbaj pentru dezvoltarea driverelor și modulelor kernel (suportul pentru Rust nu este activat implicit și nu duce la includerea Rust printre dependențele de compilare obligatorii pentru kernel). Capacitatea de a utiliza Rust în kernel a fost implementată pentru arhitectura s390. A fost inclus pachetul „zerocopy” cu primitive rapide pentru manipularea memoriei în codul în modul „unsafe”.
- Versiunea minimă a instrumentelor LLVM necesară pentru compilarea kernelului a fost crescută la 17.0.1.
- În biblioteca minimalistă C nolibc, livrată împreună cu codurile sursă ale kernelului Linux și care oferă o legătură pentru apelurile sistemice de bază, a fost implementat suport pentru arhitecturile OpenRISC și PA-RISC de 32 de biți.
- În subsistemul de swap au fost aduse optimizări care îmbunătățesc performanța și reduc consumul de memorie în cadrul subsistemului prin eliminarea cheltuielilor de stocare a metadatelor statice și unificarea lucrului cu memoria anonimă și partajată atunci când se folosesc pagini de memorie. Reducerea consumului de memorie este semnificativă, de exemplu, când este montat un partaj de swap de 1 TB, se observă o reducere a consumului de memorie de aproximativ 512 MB.
- Eficiența mecanismului de eliminare a memoriei, care șterge sau mută în partajul de swap zone de memorie pentru a elibera memorie atunci când aceasta este insuficientă în sistem, a fost crescută. În anumite tipuri de sarcini, de exemplu, în testarea MongoDB folosind YCSB (Yahoo! Cloud Serving Benchmark), se observă o creștere a performanței de până la 30%.
- A fost adăugată comanda „make sbom” în sistemul de compilare pentru generarea listelor SBOM (Software Bill Of Materials), care reflectă componentele, bibliotecile și dependențele folosite în compilarea curentă a nucleului, precum și informații despre licențele acestora, obținute din anteturile SPDX din fișierele de cod.
- În implementarea canalelor fără nume (pipe) a fost optimizată gestionarea blocajelor (operațiile de alocare a memoriei au fost scoase din domeniul de acțiune al blocajului), ceea ce a crescut capacitatea de transfer a canalelor fără nume cu 21-48% și a redus întârzierile cu 17-33%.
- Virtualizare și securitate
- Mecanismul de alocare a memoriei slab (slab allocator) a fost îmbunătățit cu posibilitatea utilizării token-urilor de alocare a memoriei (Allocation Token), implementate în compilatorul Clang 22. Token-urile permit marcarea operațiunilor de alocare a memoriei cu identificatori unici și organizarea plasării separate a diferitelor tipuri de obiecte pentru a complica exploatarea vulnerabilităților cauzate de buffer overflow (prin separare, exploatarea buffer overflow într-un tip de obiecte nu este atât de simplă pentru a afecta alte tipuri de obiecte).
- Mecanismul AF_ALG, exploatat în vulnerabilitatea Copy Fail pentru modificarea datelor în cache-ul de pagină, a fost declarat învechit și planificat pentru eliminare în una dintre viitoarele versiuni. AF_ALG permite utilizarea acceleratoarelor hardware pentru calcule criptografice în Crypto API al nucleului, dar este folosit în situații destul de specifice. În nucleul 7.2, suportul pentru I/O asincron, driverele vechi și mecanismul zero-copy în implementările skcipher și aead a fost eliminat din AF_ALG. Au rămas doar implementările software ale algoritmilor criptografici, iar suportul pentru acceleratoare criptografice hardware din Crypto API al nucleului a fost eliminat, deoarece AF_ALG extinde semnificativ suprafața de atac fără a oferi câștiguri de performanță în comparație cu implementarea criptografiei în spațiul utilizatorului. AF_ALG a fost folosit în instrumentarul Cryptsetup, dar suportul său a fost eliminat în versiunea recentă 2.8.7.
- În mecanismul IMA (Integrity Measurement Architecture), care permite unui serviciu extern să verifice starea subsistemelor nucleului pentru a se asigura de autenticitatea acestora, a fost adăugat suportul pentru exportarea tabelelor interne cu rezultatele măsurărilor în spațiul utilizatorului, cu eliminarea acestora din buffer-ele nucleului pentru economisirea memoriei.
- Modulul Landlock, care oferă programelor neprivilegiate mijloace pentru a restricționa utilizarea obiectelor din nucleul Linux (ierarhii de fișiere, socket-uri de rețea, ioctl etc.), a adăugat suport pentru gestionarea accesului la socket-urile UDP, precum și opțiunea de a dezactiva selectiv logarea informațiilor despre blocarea obiectelor pentru a preveni aglomerarea logului cu informații neesențiale.
- Nucleul a fost eliberat de utilizarea funcției strncpy(), care copiază un număr definit de octeți dintr-un șir de intrare. Utilizarea strncpy() crea riscuri de apariție a erorilor din cauza omiterii caracterului nul la sfârșitul șirului sau completării acestuia cu zerouri. În loc de strncpy(), este recomandat să se utilizeze funcțiile strscpy() și strscpy_pad() pentru copierea șirurilor care se termină cu caracter nul, precum și strtomem_pad(), memcpy_and_pad() și memcpy() pentru copierea șirurilor de dimensiune fixă cunoscută. Lucrările pentru îndepărtarea utilizării strncpy() din nucleu au început în 2020 și au necesitat acceptarea a 362 de modificări de către 70 de dezvoltatori.
- În hypervisor KVM A fost adăugat suport pentru extensiile Intel MBEC (Mode-Based Execution Control) și AMD GMET (Guest-Mode Execution Trap), care permit gestionarea separată a drepturilor de execuție pentru nucleu și spațiul utilizatorului în sistemele gazdă în tabelele de traducere a memoriei. Anterior, extensiile de virtualizare hardware Intel și AMD permiteau marcarea paginilor de memorie ca fiind accesibile doar pentru execuție printr-un singur bit, cu separarea drepturilor la nivelul hipervizorului. Utilizarea MBEC și GMET oferă posibilitatea de a exclude verificările de permisiune pe partea hipervizorului și de a reduce semnificativ intensitatea transferului resurselor în procesul de trecere de la sistemul gazdă la hipervizor (VMexit).
- Subsystema de rețea
- Implementarea extensiei TCP-AO (TCP Authentication Option, RFC 5925) a fost transformată să utilizeze noua bibliotecă criptografică libcrypto, ceea ce a permis simplificarea codului și creșterea eficienței de operare. TCP-AO oferă posibilitatea de a verifica header-urile TCP prin coduri MAC (Message Authentication Code), folosind algoritmi mai moderni HMAC-SHA-1-96 și AES-128-CMAC-96 în locul opțiunii anterioare TCP-MD5 bazate pe algoritmul învechit MD5.
- Numărul de subfluxuri acceptate pentru conexiunile Multipath TCP (MPTCP) a fost crescut de la 8 la 64.
- Continuăm lucrările pentru reducerea utilizării blocării globale rtnl_lock în stiva de rețea a nucleului.
- Din kernel a fost eliminată implementarea stivei de protocoale AppleTalk, care a fost utilizată pe computerele Apple din 1985 până în anii 1990, fiind înlocuită de TCP/IP. De asemenea, au fost eliminate componentele tehnologiei de transmisie a datelor ATM, care nu erau legate de PPPoATM, și interfețele de rețea ARCnet bazate pe magistrale ISA și PCMCIA, adaptoarele Bluetooth cu interfața PCMCIA, acceleratorii TLS Chelsea, codul pentru integrarea TLS cu sockmap și suportul pentru benzile de frecvență de 5/10 MHz în stiva wireless cfg80211/mac80211. Din cauza problemelor nerezolvate legate de blocări și a absenței suportului, implementarea specifică a accelerării procesării TLS pe baza TCP Offload Engine a fost eliminată (implementarea mai comună a TLS offload fiind păstrată). A fost dezactivat și planificat pentru eliminare codul de compatibilitate cu x_tables pe 32 de biți pe sistemele pe 64 de biți.
- Driverul pppoe a adăugat suport pentru mecanismele GRO (Generic Receive Offload) și GSO (Generic Segmentation Offload) pentru accelerarea hardware-ului în reasamblarea și segmentarea pachetelor. Utilizarea GRO și GSO permite creșterea semnificativă a lățimii de bandă pentru traficul de intrare; de exemplu, pe dispozitivele MediaTek MT7621 în configurația cu traductor de adrese, lățimea de bandă maximă a crescut de la 130 Mbit/s la 630 Mbit/s.
- Echipament
- În driverul AMDGPU a apărut suport inițial pentru tehnologia HDMI 2.1 FRL (Fixed Rate Link), care permite transmiterea video nescomprimat la calitatea 4K/120Hz și 8K/60Hz. Anterior, suportul HDMI 2.1 nu a fost realizat în driverele open source din cauza cerințelor de licență ale HDMI Forum, dar acum compania AMD a reușit să ajungă la un acord pentru o astfel de implementare.
- În driverul i915 a fost adăugat suportul pentru configurarea culorii de fundal prin intermediul controlerului de afișare. A fost implementat parametrul pin_params.needs_low_address.
- Continuăm lucrările asupra driverului drm (Direct Rendering Manager) Xe pentru GPU-urile bazate pe arhitectura Intel Xe, care este utilizată în plăcile video Intel din familia Arc și în grafică integrată, începând cu procesoarele Tiger Lake. A fost adăugat suport inițial pentru platforma CRI (Crescent Island). Pentru platformele dGPU Xe3p a fost implementat un controller de sistem.
- În driverul Nouveau au fost rezolvate problemele legate de GPU-ul NVIDIA GA100.
- În driverul v3d a fost adăugată posibilitatea de a gestiona consumul de energie al GPU-ului v3D pe plăcile Raspberry Pi.
- Integrarea componentelor driverului Nova pentru GPU NVIDIA, echipate cu firmware GSP, a fost continuată, începând cu seria NVIDIA GeForce RTX 2000 bazată pe microarhitectura Turing. Driverul este scris în limbajul Rust. A fost adăugată suportul pentru GPU NVIDIA GA100 și seriile Hopper și Blackwell.
- A fost adăugat suport pentru plăci ARM, SoC și dispozitive: Apple t8122 (M3), Motorola Edge 30, Nothing Phone 3a, Google Pixel 3a XL, Qualcomm Dragonwing IPQ9650, Huawei Hawi, ZTE zx297520v3, Renesas R-Car M3Le, ASPEED AST27xx, Cortina Gemini, NXP i.MX6/8/9, NXP LX2160A, TI K3 AM62x.
În același timp, Fundația Latino-Americană pentru Software Liber a formulat o variantă complet liberă a nucleului 7.2 — Linux-libre 7.2-gnu, curățată de elemente de firmware și drivere ce conțin componente sau porțiuni de cod proprietar, a căror utilizare este limitată de către producător. În versiunea 7.2 a avut loc curățarea blob-urilor din noile drivere rt722-sdca și tac5xx2. Codul de curățare a fost actualizat în driverele amdgpu, nova core, qcom iris, q6v5, iwlwifi, amdxnda, adreno, r8152 și mt792x. Au fost ajustate interfețele pentru încărcarea firmware-ului. A fost efectuată curățarea numelui blob-urilor în fișierele dts (device tree) pentru cipurile ARM.
Sursa: opennet.ro
