Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 7.2. Wśród najbardziej znaczących zmian znajdują się: mechanizm przesyłania danych USB4STREAM, optymalizacje wydajności btrfs, xfs i ext4, kontynuacja usuwania kodu obsługującego procesory i486, możliwość tworzenia zagnieżdżonych planistów SCHED_EXT, zmniejszone zużycie pamięci w podsystemie wymiany, przyspieszone kanały bez nazw oraz wsparcie dla rozszerzeń Intel MBEC i AMD GMET w KVM, usunięcie protokołu AppleTalk oraz wstępne wsparcie HDMI 2.1 FRL w sterowniku AMDGPU.
Główne nowości w jądrze 7.2 (1, 2, 3):
- Podsystem dyskowy, wejście/wyjście i systemy plików
- W mechanizmie iomap usunięto zbędne wywołanie funkcji memset dla zakończonych iteracji w funkcji iomap_iter(), co przy dużej intensywności wejścia/wyjścia na szybkim dysku NVMe zwiększyło w przeprowadzonych testach liczbę operacji wejścia/wyjścia na sekundę (IOPS) o 5% przy użyciu systemów plików ext4 i xfs.
- W XFS ogłoszono stabilne wsparcie dla zaryzowanych urządzeń pamięci masowej (podział na strefy grup bloków lub sektorów, do których dozwolone jest tylko sekwencyjne dodawanie danych z aktualizacją całej grupy bloków).
- W Btrfs domyślnie włączono wsparcie dla dużych stron pamięci (large folios), co pozwala zredukować narzuty i poprawić wydajność przy intensywnym sekwencyjnym prowadzeniu operacji we/wy. Dodano eksperymentalne wsparcie dla ogromnych stron (huge folios) o rozmiarze do 2 MB. Dodano nowy ioctl GET_CSUMS do uzyskiwania informacji o sumach kontrolnych w przestrzeni użytkownika, na przykład dla narzędzia mkfs i optymalizacji deduplikacji. Poprawiono wydajność sekwencyjnego zapisu danych o 15% oraz bezpośrednich operacji we/wy o 59%.
- W systemie plików Ext4 znacząco przepracowano implementację mechanizmu „fast commit”, aby wyeliminować ryzyko wystąpienia blokad konkurencyjnych i wzajemnych. Dodano eksport statystyk dotyczących migawków inode przez /proc/fs/ext4/*/fc_info. Zoptymalizowano wydajność obliczania skrótów katalogów (dla nazw o długości 255 znaków przyspieszenie prawie dwukrotnie, 64 znaki 27%, 32 znaki — 11%).
- W F2FS dodano wsparcie dla zwracania błędów fserror, umożliwiających śledzenie problemów z systemem plików z przestrzeni użytkownika. Skrócono czas spędzany w kontekście obsługi przerwań.
- W Device Mapper (DM) dodano nowe przetwarzanie dm-inlinecrypt do organizacji przezroczystego szyfrowania i deszyfrowania urządzeń blokowych, wykorzystując sprzęt z funkcją szyfrowania inline.
- Proponowana dokumentacja dotycząca dodawania nowych systemów plików do jądra.
- W NFS domyślny rozmiar bloku zwiększono do 4 MB na systemach z co najmniej 16 GB RAM (do ręcznej zmiany rozmiaru bloku można użyć /proc/fs/nfsd/max_block_size). Dodano wsparcie dla delegowania zarządzania katalogiem klientowi, co pozwala na wykonywanie operacji na danym katalogu przez pewien czas bez sprawdzania zmian stanu. serwerze.
- W serwerze SMB dodano wsparcie dla plików przechowywanych w formie skompresowanej oraz kompresji danych podczas ich przesyłania przez sieć.
- W nowej implementacji NTFS (ntfsplus) dodano wsparcie dla linków symbolicznych Windows i zapewniono prawidłowe przetwarzanie wielu rodzajów uszkodzeń metadanych.
- Usunięto backend fscache do buforowania danych systemu plików EROFS (Enhanced Read-Only File System), który został ogłoszony przestarzałym dwa lata temu.
- W systemie plików Ceph dodano wsparcie dla ręcznego resetowania sesji klientów.
- W systemie plików 9P wprowadzono optymalizacje, które przyspieszyły działanie w takich scenariuszach, jak kompilacja projektów.
- W wywołaniu systemowym file_getattr() dodano flagi do uzyskiwania informacji o uwzględnianiu wielkości liter w systemie plików. Flaga FS_XFLAG_CASEFOLD świadczy, że sprawdzanie nazw plików odbywa się bez uwzględnienia wielkości liter, a flaga FS_XFLAG_CASENONPRESERVING oznacza, że przy tworzeniu nowych nazw plików nie zachowuje się informacji o wielkości liter. Wskazane flagi mogą być stosowane w klientach NFS pracujących bez uwzględniania wielkości liter.
- W wywołaniu systemowym openat2() dodano flagę O_EMPTYPATH, zezwalającą na przekazywanie pustej ścieżki pliku. W takim przypadku ścieżka do otwieranego pliku jest określana na podstawie przekazanego deskryptora pliku.
- W wywołaniu systemowym openat2() dodano flagę OPENAT2_REGULAR, która zezwala na otwieranie tylko zwykłych plików (przy próbie otwarcia specjalnego pliku, na przykład gniazda, potoku lub urządzenia, zwrócony zostanie błąd EFTYPE).
- Pamięć i usługi systemowe
- Wdrażony mechanizm USB4STREAM do przesyłania danych między komputerami połączonymi kablem przez porty USB4. Dodano urządzenie /dev/tbstreamX, za pomocą którego można odczytywać i zapisywać dane, korzystając z typowych funkcji read() i write() podobnie jak w przypadku odczytu i zapisu do plików. Na przykład, na jednym hoście można wysłać informacje komendą „echo hello > /dev/tbstream0”, a na drugim odczytać je komendą „cat /dev/tbstream0”. Mechanizm USB4STREAM może być łączony z możliwością nawiązania połączenia sieciowego przez kabel USB4 (thunderbolt_net) lub używany osobno w przypadku potrzeby przesyłania danych między aplikacjami, które nie obsługują gniazd sieciowych.
- Włączono drugą serię zmian mających na celu zakończenie wsparcia dla procesorów i486. Usunięto ponad 13 linii kodu dotyczących emulacji bloku do obliczeń z liczbami zmiennoprzecinkowymi dla procesorów bez FPU. Usunięto wsparcie dla procesorów i486 bez operacji sprzętowych CX8 (porównaj i wymień 8 bajtów) oraz TSC (licznik cykli CPU używany w harmonogramie zadań), kod do emulacji, którego został usunięty.
- Ogłoszono brak dalszego wsparcia (osierocone) dla procesorów AMD Geode, używanych w komputerze OLPC XO-1.
- Dodano wsparcie dla aktualizacji realizacji mechanizmu Intel TDX (Trusted Domain Extensions), stosowanego do szyfrowania pamięci operacyjnej systemów gościnnych. TDX wdrażany jest w formie specjalnego modułu runtime, który podczas rozruchu przenosi BIOS z pamięci Flash do pamięci operacyjnej. Do jądra dodano możliwości zarządzania tym modułem i wymiany na nowszą wersję w działającym systemie bez potrzeby ponownego uruchamiania.
- Wprowadzono nowy harmonogram przydziału zasobów GPU (Fair GPU scheduler), który służy do określania kolejności wykonywania zadań na GPU, wysyłanych przez procesy korzystające z GPU. Zamiast stosowania tradycyjnej kolejki FIDO dla żądań do GPU, nowy harmonogram wykorzystuje mechanizmy sprawiedliwego przydziału zasobów, inspirowane harmonogramem CFS (Completely Fair Scheduler), który stosuje plan wykonania z czasem przejścia do realizacji kolejnego procesu. Najbardziej zauważalny efekt przy zastosowaniu nowego harmonogramu występuje podczas równoległego wykonywania interaktywnych zadań intensywnie korzystających z GPU. W ostatniej chwili przed wydaniem jądra 7.2 włączenie Fair GPU scheduler zostało odwołane, a stary FIFO-harmonogram został przywrócony z powodu konieczności debugowania regresji, prowadzącej do spadku wydajności i 100% obciążenia GPU podczas uruchamiania poszczególnych gier w Proton.
- Zmiany w podsystemie eBPF: Dodano możliwość przypisywania jednego programu BPF do kilku punktów śledzenia (tracepoint). Programy BPF przypisane do punktów śledzenia zyskały możliwość dostępu do pamięci komponentów działających w przestrzeni użytkownika, z prawidłowym obsługiwaniem odniesień do nieprzydzielonych stron pamięci (page fault). Do wywołania systemowego bpf() dodano wsparcie dla typowych atrybutów (log_buf, log_size, log_level i log_true_size), co umożliwia ujednolicenie przekazywania metadanych we wszystkich poleceniach BPF, nie ograniczając się do poleceń BPF_PROG_LOAD, BPF_BTF_LOAD i BPF_MAP_CREATE. Usunięto ograniczenie dotyczące przekazywania nie więcej niż 5 parametrów w funkcji BPF. Dodano możliwość bezpiecznego dostępu do pamięci współdzielonej bpf_arena bez obawy o odwołania do nieprzydzielonych stron pamięci (page fault). Wprowadzono nową wersję struktury BPF hash map, pozwalającą na dynamiczną zmianę rozmiaru.
- Optymalizowano generowanie wyjścia „/proc/interrupts” z danymi statystycznymi o przerwaniach, a także zmodernizowano struktury przechowujące liczniki przerwań oraz dodano cache.
- Przyspieszono generację pliku „/proc/filesystems”, używanego w libselinux.
- W narzędziu planowania zadań wprowadzono wsparcie dla balansowania obciążenia między rdzeniami CPU, uwzględniając stany wewnętrznej pamięci podręcznej procesora. Planista teraz stara się grupować procesy korzystające z wspólnych zasobów, takich jak wątki jednego procesu, aby korzystać z tego samego poziomu pamięci podręcznej, co zwiększa efektywność dostępu do danych dzięki wyższej prawdopodobieństwu znalezienia potrzebnych danych w pamięci podręcznej.
- W mechanizmie SCHED_EXT, który umożliwia użycie BPF do tworzenia planistów CPU, kontynuowano realizację możliwości tworzenia zagnieżdżonych planistów (sub-scheduler), w ramach których dla każdej cgroup można wykorzystać własny planista zadań.
- Kontynuowany jest transfer zmian z gałęzi Rust-for-Linux, związanych z użyciem języka Rust jako drugiego języka do tworzenia sterowników i modułów jądra (wsparcie dla Rust nie jest domyślnie aktywne i nie powoduje dodania Rust do obowiązkowych zależności budowlanych jądra). Możliwość użycia Rust w jądrze została zrealizowana dla architektury s390. Dołączono pakiet 'zerocopy' z szybkimi prymitywami pracy z pamięcią dla kodu w trybie 'unsafe'.
- Minimalna wersja narzędzi LLVM wymagana do kompilacji jądra została podniesiona do 17.0.1.
- W minimalistycznej bibliotece C nolibc, dołączanej do źródeł jądra Linux, która zapewnia powłokę nad podstawowymi wywołaniami systemowymi, wprowadzono wsparcie dla architektur OpenRISC oraz 32-bit PA-RISC.
- W subsystenie swap wprowadzono optymalizacje zwiększające wydajność i zmniejszające zużycie pamięci, eliminując koszty przechowywania statycznych metadanych i unifikując pracę z pamięcią anonimową i dzieloną przy użyciu dużych stron. Zużycie pamięci znacznie spada, na przykład przy montowaniu partycji swap o rozmiarze 1 TB zaobserwowano spadek zużycia pamięci o około 512 MB.
- Zwiększono wydajność mechanizmu wymiany pamięci, który usuwa lub przenosi obszary pamięci do swapu, aby zwolnić pamięć w przypadku jej braku w systemie. W niektórych scenariuszach obciążenia, na przykład w testach MongoDB za pomocą YCSB (Yahoo! Cloud Serving Benchmark), odnotowano wzrost wydajności o 30%.
- Do systemu składania dodano polecenie „make sbom”, które generuje listy SBOM (Software Bill Of Materials) odzwierciedlające komponenty, biblioteki i zależności użyte w bieżącym składaniu jądra oraz informacje o ich licencjach uzyskane z nagłówków SPDX w plikach z kodem.
- W implementacji kanałów anonimowych (pipe) zoptymalizowano pracę z blokadami (operacje przydzielania pamięci przeniesiono poza obszar blokady), co zwiększyło przepustowość kanałów anonimowych o 21-48% i zmniejszyło opóźnienia o 17-33%.
- Wirtualizacja i bezpieczeństwo
- Do mechanizmu alokacji pamięci slab (slab allocator) dodano możliwość użycia tokenów alokacji pamięci (Allocation Token), wprowadzonych w kompilatorze Clang 22. Tokeny pozwalają oznaczyć unikalnymi identyfikatorami operacje alokacji pamięci oraz zorganizować oddzielne rozmieszczenie różnych typów obiektów, aby utrudnić eksploatację luk związanych z przepełnieniem bufora (przy podziale przepełnienie bufora w jednym typie obiektów nie jest tak łatwo wykorzystać do uszkodzenia innych typów obiektów).
- Mechanizm AF_ALG, wykorzystywany w luce Copy Fail do modyfikacji danych w pamięci podręcznej stron, został ogłoszony przestarzałym i zaplanowany do usunięcia w jednym z przyszłych wydania. AF_ALG pozwala na wykorzystanie sprzętowych akceleratorów do obliczeń kryptograficznych w Crypto API jądra, ale stosowany jest w dość specyficznych sytuacjach. W jądrze 7.2 w AF_ALG usunięto wsparcie dla asynchronicznego wejścia/wyjścia, starych sterowników oraz mechanizmu zero-copy w implementacji skcipher i aead. Pozostały jedynie programowe implementacje algorytmów kryptograficznych, a wsparcie dla sprzętowych akceleratorów kryptograficznych w crypto API jądra usunięto, ponieważ AF_ALG znacznie zwiększa powierzchnię ataku, ale nie przynosi korzyści wydajności w porównaniu z implementacją kryptografii w przestrzeni użytkownika. AF_ALG był wykorzystywany w narzędziu Cryptsetup, ale jego wsparcie zostało usunięte w niedawnym wydaniu 2.8.7.
- Do mechanizmu IMA (Integrity Measurement Architecture), który umożliwia zewnętrznej usłudze weryfikację stanu podsystemów jądra w celu upewnienia się o ich autentyczności, dodano wsparcie dla eksportu wewnętrznych tabel z wynikami pomiarów do przestrzeni użytkownika z usunięciem z buforów jądra w celu oszczędności pamięci.
- W module Landlock, który zapewnia nieuprzywilejowanym programom środki do ograniczania użycia obiektów jądra Linux (hierarchie plików, gniazda sieciowe, ioctl itp.), dodano wsparcie dla zarządzania dostępem do gniazd UDP oraz możliwość selektywnego wyłączania rejestrowania informacji o blokadzie obiektów, aby zapobiec zaśmieceniu logów nieistotnymi informacjami.
- Jądro pozbyło się funkcji strncpy(), która kopiuje określoną liczbę bajtów z wejściowego ciągu. Użycie strncpy() stwarzało ryzyko wystąpienia błędów z powodu pominięcia symbolu null na końcu ciągu lub niewłaściwego wypełnienia zerami. Zamiast strncpy() zaleca się stosowanie funkcji strscpy() i strscpy_pad() do kopiowania ciągów kończących się symbolem null, a także strtomem_pad(), memcpy_and_pad() i memcpy() do kopiowania ciągów o znanym stałym rozmiarze. Prace nad usunięciem strncpy() z jądra rozpoczęto w 2020 roku i wymagano wprowadzenia 362 zmian od 70 deweloperów.
- W hipernadzorze KVM dodano wsparcie dla rozszerzeń Intel MBEC (Mode-Based Execution Control) i AMD GMET (Guest-Mode Execution Trap), co pozwala w tabelach translacji pamięci oddzielnie obsługiwać prawa do wykonywania kodu dla jądra i przestrzeni użytkownika w systemach gościnnych. Wcześniej rozszerzenia sprzętowej wirtualizacji Intel i AMD pozwalały oznaczać strony pamięci jako dostępne do wykonania tylko jednym bitem z programowym podziałem praw dla jądra i przestrzeni użytkownika na poziomie hipernadzorca. Użycie MBEC i GMET umożliwia wyeliminowanie weryfikacji uprawnień po stronie hipernadzorcy i znaczne ograniczenie intensywności zasobochłonnej transmisji kontroli z systemu gościnnego do hipernadzorca VMexit.
- Subsystem sieciowy
- Implementacja rozszerzenia TCP-AO (TCP Authentication Option, RFC 5925) została przeniesiona na nową bibliotekę kryptograficzną libcrypto, co umożliwiło uproszczenie kodu i zwiększenie efektywności działania. TCP-AO pozwala na weryfikację nagłówków TCP za pomocą kodów MAC (Message Authentication Code), wykorzystując nowocześniejsze algorytmy HMAC-SHA-1-96 i AES-128-CMAC-96 zamiast wcześniej dostępnej opcji TCP-MD5, bazującej na przestarzałym algorytmie MD5.
- Liczba subwątków wspieranych dla połączeń Multipath TCP (MPTCP) zwiększona z 8 do 64.
- Kontynuowano prace nad ograniczeniem użycia globalnej blokady rtnl_lock w stosie sieciowym jądra.
- Z jądra usunięto realizację stosu protokołów AppleTalk, który był wykorzystywany w komputerach Apple od 1985 roku i w latach 90-tych został zastąpiony TCP/IP. Oprócz tego usunięto komponenty technologii przesyłu danych ATM, które nie były związane z PPPoATM, a także interfejsy sieciowe ARCnet oparte na magistralach ISA i PCMCIA, adaptery Bluetooth z interfejsem PCMCIA, akceleratory TLS Chelsea, kod do integracji TLS z sockmap oraz wsparcie dla pasm częstotliwości 5/10 MHz w bezprzewodowym stosie cfg80211/mac80211. Z powodu nierozwiązanych problemów z blokadami i braku wsparcia usunięto specyficzną realizację przyspieszania przetwarzania TLS opartą na TCP Offload Engine (bardziej powszechna realizacja offload TLS została zachowana). Wyłączono i zaplanowano do usunięcia kod zgodności z 32-bitowymi x_tables w systemach 64-bitowych.
- W sterowniku pppoe dodano wsparcie dla mechanizmów GRO (Generic Receive Offload) i GSO (Generic Segmentation Offload) w celu sprzętowego przyspieszenia rekonstrukcji i segmentacji pakietów. Użycie GRO i GSO pozwala znacznie zwiększyć przepustowość dla ruchu przychodzącego, na przykład na urządzeniach MediaTek MT7621 w konfiguracji z translacją adresów maksymalna przepustowość wzrosła z 130 Mbit/s do 630 Mbit/s.
- Sprzęt
- W sterowniku AMDGPU pojawiło się wstępne wsparcie dla technologii HDMI 2.1 FRL (Fixed Rate Link), która umożliwia przesyłanie nieskompresowanego wideo w jakości 4K/120Hz oraz 8K/60Hz. Wcześniej wsparcie dla HDMI 2.1 nie było możliwe do zrealizowania w otwartych sterownikach z powodu wymogów licencyjnych HDMI Forum, jednak teraz firmie AMD udało się uzgodnić taką realizację.
- W sterowniku i915 dodano wsparcie dla ustawiania koloru tła przez kontroler wyświetlania. Zrealizowano parametr pin_params.needs_low_address.
- Kontynuowano prace nad drm-sterronnym (Direct Rendering Manager) Xe dla GPU opartego na architekturze Intel Xe, która jest wykorzystywana w kartach graficznych Intel rodziny Arc oraz grafice zintegrowanej, począwszy od procesorów Tiger Lake. Dodano wstępne wsparcie dla platformy CRI (Crescent Island). Dla platform dGPU Xe3p zrealizowano kontroler systemowy.
- W sterowniku Nouveau rozwiązano problemy z GPU NVIDIA GA100.
- W sterowniku v3d dodano możliwość zarządzania poborem mocy v3D GPU na płytach Raspberry Pi.
- Kontynuacja integracji komponentów sterownika Nova dla GPU NVIDIA, wyposażonych w firmware GSP, stosowanych od serii NVIDIA GeForce RTX 2000 opartej na mikroarchitekturze Turing. Sterownik napisano w języku Rust. Dodano wsparcie dla GPU NVIDIA GA100 oraz serii Hopper i Blackwell.
- Dodano wsparcie dla platform ARM, SoC i urządzeń: 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.
W tym samym czasie latynoamerykańska Fundacja Wolnego Oprogramowania stworzyła wersję w pełni wolnego jądra 7.2 — Linux-libre 7.2-gnu, oczyszczonego z elementów firmware i sterowników zawierających nierozwolnione komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W wydaniu 7.2 dokonano oczyszczenia z blobów nowych sterowników rt722-sdca i tac5xx2. Zaktualizowano kod czyszczenia w sterownikach amdgpu, nova core, qcom iris, q6v5, iwlwifi, amdxnda, adreno, r8152 oraz mt792x. Dokonano korekty interfejsów do ładowania firmware. Przeprowadzono czyszczenie nazw blobów w plikach dts (devicetree) dla chipów ARM.
Źródło: opennet.ru
