Po dvou měsících vývoje představil Linus Torvalds vydání jádra Linux 6.11. Mezi nejvýraznějšími změnami: podpora atomárních zápisových operací na blokové úrovni, podpora operací bind() a listen() v io_uring, nový mechanismus blokování softwarových zpracovatelů přerušení, možnost zápisu do odrazově zrcadlených spustitelných souborů, podpora psaní ovladačů blokových zařízení v jazyce Rust, optimalizace volání getrandom(), nová implementace AES-GCM.
Do nové verze bylo zahrnuto 15130 oprav od 2078 vývojářů, velikost patche je 85 MB (změny zasáhly 13282 souborů, přidáno 985857 řádků kódu, odstraněno 268915 řádků). V minulém vydání bylo 14564 oprav od 1989 vývojářů, velikost patche byla 41 MB (dvojnásobně méně než patch pro jádro 6.11). Přibližně 46 % všech prezentovaných změn v 6.11 souvisí s ovladači zařízení, asi 17 % změn se týká aktualizace kódu specifického pro hardwarové architektury, 10 % souvisí se síťovým stakem, 5 % s filesystémy a 3 % s interními subsystémy jádra.
Hlavní novinky v jádře 6.11:
- Diskový subsystém, vstup/výstup a souborové systémy
- Byla zavedena podpora atomárních zápisových operací na blokové úrovni, při které je na úložiště zapsán buď celý specifikovaný soubor bloků, nebo žádný z bloků, což umožňuje chránit se proti situacím, kdy po selhání hardwaru je zapsána pouze část bloků, zatímco ve zbytku zůstává stará informace. Pro aktivaci atomárního režimu zápisu byl do systémového volání pwritev() přidán příznak RWF_ATOMIC. Informace o podpoře atomárního zápisu (atomic_write_unit_min, atomic_write_unit_max a atomic_write_segments_max) vázané na jednotlivé soubory lze získat pomocí funkce statx().
- Byla zavedena podpora zápisu do spustitelných souborů, které jsou spojeny s běžícími procesy. Dříve, stejně jako v jiných Unixových systémech, jádro vyhazovalo chybu při pokusu o zápis do spustitelného souboru spuštěného procesu. Tento limit byl odstraněn, protože postrádal praktický smysl.
- Byla zavedena možnost vývoje ovladačů blokových zařízení v jazyce Rust. Jako příklad byl do jádra přidán ovladač rnull, který představuje analog ovladače null_blk napsaného v jazyce Rust.
- V souborovém systému Btrfs byla v montovací možnosti „rescue=“ implementována podpora nových režimů „ignoremetacsums“ a „ignoresuperflags“, které lze použít k přesunu některých kontrol do uživatelského prostoru při obnově FS po selhání. Realizace operace dynamického vracení blokových skupin byla přepracována, aby se vyloučila situace nedostatku volného místa za podmínek neúplného zaplnění FS.
- V souborovém systému ntfs3 byla implementována podpora atributů „compressed“ a „immutable“, které definují komprimované a neměnné soubory.
- Ve FS F2FS a Ext4 byla zjednodušena zpracování názvů souborů bez ohledu na velikost písmen (casefold) prostřednictvím ukládání názvů ve formě qstr-řetězců bez zbytečných úprav velikosti písmen.
- Ve FS Ext4 byla realizace funkce jbd2_transaction_committed optimalizována pro zvýšení výkonu na velmi rychlých úložištích (v testech byl zaznamenán nárůst zpracovávaných operací za sekundu dosahující 20%).
- V systémovém volání statx() bylo povoleno předat ukazatel NULL namísto prázdného řetězce s cestou k souboru, pokud je nastaven příznak AT_EMPTY_PATH.
- V systémovém volání open_by_handle_at() byla uvolněna kontrola přístupových práv k souboru, pokud chybí oprávnění CAP_DAC_READ_SEARCH pro hledání v počátečním jmenném prostoru. Dřívější požadavek na oprávnění CAP_DAC_READ_SEARCH pro počáteční jmenný prostor znemožnil použití systémového volání open_by_handle_at() v kontejnerech.
- Byly rozšířeny možnosti systémových volání listmount() a statmount(). V listmount() byl přidán příznak LISTMOUNT_REVERSE pro zobrazení obsahu tabulky montovacích bodů v opačném pořadí (nejnovější zápisy nahoře). V statmount() byl realizován výstup možností nastavených při montování FS. V obou systémových voláních byl povolen provoz při absenci přístupu k počátečnímu jmennému prostoru (když je k dispozici pouze přístup k místnímu nebo externímu jmennému prostoru).
- Ve FS Bcachefs byla implementována podpora automatického průhledného obnovování poškozených dat pomocí kódů pro obnovu chyb – pokud při čtení dojde k chybě vstupu/výstupu nebo byla vypočtena nesrovnalost kontrolního součtu, problémový blok dat je automaticky přepsán při dostupnosti redundantních dat pro jeho obnovu.
- Paměť a systémové služby
- Byla přijata oprava, která implementuje nový mechanismus blokování softwarových zpracovatelů přerušení (BH, bottom-half), který zajišťuje blokaci používaných datových struktur, aniž by však blokoval paralelní provádění nepříbuzného kódu. Bylo poznamenáno, že změna nejen snížila latenci pro jádra pracující v reálném čase, ale také zvýšila výkon běžných jader (například v některých typech zátěže došlo k nárůstu výkonu síťového subsystému o 14,5 %).
- Do subsystému asynchronního vstupu/výstupu io_uring byla přidána podpora operací pro implementaci funkcí bind() a listen(), které se používají pro vytváření přijímajících spojení síťových socketů.
- Byla přidána sada ioctl operací pro pseudo-FS NSFS (NameSpace FS), používanou pro práci s prostorami názvů. Nové ioctl umožňují převádět identifikátory procesů a skupin vláken mezi různými prostory názvů identifikátorů procesů (PID namespace). Podobné ioctl, které na základě pidfd identifikátorů určují souborové popisovače procesů v jednotlivých prostorách názvů, byly také přidány do pseudo-FS pidfd.
- Pro BPF programy byla přidána podpora nového iterátoru pro práci s bitovými maskami, který lze použít například pro procházení jednotlivých bitů v paměťových oblastech, jako je cpumask. Byl přidán mechanismus pro odesílání procesům v uživatelském prostoru upozornění na odpojení (detach/unregister) objektu struct_ops. Rozšířil se spektrum typů, které lze používat v polích (například nyní lze deklarovat pole s prvky typu kptr, bpf_rb_root a bpf_list_head). Byl navržen spolehlivější mechanismus Split BTF (BPF Type Format), který se používá pro ověřování typů v pseudokódu BPF.
- Byl přidán subsystém, který umožňuje organizovat dodávku energie do zařízení v určeném pořadí, pro případy, kdy musí být jedno zařízení aktivováno dříve než jiné (například při aktivaci bezdrátových čipů na platformách Qualcomm).
- Byl přidán modul „Sloppy logic analyzer“, který umožňuje vytvářet jednoduché logické analyzátory signálu, které používají GPIO a pracují na samostatném jádru CPU.
- Byla přidána podpora runtime konstant, které mohou být používány místo proměnných, jež jsou inicializovány jednou. Například, runtime konstanty mohou být aplikovány místo proměnných, které uchovávají ukazatel a velikost pro cache dentry. Tyto proměnné jsou nastaveny během načítání a poté se nikdy nemění. Myšlenkou je vložit hodnoty podobných proměnných přímo do instrukcí v kódu, čímž se vyloučí náklady spojené s manipulací s ukazateli.
- Pokračuje přenos změn z větve Rust-for-Linux, týkajících se používání jazyka Rust jako druhého jazyka pro vývoj ovladačů a modulů jádra (podpora Rustu není ve výchozím nastavení aktivní a nevede k tomu, že by Rust byl součástí povinných závislostí pro sestavení jádra). Byla přidána podpora vydání Rust 1.80 (jako minimální verze se stále podporuje Rust 1.78). Kromě již dříve zmíněných prostředků pro vývoj ovladačů blokových zařízení, byla v nové verzi přidána abstrakce pro načítání firmwaru, přístup k prostoru uživatele (uaccess) a práci se strukturou „page“.
- Pro systémy x86-64 byl implementován nový systémový systémový volání uretprobe(), který optimalizuje fungování mechanismu sledování uretprobe, což umožňuje sledovat hodnoty vracené funkcemi v aplikacích prostoru uživatele.
- Byly přidány parametry příkazové řádky jádra: „reserve_mem“ pro rezervaci pojmenované oblasti paměti během bootování a „ramoops.mem_name“ pro použití v pstore oblasti paměti vytvořené prostřednictvím reserve_mem.
- Do paměťového kontroleru na bázi cgroup byl do souboru memory.reclaim přidán parametr „swappiness“, který umožňuje měnit rovnováhu mezi vyhrazováním anonymních stránek paměti do swapu a uvolňováním stránek paměti, které jsou obsazeny souborovým cache.
- Byl přidán ioctl rozhraní PROCMAP_QUERY pro efektivnější hledání virtuálních oblastí paměti (Virtual Memory Area) v /proc/PID/maps.
- Do systémového volání mmap() byl přidán flag MAP_DROPPABLE pro požadování paměti, která nikdy nebude přesunuta do swapu, a v případě nedostatku paměti může být odstraněna.
- Pro architekturu ARM64 byla implementována podpora horkého připojení (přepnutí do režimů online/offline) fyzických a virtuálních CPU v systémech s ACPI.
- Pro architekturu RISC-V byla zajištěna podpora horkého připojení paměti a přidána podpora pluginu GCC STACKLEAK (provádí inicializaci všech proměnných uložených na zásobníku, aby se zabránilo úniku informací z jádra skrze neiničalizované proměnné, které mohou obsahovat zbytky dříve uložených dat na zásobníku).
- Byl odstraněn mechanismus falešného mapování paměti EFI (fake EFI memory map) při spuštění. Tento mechanismus nebyl v praxi využíván a bránil vývoji v oblasti důvěrného zpracování. virtuálních strojů.
- Byla ukončena podpora platformy PowerPC 40x.
- Byly zvýšeny požadavky na verzi GNU Make — pro sestavení jádra je potřeba alespoň vydání GNU Make publikované v roce 2013.
- Virtualizace a bezpečnost
- Byly integrovány patche, které významně (až 15krát) zrychlují generování náhodných čísel skrze systémový volání getrandom(). Optimalizace je založena na použití mechanismu vDSO (virtual dynamic shared object), který umožňuje přesunout obslužnou rutinu systémového volání z jádra do uživatelského prostoru a vyhnout se přepínačům kontextu. Implementace systémového volání je načtena do adresního prostoru procesu přímo jádrem.
- Pro systémy x86-64 byla zahrnuta nová implementace šifrovacího algoritmu AES-GCM, která podporuje použití vektorových instrukcí VAES, VPCLMULQDQ a AVX512/AVX10 pro zrychlení výpočtů. V provedených testech dosáhla výkonnostní zisk po přechodu na novou implementaci až 156 %. Assemblerová implementace AES-GCM byla kompletně přepracována s ohledem na správnost, výkon, velikost a důkladnou dokumentaci kódu.
- Byla realizována možnost spuštění jádra jako hostujícího systému ve virtualizovaných prostředích s použitím procesorové rozšíření AMD SEV-SNP (Secure Nested Paging), které je určeno k zajištění bezpečné práce s vloženými tabulkami stránek paměti. Pro dodatečnou izolaci přístupu k prostředkům z virtuálních strojů může být použit modul SVSM (Linux Secure VM Service Module). V hypervizoru KVM byla přidána počáteční podpora spuštění hostujících systémů chráněných pomocí AMD SEV-SNP.
- Byl přidán samostatný alokátor slabých svazků (bucket slab allocator), který se aktivuje pomocí parametru CONFIG_SLAB_BUCKETS a zajišťuje ochranu proti útokům využívajícím techniku „heap spraying“.
- Do hypervisor KVM byl přidán ioctl-vý volání pro předběžné přidělování paměti hostitelskému systému před jeho skutečným spuštěním.
- Síťová subsystém
- Byl přidán sysctl parametr net.tcp_rto_min_us, kterým lze nastavit minimální časový limit opakování (retransmission timeout) pro TCP sokety.
- Do utilit ethtool byla přidána možnost jemného ladění konfigurace obsluhy přerušení pro síťová rozhraní využívající rozhraní Net DIM.
- Hardware
- V ovladači AMDGPU byla zahrnuta počáteční podpora GPU AMD RDNA4 („GFX12“). Byla přidána podpora technologií DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 a MMHUB 4.1.
- Pokračuje práce na drm-ovladači (Direct Rendering Manager) Xe pro GPU založené na architektuře Intel Xe, která se používá ve grafických kartách Intel rodiny Arc a integrované grafice, počínaje procesory Tiger Lake. Byla vylepšena podpora GPU založeného na mikroarchitekturách Battlemage, Arrow Lake a Lunar Lake.
- V subsystému DRM (Direct Rendering Manager) byl přepsán obslužný program pro parametry EDID (Extended Display Identification Data) vyžadované monitorem.
- V ovladači i915 byla přidána podpora GPU Battlemage Xe2 a výchozí režim CMRR (Content Match Refresh Rate) byl povolen.
- V DRM-ovladači msm (GPU Qualcomm Adreno) byla přidána podpora platformy SM7150 a GPU X185 a a505.
- Byla přidána podpora obrazovkových panelů Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01, K&d kd101ne3-40ti.
- V zvukovém subsystému byla přidána podpora čipů a kodérů Intel Panther Lake, Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 a Texas Instruments PCM5242.
- Byla provedena finální sada změn zajišťujících podporu ARM SoC Snapdragon X Elite, který používá vlastní 12-jádrový procesor Qualcomm Oryon a GPU Qualcomm Adreno. Čip je navržen pro použití v noteboocích a PC a ve většině výkonových testů předčí čipy Apple M3 a Intel Core Ultra 155H. Přidané změny v jádře 6.11 se týkají podpory GPU Adreno X1-85 a řízení spotřeby energie. Mezi zařízeními založenými na SoC Snapdragon X Elite je deklarována podpora notebooků ASUS Vivobook S15 a Lenovo Yoga Slim7x.
Současně latinskoamerický Fond pro svobodný software vytvořil variantu plně svobodného jádra 6.11 — Linux-libre 6.10-gnu, které bylo očištěno od prvků firmwaru a ovladačů obsahujících nesvobodné komponenty nebo části kódu, jejichž použití je omezeno výrobcem. V vydání 6.11 byl aktualizován kód pro čištění blobů v ovladačích mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth a tas2781. Provedeno čištění nových ovladačů amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 a pcie-rcar-gen4. Bylo provedeno čištění názvů blobů v dts-souborech (devicetree) pro architekturu Aarch64. Přidána verze primitiv pro načítání firmwaru, která nevydává varování a požadavky (nowait-nowarn). Přidán kód pro určení primitivů načítání firmwaru v kódu jazyka Rust.
Zdroj: opennet.ru
