Po dvou měsících vývoje Linus Torvalds představil verzi jádra Linux 5.16. Mezi nejvýznamnějšími změnami je systémový volání futex_waitv pro zlepšení výkonu her Windows ve Wine, sledování chyb v systému souborů prostřednictvím fanotify, koncept foliantu v systému správy paměti, podpora procesorových instrukcí AMX, možnost rezervace paměti pro síťové sokety, podpora v netfilter klasifikace paketů ve fázi „egress“, využití subsystému DAMON pro proaktivní vyhození nepotřebných oblastí paměti, zlepšení zpracování přetížení při velkém objemu zapisovacích operací, podpora vícestupňových pevných disků.
Do nové verze bylo integrováno 15415 oprav od 2105 vývojářů, velikost patche je 45 MB (změny se dotkly 12023 souborů, přidáno 685198 řádků kódu, odstraněno 263867 řádků). Přibližně 44 % všech změn v 5.16 se týká ovladačů zařízení, asi 16 % změn souvisí s aktualizací kódu specifického pro hardwarové architektury, 16 % souvisí se síťovým stackem, 4 % s file systémem a 4 % s interními subsystémy jádra.
Hlavní novinky v jádře 5.16:
- Diskový subsystém, vstup/výstup a souborové systémy
- Do mechanismu fanotify byly přidány prostředky pro monitorování stavu souborového systému a sledování vzniku chyb. Informace o chybách se předávají pomocí nového typu události – FAN_FS_ERROR, které mohou být zachycovány v uživatelském prostoru systémů monitorování pro okamžité informování správce nebo spuštění procesů obnovy. Při kaskádovém výskytu série chyb fanotify zajišťuje doručení zprávy o první chybě spolu s celkovým počítadlem problémů, pro usnadnění následné analýzy příčin selhání. Podpora sledování chyb zatím byla realizována pouze pro FS Ext4.
- Byla vylepšena správa přetížení při provádění zapisovacích operací (write congestion), které vznikají, když objem zapisovacích operací překračuje propustnost úložiště a systém musí blokovat požadavky procesu na zápis do dokončení už přijatých požadavků. V nové verzi byl zásadně přepracován mechanismus jádra používaný k získávání informací o vzniku přetížení a blokování úloh, protože ve staré realizaci byly pozorovány problémy s párováním zpracování přetížení zápisu se stránkováním paměti do swapu při nedostatku paměti v systému.
- V systému Btrfs byla implementována podpora technologie zónování zařízení (Zoned Namespace), používané v pevných discích nebo NVMe SSD pro rozdělení úložného prostoru na zóny, skládající se ze skupin bloků nebo sektorů, kde je povoleno pouze sekvenční přidávání dat s aktualizací celé skupiny bloků. Kromě toho byly provedeny drobné optimalizace logování inode, které vedly ke zvýšení propustnosti v testu dbench o 3 % a ke snížení latence o 11 %. Mechanismus logování adresářů byl přepracován, přičemž pro zvýšení efektivity bylo sníženo množství vyhledávacích operací a blokací ve stromu. Vložení prvků do struktury btree v dávkovém režimu bylo zrychleno (čas hromadného vkládání prvků se zkrátil o 4 % a odstranění o 12 %). Byla přidána omezená podpora pro používání komprese při zápisu neúplných stránek, stejně jako možnost defragmentace podstránek (subpage). Byla připravena podpora pro zapnutí druhé verze protokolu pro příkaz „send”.
- Ve файловé systému XFS došlo ke snížení spotřeby paměti díky použití samostatných slab k/cache pro často používané prvky a zmenšení některých datových struktur.
- Ve файловé systému Ext4 byla zaznamenána pouze oprava chyb a přesnější výpočet parametrů odložené inicializace tabulky inode.
- Na úrovni blokových zařízení byly implementovány optimalizace, které významně zvýšily efektivitu spojování operací s jádry CPU.
- Byla přidána základní podpora pevných disků s více nezávislými pohony (multi-actuator), což umožňuje současný přístup k několika sektorům v různých zónách magnetického disku.
- Byla přidána nová ioctl-veličina CDROM_TIMED_MEDIA_CHANGE pro detekci událostí výměny média v optických discích.
- Do souborového systému EROFS (Enhanced Read-Only File System) byla přidána možnost fungování nad více úložnými zařízeními. Různá zařízení mohou být mapována do jednoho 32bitového adresního prostoru bloků. Také byla přidána podpora komprese s využitím algoritmu LZMA.
- Do souborového systému F2FS byly přidány možnosti připojení pro řízení fragmentace souborů při jejich ukládání (například pro ladění optimalizací práce s fragmentovanými úložišti).
- V systému CEPH jsou standardně zapnuty operace vytváření a odstraňování adresářů v asynchronním režimu (pro vrácení starého chování použijte při připojování flag ‘-o wsync’). Bylo také přidáno sledování metrik, které monitorují operace kopírování externích objektů.
- Do CIFS byla přidána možnost připojení tcpnodelay, kdy je pro síťový socket nastaven režim tcp_sock_set_nodelay, který zakazuje čekání na zaplnění fronty v TCP zásobníku. Byla přidána podpora vnořených DFS odkazů (Distributed File System) při opětovném připojení.
- Byla přidána podpora hromadného ukončení požadavků na blokové zařízení. Testování změny ukázalo nárůst intenzity provádění operací náhodného čtení z disku Optane z 6.1 na 6.6 milionu IOPS na jedno jádro CPU.
- Paměť a systémové služby
- Byl přidán nový systémový volání futex_waitv, který umožňuje sledovat stav více futexů prostřednictvím jednoho systémového volání. Tato funkcionalita připomíná dostupnou ve Windows funkčnost WaitForMultipleObjects, jejíž emulace pomocí futex_waitv může být užitečná pro zvýšení výkonu Windows her běžících pod Wine nebo Proton. Kromě toho může být současné čekání na futexy také použito pro optimalizaci výkonu nativních verzí her pro Linux.
- Byla implementována koncepce stránek paměti (page folios), jejíž použití v některých subsystémech jádra umožní urychlit správu paměti při typických zátěžích. V současnosti byla na folia již převedena hlavní subsystém správy paměti v jádře a implementace stránkového cache, a v budoucnu je naplánován převod souborových systémů. Dále se v jádře plánuje také přidat podpora vícestránkových foliantů.
Folianty připomínají sloučené stránky paměti (compound pages), ale liší se vylepšenou sémantikou a přehlednější organizací práce. Pro správu systémové paměti je dostupná RAM rozdělena na stránky paměti, jejichž velikost závisí na architektuře, ale na systémech x86 se počítá v kilobytech (obvykle 4096 bajtů). Moderní systémy jsou vybaveny desítkami gigabajtů RAM, což komplikuje správu paměti kvůli potřebě zpracovávat obrovské množství stránek paměti. Pro snížení počtu stránek byla dříve v jádře zavedena koncepce sloučených stránek s strukturami pokrývajícími více než jednu fyzickou stránku paměti. Ale API pro manipulaci se sloučenými stránkami paměti zanechávalo mnoho přání a vedlo k dalším režijním nákladům.
- Do plánovače úloh byl přidán zpracovatel, který zohledňuje klastrovanou cache v CPU. V některých procesorech, jako jsou Kunpeng 920 (ARM) a Intel Jacobsville (x86), může určité množství jader CPU, obvykle 4, sdílet L3 nebo L2 cache. Zohlednění těchto topologií může významně zvýšit efektivitu rozdělování úloh mezi jádra CPU v plánovači úloh, protože přesun úloh uvnitř jednoho clusteru CPU umožňuje zvýšit propustnost přístupu k paměti a snížit konkurenci v cache.
- Byla přidána podpora instrukcí AMX (Advanced Matrix Extensions), realizovaných v nadcházejících serverových procesorech Intel Xeon Scalable, vyvíjených pod kódovým názvem Sapphire Rapids. AMX nabízí nové nastavitelné registry TMM „TILE“ a instrukce pro manipulaci s daty v těchto registrech, jako je TMUL (Tile matrix MULtiply) pro násobení matic.
- Bylo realizováno několik nových funkcí založených na přidané subsystému DAMON (Data Access MONitor) v minulém vydání, který umožňuje sledovat přístup k datům v operační paměti ve vztahu k vybranému procesu běžícímu v uživatelském prostoru. Například subsystém poskytuje možnost analyzovat, ke kterým konkrétním oblastem paměti se proces během své činnosti dostal, a které oblasti paměti zůstaly nevyužity.
- DAMON_RECLAIM pro identifikaci a uvolnění paměťových oblastí, které nebyly přístupny. Mechanismus lze použít pro proaktivní měkké uvolnění stránek paměti při přiblížení se k vyčerpání volné paměti.
- DAMOS (Data Access Monitoring-based Operation Schemes) pro aplikaci zadaných operací madvise(), jako je uvolnění další volné paměti, na paměťové oblasti procesu, pro které je sledována určitá frekvence přístupu. Nastavení parametrů DAMOS se provádí přes debugfs.
- Možnost monitorovat fyzický adresní prostor paměti (dříve bylo možné sledovat pouze virtuální adresy).
- Implementace kompresního algoritmu zstd byla aktualizována na verzi 1.4.10, což výrazně zvýšilo výkon různých subsystémů jádra, ve kterých se komprese používá (například doba rozbalení obrazového souboru jádra byla zrychlena o 35 %, výkon rozbalení komprimovaných dat v Btrfs a SquashFS se zvýšil o 15 %, a v ZRAM — o 30 %). Původně byla v jádře použita samostatná implementace zstd, založená na verzi 1.3.1, vydané před více než třemi lety a nezahrnující mnoho důležitých optimalizací. Kromě přechodu na aktuální verzi také přidaný patch usnadňuje synchronizaci s upstream větví zstd, což umožňuje generovat kód pro zahrnutí do jádra přímo z hlavního repozitáře zstd. V budoucnu se plánuje kód zstd v jádře aktualizovat v závislosti na vydání nových verzí knihovny zstd.
- Bylo zavedeno mnoho vylepšení do subsystému eBPF. Byla přidána možnost volání funkcí modulů jádra z BPF programů. Byla realizována funkce bpf_trace_vprintk(), která na rozdíl od bpf_trace_printk() umožňuje vypsat najednou více než tři argumenty. Byla přidána nová struktura pro ukládání dat (BPF map) bloom filter, která umožňuje využívat totožnou pravděpodobnostní strukturu dat pro určení přítomnosti prvku v množině. Byl přidán nový atribut BTF_KIND_TAG, který může být použit v BPF programech pro přiřazení tagů k parametrům funkcí, což usnadňuje odhalování chyb v uživatelských programech. V libbpf bylo povoleno vytváření vlastních sekcí .rodata.* / .data.*, byla implementována podpora událostí sledování uprobe a kprobe, a byl přidán API pro kopírování všech typů BTF z jednoho objektu do druhého. Podpora AF_XDP byla přenesena z libbpf do samostatné knihovny libxdp. Pro architekturu MIPS byl implementován JIT kompilátor pro virtuální stroj BPF.
- Pro architekturu ARM64 byla implementována podpora rozšíření ARMv8.6 pro časovač, včetně těch, které umožňují zajištění samo-synchronizace zobrazení systémových registrů bez použití instrukcí ISB.
- Pro architekturu PA-RISC byla implementována možnost aplikace mechanismu KFENCE pro odhalování chyb při práci s pamětí a byla přidána podpora detektoru stavů závodů KCSAN.
- Byla poskytnuta možnost nastavení přístupových práv k tracefs na úrovni jednotlivých uživatelů a skupin, například nyní je možné povolit přístup k prostředkům sledování pouze členům určité skupiny.
- Virtualizace a bezpečnost
- V subsystémech io_uring a device-mapper byla implementována podpora generování auditních událostí. V io_uring byla přijata možnost řízení přístupu prostřednictvím modulů LSM. Byla přidána možnost auditu systémového volání openat2().
- Kód jádra byl zcela zbaven nepřerušených výrazů case ve switch (bez return nebo break po každém bloku case). Při sestavování jádra nyní bude možné použít režim „-Wimplicit-fallthrough“.
- Byly zahrnuty změny pro zpřísnění kontrol hranic při provádění funkce memcpy().
- V rozhraní pro asynchronní vstup/výstup io_uring byla implementována možnost aplikovat na operace vstupu/výstupu bezpečnostní politiky definované moduly SELinux a Smack.
- V subsystému IMA (Integrity Measurement Architecture), který umožňuje externímu servisu ověřit stav subsystémů jádra, aby zajistil jejich autenticitu, byla implementována možnost aplikace pravidel založených na identifikátoru skupiny (GID), ke které soubor patří, nebo do které patří uživatel, který se snaží přistoupit k souboru.
- Některé pokročilé mechanismy ochrany sekvencí seccomp() před útoky třídy Spectre jsou ve výchozím nastavení deaktivovány, protože byly považovány za nadbytečné a nepatrně nezvyšovaly bezpečnost, ale negativně ovlivňovaly výkon. Bylo revidováno použití ochrany Retpoline.
- Byla odstraněna implementace mechanismu cryptoloop, kterou v roce 2004 nahradil dm-crypt, jenž v případě potřeby podporuje stejné algoritmy.
- Ve výchozím nastavení je zakázán nepř privileged access k subsystému eBPF. Změna byla učiněna pro zabránění používání BPF programů k obcházení ochrany před útoky přes externí kanály. Pokud je to žádoucí, může administrátor obnovit možnost používání eBPF nepř privilegedními uživateli.
- Do hypervízoru ACRN, určeného pro plnění úloh reálného času a použití v kritických systémech, byla přidána podpora pro vytváření/mazání virtuálních zařízení a předání zařízení MMIO.
- Do kryptografického enginu byla přidána podpora definic KPP (Key-agreement Protocol Primitives), které zjednodušují logiku vývoje ovladačů pro kryptosystémy.
- Pro hypervízor Hyper-V byla realizována podpora režimu izolace, virtuálních strojůkterý zahrnuje šifrování obsahu paměti.
- V hypervizoru KVM byla přidána podpora architektury RISC-V. Byla implementována možnost migrace uvnitř hostitelského prostředí virtuálních strojů, které používají rozšíření AMD SEV a SEV-ES. Přidán API pro live migraci hostitelských systémů šifrovaných pomocí AMD SEV (Secure Encrypted Virtualization).
- Pro architekturu PowerPC je ve výchozím nastavení povolen režim STRICT_KERNEL_RWX, který blokuje použití stránek paměti, které jsou současně přístupné pro zápis a vykonání.
- Na 32bitových systémech x86 byla zastavena podpora teplého připojení paměti (Memory hotplug), která více než rok nebyla funkční.
- Z jádra byla vyloučena knihovna liblockdep, která nyní bude podporována odděleně od jádra.
- Síťová subsystém
- Pro sokety byla implementována nová možnost SO_RESERVE_MEM, která umožňuje rezervovat pro socket určité množství paměti, jež zůstane pro socket vždy dostupná a nebude odebrána. Použití této možnosti zvyšuje výkon díky snížení operací alokace a uvolnění paměti v síťovém zásobníku, zejména při nedostatku paměti v systému.
- Byla přidána podpora protokolu automatického tunelování multicastového provozu (Automatic Multicast Tunneling, RFC 7450), který umožňuje doručovat multicastový provoz z sítí, které podporují multicast, příjemcům v sítích bez multicastu. Protokol funguje prostřednictvím enkapsulace do UDP paketů.
- Byla vylepšena enkapsulace IOAM (In-situ Operations, Administration, and Maintenance) dat do přechodových paketů.
- Do ethtool netlink API byla přidána možnost správy režimů spotřeby energie pro přenosové a příjmové jednotky.
- V subsystému netfilter byla implementována možnost klasifikace paketů na úrovni egress, tedy ve fázi, kdy ovladač přijímá paket ze síťového zásobníku jádra. V nftables byla podpora odpovídajících filtrů přidána ve verzi 1.0.1. V netfilter byla přidána možnost porovnávání a změny interních záhlaví a dat pro UDP a TCP (inner header / payload), která následují za transportním záhlavím (transport header).
- Byly přidány nové sysctl parametry arp_evict_nocarrier a ndisc_evict_nocarrier, při jejichž nastavení se ARP cache a tabulka ndisc (neighbor discovery) vyčistí v případě přerušení spojení (NOCARRIER).
- Do mechanismu správy síťových front fq_codel (Controlled Delay) byly přidány režimy Low Latency, Low Loss a Scalable Throughput (L4S).
- Hardware
- V ovladači amdgpu byla implementována základní podpora specifikace DP 2.0 (DisplayPort 2.0) a možnost tunelování DisplayPort přes USB4. Pro APU Cyan Skillfish (vybaveny GPU Navi 1x) byla přidána podpora displejových ovladačů. Byla rozšířena podpora pro APU Yellow Carp (mobilní procesory Ryzen 6000 „Rembrandt“).
- V ovladači i915 byla stabilizována podpora čipů Intel Alderlake S a byla implementována podpora technologie Intel PXP (Protected Xe Path), která umožňuje organizovat práci s hardwarem chráněnou grafickou relací na systémech s čipy Intel Xe.
- V ovladači nouveau byly provedeny opravy chyb a vylepšení stylu kódu.
- Byla přidána podpora pro CPU Vortex kompatibilní s x86 (Vortex86MX). Linux na těchto procesorech fungoval i dříve, ale explicitní identifikace uvedených CPU byla potřeba pro vypnutí ochrany proti útokům Spectre/Meltdown, které se na tyto čipy nevztahují.
- Byla přidána počáteční podpora pro x86 platformy Surface Pro 8 a Surface Laptop Studio.
- Byl přidán ovladač pro podporu zvukových čipů používaných v APU AMD Yellow Carp, Van Gogh, byl také přidán podporovaný zvukových systémů a kodeků Cirrus CS35L41, Maxim MAX98520/MAX98360A, Mediatek MT8195, Nuvoton NAU8821, NVIDIA Tegra210, NXP i.MX8ULP, Qualcomm AudioReach, Realtek ALC5682I-VS, RT5682S, RT9120, Rockchip RV1126 a RK3568.
- Byl přidán ovladač ishtp_eclite pro přístup k vestavěným řadičům Intel PSE (Programmable Service Engine) pomocí protokolu ISHTP (Integrated Sensor Hub Transport Protocol), například pro získání dat o baterii, teplotě a informacích souvisejících s UCSI (USB Type-C Connector System Software Interface).
- Byl přidán ovladač pro herní ovladače Nintendo Switch, který podporuje zařízení Switch Pro a Joy-Cons. Byla přidána podpora pro tablety Wacom Intuos BT (CTL-4100WL/CTL-6100WL) a klávesnici Apple 2021 Magic Keyboard. Byla zlepšena podpora ovladačů Sony PlayStation DualSense. Byla přidána podpora pro boční tlačítka myši Xiaomi Mi.
- Byl přidán ovladač RT89 s podporou bezdrátových čipů Realtek 802.11ax a také ovladače pro Ethernet adaptéry Asix AX88796C-SPI a switch Realtek RTL8365MB-VC.
- Pro čipy Apple M1 byly přidány ovladače pro PCI a PASemi i2c.
- Byla přidána podpora pro ARM SoC, zařízení a desky 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 a Xiaomi Mi 5), Sony Yoshino (Sony Xperia XZ1 a 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.
Zdroj: opennet.ru
