După două luni de dezvoltare, Linus Torvalds a lansat versiunea nucleului Linux 5.16. Printre cele mai notabile schimbări se numără apelul de sistem futex_waitv pentru îmbunătățirea performanței jocurilor Windows în Wine, urmărirea erorilor în FS prin fanotify, conceptul de folio în sistemul de gestionare a memoriei, suportul pentru instrucțiunile AMX ale procesorului, capacitatea de rezervare a memoriei pentru socketurile de rețea, suportul în netfilter pentru clasificarea pachetelor în etapa „egress”, angajarea subsistemului DAMON pentru înlăturarea proactivă a zonelor de memorie nefolosite, îmbunătățirea gestionării supraîncărcărilor în cazul unor volumi mari de operații de scriere și suportul pentru discuri dure multi-drive.
Noua versiune include 15415 corecturi de la 2105 dezvoltatori, dimensiunea patch-ului fiind de 45 MB (schimbările au afectat 12023 de fișiere, au fost adăugate 685198 de linii de cod și eliminate 263867 de linii). Aproximativ 44% din toate modificările aduse în 5.16 sunt legate de driverele de dispozitive, aproximativ 16% se referă la actualizarea codului specific arhitecturilor hardware, 16% este legat de stiva de rețea, 4% de sistemele de fișiere și 4% de subsistemele interne ale nucleului.
Principalele noutăți din nucleul 5.16:
- Subsistemul de disc, I/O și sistemele de fișiere
- Mecanismul fanotify a fost îmbunătățit cu instrumente pentru monitorizarea stării sistemului de fișiere și urmărirea erorilor. Informațiile despre erori sunt transmise printr-un nou tip de eveniment — FAN_FS_ERROR, care poate fi interceptat în sistemele de monitorizare din spațiul utilizatorului pentru a informa rapid administratorul sau a lansa procese de recuperare. În cazul apariției în cascadă a unei serii de erori, fanotify asigură livrarea mesajului privind prima eroare împreună cu un contor general al problemelor, pentru a simplifica analiza ulterioară a cauzelor defectării. Suportul pentru urmărirea erorilor este momentan implementat doar pentru FS Ext4.
- Îmbunătățită gestionarea congestionărilor în timpul operațiunilor de scriere, care apar atunci când volumul operațiunilor de scriere depășește capacitatea de transfer a stocării și sistemul este nevoit să blocheze cererile procesului de scriere până la finalizarea cererilor deja transmise. În noua versiune, mecanismul nucleului utilizat pentru obținerea informațiilor despre apariția congestionărilor și blocarea sarcinilor a fost complet reproiectat, deoarece în vechea implementare au fost observate probleme cu corelarea gestionării congestionărilor de scriere cu înlocuirea paginilor din memorie în zona de schimb, în caz de lipsă de memorie în sistem.
- În Btrfs a fost implementat suportul pentru tehnologia de zonare a dispozitivelor (Zoned Namespace), aplicată în hard disk-uri sau NVMe SSD pentru a împărți spațiul de stocare în zone care constituie grupuri de blocuri sau sectoare, în care se permite doar adăugarea secvențială de date cu actualizarea întregului grup de blocuri. În plus, au fost efectuate mici optimizări ale jurnalizării inode, care au condus la creșterea capacității în testul dbench cu 3% și reducerea întârzierilor cu 11%. A fost reproiectat mecanismul de jurnalizare a directoarelor, în care, pentru a crește eficiența, a fost redus numărul operațiunilor de căutare și blocare în copacul de directoare. A fost accelerată inserția elementelor în structura btree în modul de lot (timpul de inserție în masă a elementelor a fost redus cu 4%, iar cel de ștergere cu 12%). A fost adăugat suport limitat pentru utilizarea compresiei la scrierea paginilor incomplete, precum și posibilitatea de defragmentare a subpaginilor. S-a realizat pregătirea pentru includerea suportului pentru a doua versiune a protocolului pentru comanda „send”.
- În sistemul de fișiere XFS a fost redus consumul de memorie prin utilizarea cache-urilor slab separate pentru elementele utilizate frecvent și prin reducerea unor structuri de date.
- În sistemul de fișiere Ext4 s-au realizat doar corecții de erori și o calculare mai precisă a parametrilor de inițializare amânată a tabelei Inode.
- La nivelul dispozitivelor de bloc s-au realizat optimizări care permit creșterea semnificativă a eficienței în legarea operațiunilor la nucleele CPU.
- A fost adăugat suport inițial pentru hard disk-uri cu mai multe acționări independente (multi-actuator), care permit accesul simultan la mai multe sectoare în diferite zone ale plăcii magnetice.
- A fost adăugată o nouă comandă ioctl CDROM_TIMED_MEDIA_CHANGE pentru a determina evenimentele de schimbare a suportului în unitatea de discuri optice.
- Sistemul de fișiere EROFS (Enhanced Read-Only File System) a fost îmbunătățit cu capacitatea de a funcționa pe mai multe dispozitive de stocare. Dispozitivele diferite pot fi reflectate într-un singur spațiu de adresare a blocurilor de 32 de biți. De asemenea, a fost adăugat suport pentru compresie folosind algoritmul LZMA.
- În sistemul de fișiere F2FS au fost adăugate opțiuni de montare pentru a gestiona fragmentarea fișierelor la stocarea acestora (de exemplu, pentru a depana optimizările funcționării cu stocări fragmentate).
- În CEPH, operațiile de creare și ștergere a directorilor sunt activate în mod implicit în mod asincron (pentru a reveni la comportamentul anterior, trebuie folosită steagul ‘-o wsync’ la montare). Au fost adăugate metrici pentru a monitoriza operațiile de copiere a obiectelor externe.
- În CIFS, a fost adăugat parametrul de montare tcpnodelay, care stabilește modul tcp_sock_set_nodelay pentru socket-ul de rețea, dezactivând așteptarea completării cozii în stiva TCP. A fost adăugat suport pentru link-uri DFS în timpul remontării.
- A fost adăugat suport pentru finalizarea cererilor către dispozitivele bloc în modul lot. Testarea modificării a arătat o creștere a intensității de execuție a operațiunilor de citire aleatoare de la unitățile Optane de la 6,1 la 6,6 milioane IOPS pe un nucleu de CPU.
- Memorie și servicii de sistem
- A fost adăugată o nouă apel de sistem futex_waitv, care permite monitorizarea stării mai multor futex-uri cu un singur apel de sistem. Această funcționalitate amintește de posibilitatea disponibilă în Windows WaitForMultipleObjects, emularea căreia prin futex_waitv poate fi utilă pentru îmbunătățirea performanței jocurilor Windows rulate sub Wine sau Proton. În plus, așteptarea simultană a futex-urilor poate fi folosită și pentru optimizarea performanței jocurilor native pentru Linux.
- A fost implementată concepția foliantelor de pagini de memorie, al cărei utilizare în anumite subsisteme ale nucleului va permite accelerarea gestionării memoriei în condiții de sarcină tipică. În prezent, subsistemul principal de gestionare a memoriei din nucleu și implementarea cache-ului pe pagini au fost deja traduse în foliante, iar în viitor se preconizează traducerea sistemelor de fișiere. De asemenea, în nucleu se plănuiește adăugarea suportului pentru foliante multi-pagină.
Foliantele sunt asemănătoare paginilor de memorie combinate, dar se deosebesc prin semantica îmbunătățită și organizația de lucru mai clară. Pentru gestionarea memoriei sistemului, RAM disponibil este împărțit în pagini de memorie, dimensiunea cărora depinde de arhitectură, dar pe sistemele x86 este calculată în kilobiți (de obicei 4096 de biți). Sistemele moderne vin echipate cu zeci de gigabaiți de RAM, ceea ce complică gestionarea memoriei din cauza necesității de a procesa un număr uriaș de pagini de memorie. Pentru a reduce numărul de pagini, anterior în nucleu a fost implementată concepția de pagini combinate, cu structuri care acoperă mai mult de o pagină fizică de memorie. Însă API-ul pentru manipularea paginilor combinate lăsa de dorit și ducea la costuri suplimentare.
- În planificatorul de sarcini a fost adăugat un handler care ia în considerare clusterizarea cache-ului în CPU. În unele procesoare, precum Kunpeng 920 (ARM) și Intel Jacobsville (x86), un anumit număr de nuclee CPU, de obicei 4, pot partaja cache-ul L3 sau L2. Considerarea unor astfel de topologii poate îmbunătăți semnificativ eficiența distribuirii sarcinilor între nucleele CPU în planificatorul de sarcini, deoarece mutarea sarcinilor în cadrul unui singur cluster CPU permite creșterea capacității de acces la memorie și reducerea competiției în cache.
- A fost adăugat suport pentru instrucțiunile AMX (Advanced Matrix Extensions), implementate în viitoarele procesoare server Intel Xeon Scalable, dezvoltate sub numele de cod Sapphire Rapids. AMX oferă registre configurabile TMM „TILE” și instrucțiuni pentru manipularea datelor în aceste registre, cum ar fi TMUL (Tile matrix MULtiply) pentru înmulțirea matricelor.
- Au fost implementate mai multe funcționalități noi, bazate pe subsystemul DAMON (Data Access MONitor) adăugat în ultima versiune, care permite monitorizarea accesului la date în memorie, corelat cu procesul selectat, care rulează în spațiul utilizatorului. De exemplu, subsystemul oferă posibilitatea de a analiza la ce zone specifice de memorie a avut acces procesul pe întreaga perioadă de funcționare și care zone de memorie au rămas neutilizate.
- DAMON_RECLAIM pentru identificarea și eliberarea zonelor de memorie care nu au fost accesate. Mecanismul poate fi folosit pentru a realiza o eliberare anticipată și delicată a paginilor de memorie în condițiile unei aproape epuizări a memoriei disponibile.
- DAMOS (Data Access Monitoring-based Operation Schemes) pentru aplicarea unor operații madvise() stabilite, cum ar fi eliberarea memoriei suplimentare disponibile, asupra zonelor de memorie ale procesului pentru care se înregistrează o frecvență specifică de acces la memorie. Setarea parametrilor DAMOS se face prin debugfs.
- Posibilitatea de a monitoriza spațiul adreselor fizice de memorie (anterior era posibilă monitorizarea doar a adreselor virtuale).
- Implementarea algoritmului de compresie zstd a fost actualizată la versiunea 1.4.10, ceea ce a permis creșterea semnificativă a performanței diverselor subsisteme ale nucleului care utilizează compresia (de exemplu, dezarhivarea imaginii nucleului a fost accelerată cu 35%, iar performanța dezarhivării datelor comprimate în Btrfs și SquashFS a crescut cu 15%, iar în ZRAM — cu 30%). Inițial, în nucleu a fost folosită o implementare separată a zstd, bazată pe versiunea 1.3.1, lansată acum mai bine de trei ani și care nu includea multe optimizări importante. Pe lângă trecerea la versiunea actuală, patch-ul adăugat facilitează și sincronizarea cu ramura upstream a zstd, permițând generarea codului pentru integrarea în nucleu direct din depozitul principal zstd. În viitor, codul zstd din nucleu este planificat să fie actualizat pe măsură ce apar versiuni noi ale bibliotecii zstd.
- A fost introdus un set amplu de îmbunătățiri în subsistemul eBPF. A fost adăugată posibilitatea de a apela funcții din modulele nucleului din programele BPF. Funcția bpf_trace_vprintk() a fost implementată, diferit de bpf_trace_printk(), permițând printarea simultană a mai mult de trei argumente. A fost adăugată o nouă structură de stocare a datelor (BPF map) bloom filter, care permite utilizarea structurii de date probabilistă de același nume pentru a determina prezența unui element într-un set. A fost adăugat un nou atribut BTF_KIND_TAG, care poate fi utilizat în programele BPF pentru a lega etichetele de parametrii funcțiilor, de exemplu, pentru a facilita identificarea erorilor în programele utilizatorului. În libbpf a fost permisă crearea de secțiuni proprii .rodata.* / .data.*, a fost implementat suportul pentru evenimente de urmărire uprobe și kprobe, și a fost adăugat un API pentru copierea tuturor tipurilor de BTF dintr-un obiect în altul. Suportul pentru AF_XDP a fost mutat din libbpf într-o bibliotecă separată libxdp. Pentru arhitectura MIPS a fost realizat un compilator JIT pentru mașina virtuală BPF.
- Pentru arhitectura ARM64 a fost implementat suportul pentru extensiile ARMv8.6 pentru temporizator, inclusiv cele care permit auto-sincronizarea reprezentării registrelor sistemului fără utilizarea instrucțiunilor ISB.
- Pentru arhitectura PA-RISC a fost realizată posibilitatea utilizării mecanismului KFENCE pentru identificarea erorilor în gestionarea memoriei, plus suportul pentru detectorul de stări de concurență KCSAN.
- A fost oferită posibilitatea de a configura drepturile de acces la tracefs la nivel de utilizatori și grupuri individuale, de exemplu, acum se poate permite accesul la instrumentele de urmărire doar participanților dintr-un grup specific.
- Virtualizare și securitate
- În subsistemele io_uring și device-mapper a fost implementat suportul pentru generarea de evenimente de audit. În io_uring a fost oferită posibilitatea de gestionare a accesului prin module LSM. A fost adăugată posibilitatea de auditare a apelului de sistem openat2().
- Codul nucleului a fost complet eliminat de expresiile continue case din switch (fără return sau break după fiecare bloc case). La compilarea nucleului, acum se poate aplica modul „-Wimplicit-fallthrough”.
- Au fost incluse modificări pentru întărirea verificărilor de limite în cadrul funcției memcpy().
- În interfața de intrare/ieșire asincronă io_uring a fost implementată posibilitatea aplicării politicilor de securitate la operațiile de intrare/ieșire, definite de modulele SELinux și Smack.
- În subsistemul IMA (Integrity Measurement Architecture), care permite unui serviciu extern să verifice starea subsistemelor nucleului pentru a se asigura de autenticitatea acestora, a fost implementată posibilitatea aplicării regulilor pe baza identificatorului de grup (GID) la care aparține fișierul sau în care se integrează utilizatorul care accesează fișierul.
- Au fost dezactivate în mod implicit unele mecanisme avansate de protecție a fluxurilor seccomp() împotriva atacurilor de tip Spectre, care au fost considerate excesive și care nu îmbunătățesc semnificativ securitatea, dar afectează negativ performanța. A fost revizuită aplicarea protecției Retpoline.
- Implementarea mecanismului cryptoloop a fost eliminată, iar înlocuitorul său, dm-crypt, a fost adoptat în 2004 și suportă, la nevoie, aceleași algoritmi.
- Accesul neprivilegiat la subsistemul eBPF este interzis în mod implicit. Modificarea a fost realizată pentru a preveni utilizarea programelor BPF pentru a ocoli protecția împotriva atacurilor prin canale secundare. Dacă este necesar, administratorul poate restabili capacitatea utilizării eBPF de către utilizatorii neprivilegiați.
- În hipervizorul ACRN, destinat să îndeplinească sarcini în timp real și să fie utilizat în sisteme critice, a fost adăugată suport pentru crearea/ștergerea dispozitivelor virtuale și pentru redirecționarea dispozitivelor MMIO.
- În motorul criptografic a fost adăugată suport pentru definițiile KPP (Key-agreement Protocol Primitives), care simplifică logica dezvoltării driverelor pentru sistemele criptografice.
- Pentru hipervizorul Hyper-V a fost implementat suportul pentru modul de izolare, mașini virtuale, care implică criptarea conținutului memoriei.
- În hipervizor KVM a fost adăugată suport pentru arhitectura RISC-V. A fost realizată posibilitatea migrației în cadrul mediului gazdă a mașinilor virtuale care rulează utilizând extensiile AMD SEV și SEV-ES. A fost adăugat un API pentru migrarea live a sistemelor gazdă, criptate cu ajutorul AMD SEV (Secure Encrypted Virtualization).
- Pentru arhitectura PowerPC, modul STRICT_KERNEL_RWX este activat în mod implicit, blocând utilizarea paginilor de memorie care sunt accesibile simultan pentru scriere și execuție.
- Suportul pentru conectarea la cald a memoriei (Memory hotplug) a fost oprit pe sistemele x86 de 32 de biți, care a fost nefuncțională de peste un an.
- Biblioteca liblockdep a fost exclusă din nucleu, urmând să fie întreținută separat de nucleu.
- Subsystema de rețea
- Pentru socketuri a fost implementată o nouă opțiune SO_RESERVE_MEM, care permite rezervarea unei cantități specifice de memorie pentru socket, care va rămâne întotdeauna disponibilă și nu va fi alocată altor procese. Utilizarea acestei opțiuni permite creșterea performanței prin reducerea operațiunilor de alocare și eliberare a memoriei în stiva de rețea, în special în cazul în care există condiții de lipsă de memorie în sistem.
- A fost adăugat suportul pentru protocolul de tunelare automată a traficului multicast (Automatic Multicast Tunneling, RFC 7450), care permite livrarea traficului multicast din rețele care suportă Multicast către destinatari în rețele fără Multicast. Protocolul funcționează prin încapsularea în pachete UDP.
- Îmbunătățită a fost încapsularea datelor IOAM (In-situ Operations, Administration, and Maintenance) în pachetele de tranzit.
- În ethtool netlink API a fost adăugată posibilitatea de a gestiona modurile de consum al energiei transceivatoarelor.
- În subsistemul netfilter a fost implementată posibilitatea de clasificare a pachetelor la nivelul egress, adică în momentul în care driverul primește pachetul de la stiva de rețea a nucleului. În nftables, suportul pentru filtrele corespunzătoare a apărut în versiunea 1.0.1. În netfilter, a fost adăugată posibilitatea de a împerechea și modifica anteturile interne și datele pentru UDP și TCP (antet intern / payload), care vin după antetul de transport.
- Au fost adăugate noi parametri sysctl arp_evict_nocarrier și ndisc_evict_nocarrier, care, atunci când sunt activate, vor curăța cache-ul ARP și tabela ndisc (descoperirea vecinilor) în caz de pierdere a conexiunii (NOCARRIER).
- În mecanismul de gestionare a coadelor de rețea fq_codel (Controlat Delay) au fost adăugate modurile Low Latency, Low Loss și Scalable Throughput (L4S).
- Echipament
- În driverul amdgpu a fost implementat suportul inițial pentru specificația DP 2.0 (DisplayPort 2.0) și posibilitatea de tunelare a DisplayPort prin USB4. Pentru APU Cyan Skillfish (echipat cu GPU Navi 1x) a fost adăugat suportul pentru controlerele de afișare. Suportul pentru APU Yellow Carp ( procesoare mobile Ryzen 6000 „Rembrandt”) a fost extins.
- În driverul i915 a fost stabilizat suportul pentru cipurile Intel Alderlake S și a fost implementat suportul pentru tehnologia Intel PXP (Protected Xe Path), care permite organizarea unui sesion grafic protejat hardware pe sistemele cu cipuri Intel Xe.
- În driverul nouveau au fost realizate corecții de erori și îmbunătățiri ale stilului codului.
- A fost adăugat suport pentru procesoare compatibile x86 Vortex (Vortex86MX). Linux a funcționat pe astfel de procesoare anterior, dar identificarea explicită a acestor CPU a fost necesară pentru dezactivarea protecției împotriva atacurilor Spectre/Meltdown, care nu se aplică acestor cipuri.
- A fost adăugat suport inițial pentru platformele x86 Surface Pro 8 și Surface Laptop Studio.
- A fost adăugat un driver pentru suportul cipurilor de sunet utilizate în APU AMD Yellow Carp, Van Gogh, de asemenea, a fost adăugat suport pentru sistemele de sunet și codec-urile Cirrus CS35L41, Maxim MAX98520/MAX98360A, Mediatek MT8195, Nuvoton NAU8821, NVIDIA Tegra210, NXP i.MX8ULP, Qualcomm AudioReach, Realtek ALC5682I-VS, RT5682S, RT9120, Rockchip RV1126 și RK3568.
- A fost adăugat driver-ul ishtp_eclite pentru accesul la controlerele integrate Intel PSE (Programmable Service Engine) prin intermediul protocolului ISHTP (Integrated Sensor Hub Transport Protocol), de exemplu, pentru obținerea datelor despre baterie, temperatură și informații legate de UCSI (USB Type-C Connector System Software Interface).
- A fost adăugat un driver pentru controller-ele de jocuri Nintendo Switch, care suportă dispozitivele Switch Pro și Joy-Cons. A fost adăugat suport pentru tabletele Wacom Intuos BT (CTL-4100WL/CTL-6100WL) și tastatura Apple 2021 Magic Keyboard. A fost îmbunătățit suportul pentru controlerele Sony PlayStation DualSense. A fost adăugat suport pentru butoanele laterale ale mouse-ului Xiaomi Mi.
- A fost adăugat driver-ul RT89 cu suport pentru cipurile wireless Realtek 802.11ax, precum și drivere pentru adaptoare Ethernet Asix AX88796C-SPI și switch-uri Realtek RTL8365MB-VC.
- Pentru cipurile Apple M1 au fost adăugate drivere pentru PCI și PASemi i2c.
- A fost adăugat suport pentru SoC ARM, dispozitive și plăci Raspberry Pi Compute Module 4, Fairphone 4, Snapdragon 690, LG G Watch R, Sony Xperia 10 III, Samsung Galaxy S4 Mini Value Edition, Xiaomi MSM8996 (Mi 5, Mi Note 2, Mi 5s, Mi Mix, Mi 5s Plus și Xiaomi Mi 5), Sony Yoshino (Sony Xperia XZ1 și Sony Xperia XZ Premium), F(x)tec Pro1 QX1000, Microchip LAN966, CalAmp LMU5000, Exegin Q5xR5, sama7g5, Samsung ExynosAutov9, Rockchip RK3566, RK3399 ROCK Pi 4A+, RK3399 ROCK Pi 4B+, Firefly ROC-RK3328-PC, Firefly ROC-RK3399-PC-PLUS, ASUS Chromebook Tablet CT100, Pine64 Quartz64-A, Netgear GS110EMX, Globalscale MOCHAbin 7040, NXP S32G2, Renesas R8A779M*, Xilinx Kria, Radxa Zero, JetHub D1/H1, Netronix E70K02.
Sursa: opennet.ro
