Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 5.19. Wśród najbardziej zauważalnych zmian znajdują się: wsparcie dla architektury procesora LoongArch, integracja poprawek „BIG TCP”, tryb „on-demand” w fscache, usunięcie kodu do obsługi formatu a.out, możliwość zastosowania ZSTD do kompresji firmware, interfejs do zarządzania wymuszaniem pamięci z przestrzeni użytkownika, zwiększenie niezawodności i wydajności generatora liczb pseudolosowych, wsparcie dla rozszerzeń Intel IFS (In-Field Scan), AMD SEV-SNP (Secure Nested Paging), Intel TDX (Trusted Domain Extensions) oraz ARM SME (Scalable Matrix Extension).
W zapowiedzi Linus poinformował, że najprawdopodobniej następnemu wydaniu jądra zostanie nadany numer 6.0, ponieważ w gałęzi 5.x uzbierała się wystarczająca liczba wydań do zmiany pierwszej cyfry numeru wersji. Zmiana numeracji odbywa się z powodów estetycznych i stanowi formalny krok, który eliminuje dyskomfort związany z nagromadzeniem dużej liczby wydań w serii.
Linus wspomniał również, że do stworzenia wydania używał laptopa Apple opartego na architekturze ARM64 (Apple Silicon) z środowiskiem Linux opartym na dystrybucji Asahi Linux. Nie jest to jego podstawowa stacja robocza, ale wykorzystał tę platformę, aby sprawdzić jej przydatność do pracy nad jądrem i mieć pewność, że będzie mógł tworzyć wydania jądra w podróży, mając pod ręką lekki laptop. Wcześniej, wiele lat temu, Linus miał doświadczenie w wykorzystaniu sprzętu Apple do rozwoju - kiedyś korzystał z komputera opartego na CPU ppc970 i laptopa Macbook Air.
W nowej wersji wprowadzono 16401 poprawek od 2190 deweloperów (w poprzednim wydaniu było 16206 poprawek od 2127 deweloperów), rozmiar poprawki wynosi 90 MB (zmiany dotyczyły 13847 plików, dodano 1149456 linii kodu, usunięto 349177 linii). Około 39% wszystkich zmian wprowadzonych w 5.19 dotyczy sterowników urządzeń, około 21% zmian ma związek z aktualizacją kodu specyficznego dla architektur sprzętowych, 11% dotyczy stosu sieciowego, 4% - systemów plików, a 3% - z wewnętrznych subsystemów jądra.
Główne nowości w jądrze 5.19:
- Podsystem dyskowy, wejście/wyjście i systemy plików
- System plików EROFS (Enhanced Read-Only File System), zaprojektowany do stosowania w partycjach dostępnych tylko w trybie do odczytu, został przekształcony w system bazujący na podsystemie fscache, który zapewnia buforowanie danych. Zmiana ta znacznie zwiększyła wydajność systemów, w których wiele kontenerów uruchamianych jest z obrazu opartego na EROFS.
- Podsystem fscache zyskał tryb odczytu na żądanie („on-demand”), który jest stosowany do optymalizacji EROFS. Nowy tryb umożliwia organizację buforowania odczytów z obrazów systemów plików przechowywanych w lokalnym systemie. W przeciwieństwie do pierwotnie dostępnego trybu pracy, który skupiał się na buforowaniu w lokalnym systemie plików danych przesyłanych przez sieciowe systemy plików, tryb „on-demand” deleguje funkcje pobierania danych oraz ich zapisywania w buforze do osobnego procesu w tle, działającego w przestrzeni użytkownika.
- W XFS zapewniono możliwość przechowywania miliardów rozszerzonych atrybutów w i-węźle. Maksymalna liczba extentów dla jednego pliku została zwiększona z 4 miliardów do 247. Wprowadzono tryb dla atomowych aktualizacji wielu rozszerzonych atrybutów pliku jednocześnie.
- W systemie plików Btrfs zoptymalizowano pracę z blokadami, co pozwoliło na zwiększenie wydajności o około 7% przy bezpośrednim zapisie w trybie nowait. Wydajność operacji w trybie NOCOW (bez copy-on-write) wzrosła o około 3%. Zmniejszono obciążenie pamięci podręcznej stron przy działaniu polecenia „send”. Minimalny rozmiar podstron zmniejszono z 64K do 4K (można korzystać z podstron mniejszych niż strony jądra). Zrealizowano przejście z zastosowania drzewa bazowego (radix tree) na algorytm XArrays.
- W serwerze NFS wprowadzono tryb przedłużania utrzymania blokady ustawionej przez klienta, który przestał odpowiadać na zapytania. Nowy tryb pozwala na opóźnienie zwolnienia blokady nawet do 24 godzin, jeśli inny klient nie wystąpi o konkurencyjną blokadę. W normalnym trybie blokada jest zwalniana po 90 sekundach od momentu, gdy klient przestaje odpowiadać.
- W podsystemie śledzenia zdarzeń w FS fanotify wprowadzono flagę FAN_MARK_EVICTABLE, dzięki której można wyłączyć przytrzymywanie docelowych i-węzłów w pamięci podręcznej, na przykład w celu zignorowania poddrzew bez przytrzymywania ich części w pamięci podręcznej.
- W sterowniku systemu plików FAT32 dodano wsparcie dla uzyskiwania informacji o czasie utworzenia pliku za pomocą wywołania systemowego statx, implementującego bardziej efektywną i funkcjonalną wersję stat(), zwracającą rozszerzone informacje o pliku.
- Wprowadzono istotne optymalizacje w sterowniku exFAT związane z równoczesnym czyszczeniem grupy sektorów w aktywnym trybie ‚dirsync’, zamiast sekwencyjnego czyszczenia sektor po sektorze. Dzięki skróceniu liczby zapytań o bloki wydajność tworzenia dużej liczby katalogów na karcie SD wzrosła o ponad 73-85% w zależności od rozmiaru klastra.
- Do jądra dodano pierwszą poprawkę dla sterownika ntfs3. Od momentu dodania ntfs3 do jądra 5.15 w październiku zeszłego roku sterownik nie był aktualizowany, a kontakt z deweloperami został utracony, ale teraz deweloperzy wznowili publikację zmian. W proponowanych poprawkach naprawiono błędy prowadzące do wycieków pamięci i awaryjnych zakończeń, rozwiązano problemy z wykonaniem xfstests, przeprowadzono czyszczenie nieużywanego kodu i poprawiono błędy typograficzne.
- Dla OverlayFS zrealizowano możliwość mapowania identyfikatorów użytkowników zamontowanych systemów plików, stosowane do przyporządkowania plików danego użytkownika na zamontowanej obcym partycji z innym użytkownikiem w bieżącym systemie.
- Pamięć i usługi systemowe
- Dodano wstępne wsparcie dla architektury zestawu instrukcji LoongArch, stosowanej w procesorach Loongson 3 5000 i implementującej nowy RISC ISA, podobny do MIPS i RISC-V. Architektura LoongArch dostępna jest w trzech wariantach: okrojone 32-bitowe (LA32R), standardowe 32-bitowe (LA32S) i 64-bitowe (LA64).
- Usunięto kod do obsługi formatu plików wykonywalnych a.out, który został sklasyfikowany jako przestarzały w wydaniu 5.1. Format a.out od dawna nie jest używany w systemach Linux, a generowanie plików a.out nie jest wspierane przez nowoczesne narzędzia w konfiguracjach dla Linux domyślnie. Ładowarka dla plików a.out może być realizowana całkowicie w przestrzeni użytkownika.
- Wstrzymano wsparcie dla opcji rozruchowych specyficznych dla architektury x86: nosep, nosmap, nosmep, noexec i noclflush).
- Wstrzymano wsparcie dla przestarzałej architektury CPU h8300 (Renesas H8/300), która od dawna nie jest wspierana.
- Rozszerzono możliwości związane z reakcją na wykrywanie rozdzielonych blokad («split lock»), występujących podczas dostępu do niewyrównanych danych w pamięci, gdy w wyniku wykonania atomowej instrukcji dane przekraczają dwie linie cache CPU. Takie blokady prowadzą do znacznego spadku wydajności. Jeśli wcześniej jądro domyślnie emitowało ostrzeżenie z informacjami o procesie powodującym blokadę, to teraz problemowy proces dodatkowo będzie spowolniony, aby zachować wydajność reszty systemu.
- Dodano wsparcie dla zrealizowanego w procesorach Intel mechanizmu IFS (In-Field Scan), który umożliwia uruchamianie niskopoziomowych testów diagnostycznych CPU, zdolnych do wykrywania problemów, które nie są identyfikowane przez standardowe środki oparte na kodach korekcji błędów (ECC) lub bitach parzystości. Wykonywane testy są przedstawiane w formie ładowalnego oprogramowania, podobnie jak aktualizacje mikroprzyczyny. Wyniki testów są dostępne przez sysfs.
- Dodano możliwość osadzenia w jądrze pliku bootconfig, który pozwala na określenie parametrów działania jądra za pomocą pliku konfiguracyjnego, oprócz opcji wiersza poleceń. Osadzenie realizowane jest za pomocą opcji kompilacji 'CONFIG_BOOT_CONFIG_EMBED_FILE="/PATH/TO/BOOTCONFIG/FILE"'. Wcześniej bootconfig był definiowany przez dołączenie do obrazu initrd. Osadzenie w jądrze umożliwia korzystanie z bootconfig w konfiguracjach bez initrd.
- Zrealizowano możliwość ładowania oprogramowania, skompresowanego przy użyciu algorytmu Zstandard. W sysfs dodano zestaw plików kontrolnych /sys/class/firmware/*, które pozwalają zainicjować ładowanie oprogramowania z przestrzeni użytkownika.
- W interfejsie asynchronicznego wejścia/wyjścia io_uring wprowadzono nowy flag IORING_RECVSEND_POLL_FIRST, przy ustawieniu którego operacja sieciowa zostanie najpierw przekazana do przetwarzania z użyciem polling, co może zaoszczędzić zasoby w sytuacjach, gdy dopuszczalna jest opóźniona obróbka operacji. W io_uring dodano również wsparcie dla wywołania systemowego socket(), zaproponowano nowe flagi do uproszczenia zarządzania deskryptorami plików, dodano tryb „multi-shot” do obsługi wielu połączeń w wywołaniu accept(), dodano operacje do przekazywania poleceń NVMe bezpośrednio do urządzenia.
- Dla architektury Xtensa zapewniono wsparcie dla narzędzia debugowania KCSAN (Kernel Concurrency Sanitizer), przeznaczonego do dynamicznego wykrywania stanów wyścigu wewnątrz jądra. Dodano również wsparcie dla trybu uśpienia i współprocesorów.
- Dla architektury m68k (Motorola 68000) wdrożono maszyna wirtualna (symulator platformy), oparty na emulatorze Android Goldfish.
- Dla architektury AArch64 wdrożono wsparcie dla rozszerzeń Armv9-A SME (Scalable Matrix Extension).
- W podsystemie eBPF zezwolono na przechowywanie typizowanych wskaźników w strukturach map oraz dodano wsparcie dla wskaźników dynamicznych.
- Zaproponowano nowy mechanizm prognozowania usuwania pamięci, wspierający zarządzanie z przestrzeni użytkownika za pomocą pliku memory.reclaim. Zapis liczby do wskazanego pliku spowoduje próbę usunięcia odpowiedniej liczby bajtów z zestawu powiązanego z cgroup.
- Zwiększono precyzję liczenia wykorzystania pamięci przy kompresji danych w sekcji wymiany wykorzystując mechanizm zswap.
- Dla architektury RISC-V zapewniono wsparcie dla uruchamiania 32-bitowych plików wykonywalnych na 64-bitowych systemach, dodano tryb do przypisywania atrybutów ograniczających do stron pamięci (np. w celu zakazu pamięci podręcznej) oraz zaimplementowano funkcję kexec_file_load().
- Implementacja wsparcia dla 32-bitowych systemów Armv4T i Armv5 została dostosowana do użycia w uniwersalnych międzyplatformowych wersjach jądra, odpowiednich dla różnych systemów ARM.
- Wirtualizacja i bezpieczeństwo
- W podsystemie EFI zaimplementowano możliwość poufnego przekazywania tajnych informacji do systemów gościnnych bez ujawnienia ich systemowi gospodarza. Dane są udostępniane przez katalog security/coco w securityfs.
- W trybie ochrony Lockdown, który ogranicza dostęp użytkownika root do jądra i blokuje drogi omijania UEFI Secure Boot, usunięto lukę, która pozwalała na obejście zabezpieczeń poprzez manipulacje z debuggerem jądra.
- Włączono poprawki mające na celu zwiększenie niezawodności i wydajności generatora liczb pseudolosowych.
- Podczas budowy z użyciem Clang 15 wdrożono wsparcie dla mechanizmu randomizacji struktur jądra.
- Do mechanizmu Landlock, umożliwiającego ograniczenie interakcji grupy procesów ze środowiskiem zewnętrznym, dodano wsparcie dla reguł kontrolujących wykonywanie operacji zmiany nazw plików.
- Podsystema IMA (Integrity Measurement Architecture), przeznaczona do sprawdzania integralności komponentów systemu operacyjnego na podstawie podpisów cyfrowych i hashy, została przetłumaczona na użycie modułu fs-verity do weryfikacji plików.
- Zmieniono logikę działań przy wyłączaniu nieuprzywilejowanego dostępu do podsystemu eBPF — wcześniej wyłączano wszystkie komendy związane z wywołaniem systemowym bpf(), a od wersji 5.19 pozostawiono dostęp do komend, które nie prowadzą do tworzenia obiektów. Przy takim zachowaniu do załadowania programu BPF wymagany jest proces z uprawnieniami, ale później procesy nieuprzywilejowane mogą interagować z tym programem.
- Dodano wsparcie dla rozszerzenia AMD SEV-SNP (Secure Nested Paging), które zapewnia bezpieczną pracę z zagnieżdżonymi tabelami stron pamięci i chroni przed atakami 'undeSErVed' i 'SEVerity' na procesory AMD EPYC, umożliwiającym obejście mechanizmu ochrony AMD SEV (Secure Encrypted Virtualization).
- Dodano wsparcie dla mechanizmu Intel TDX (Trusted Domain Extensions), który umożliwia blokowanie prób nieautoryzowanego dostępu do zaszyfrowanej pamięci. maszyn wirtualnych.
- W sterowniku virtio-blk, używanym do emulacji urządzeń blokowych, dodano wsparcie dla wejścia/wyjścia przy użyciu polling, co, jak wykazały przeprowadzone testy, pozwoliło na skrócenie opóźnień o około 10%.
- Subsystem sieciowy
- W skład wchodzi seria poprawek BIG TCP, które pozwalają na zwiększenie maksymalnego rozmiaru pakietu TCP do 4GB w celu optymalizacji pracy wysokowydajnych wewnętrznych sieci datacenter. Takie zwiększenie rozmiaru pakietu przy 16-bitowym rozmiarze pola w nagłówku osiąga się poprzez realizację pakietów 'jumbo', gdzie rozmiar w nagłówku IP ustawiany jest na 0, a rzeczywisty rozmiar przesyłany jest w osobnym 32-bitowym polu w oddzielnym dołączonym nagłówku. Podczas testowania wydajności ustawienie rozmiaru pakietu na 185 KB pozwoliło zwiększyć przepustowość o 50% i znacznie skrócić opóźnienia transmisji danych.
- Kontynuowana jest praca nad integracją w stosie sieciowym narzędzi do śledzenia przyczyn odrzucenia pakietów (kody reason). Kod przyczyny jest przesyłany podczas zwalniania pamięci związanej z pakietem i pozwala na uwzględnienie takich sytuacji, jak odrzucenie pakietu z powodu błędów wypełnienia pól nagłówka, wykrycie spoofingu przez filtr rp_filter, błędna suma kontrolna, niedobór pamięci, wywołanie reguł IPSec XFRM, błędny numer sekwencji TCP itp.
- Dodano wsparcie dla przełączania połączeń MPTCP (MultiPath TCP) na użycie zwykłego TCP w sytuacjach, gdy nie można wykorzystać określonych funkcji MPTCP. MPTCP to rozszerzenie protokołu TCP, które umożliwia jednoczesne przesyłanie pakietów przez wiele tras przez różne interfejsy sieciowe, powiązane z różnymi adresami IP. Dodano API do zarządzania strumieniami MPTCP z przestrzeni użytkownika.
- Sprzęt
- Dodano ponad 420 tysięcy linii kodu związanych z sterownikiem amdgpu, z czego około 400 tysięcy linii stanowią automatycznie generowane pliki nagłówkowe z danymi dla rejestrów ASIC w sterowniku do GPU AMD, a jeszcze 22,5 tysiąca linii zapewnia wstępną implementację wsparcia dla AMD SoC21. Łączny rozmiar sterownika dla GPU AMD przekroczył 4 mln linii kodu. Oprócz SoC21, w sterowniku AMD dodano wsparcie dla SMU 13.x (System Management Unit), zaktualizowano wsparcie USB-C oraz GPUVM, a także przygotowano do wsparcia przyszłych generacji platform RDNA3 (RX 7000) oraz CDNA (AMD Instinct).
- W sterowniku i915 (Intel) rozszerzono możliwości związane z zarządzaniem zużyciem energii. Dodano identyfikatory GPU Intel DG2 (Arc Alchemist) stosowane w laptopach, zapewniono wstępne wsparcie dla platformy Intel Raptor Lake-P (RPL-P), dodano informacje o kartach graficznych Arctic Sound-M, zrealizowano ABI dla silników obliczeniowych, dla kart DG2 dodano wsparcie dla formatu Tile4, a dla systemów opartych na mikroarchitekturze Haswell wdrożono wsparcie DisplayPort HDR.
- W sterowniku Nouveau dokonano przejścia na wykorzystanie obsługi drm_gem_plane_helper_prepare_fb, dla niektórych struktur i zmiennych zastosowano statyczne przydzielanie pamięci. Jeśli chodzi o stosowanie w Nouveau otwartych przez firmę NVIDIA źródeł modułów jądra, aktualnie prace koncentrują się na identyfikacji i usuwaniu błędów. W przyszłości opublikowane oprogramowanie planuje się wykorzystać do zwiększenia wydajności sterownika.
- Dodano sterownik dla kontrolera NVMe używanego w komputerach Apple opartych na chipie M1.
Równocześnie latynoamerykańska Fundacja Wolnego Oprogramowania opracowała alternatywną, całkowicie wolną wersję jądra 5.19 — Linux-libre 5.19-gnu, oczyszczoną z elementów firmware i sterowników, które zawierają niewolne komponenty lub fragmenty kodu, których użycie jest ograniczone przez producenta. W nowym wydaniu przeprowadzono czyszczenie sterowników dla pureLiFi X/XL/XC oraz TI AMx3 Wkup-M3 IPC. Zaktualizowano kod czyszczenia blobów w sterownikach i subsystemach Silicon Labs WFX, AMD amdgpu, Qualcomm WCNSS Peripheral Image Loader, Realtek Bluetooth, Mellanox Spectrum, Marvell WiFi-Ex, Intel AVS, IFS oraz pu3-imgu. Zrealizowano obsługę plików devicetree Qualcomm AArch64. Dodano wsparcie dla nowego schematu nazewnictwa komponentów Sound Open Firmware. Zakończono czyszczenie sterownika ATM Ambassador, który został usunięty z jądra. Zarządzanie czyszczeniem blobów w HDCP i Mellanox Core przeniesiono do oddzielnych tagów kconfig.
Źródło: opennet.ru
