Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 6.15. Wśród najbardziej zauważalnych zmian znajdują się: mechanizm audytu w Landlock, tryb blokowania mapowania pamięci, podsystem fwctl, sterownik Nova dla GPU NVIDIA, realizacja systemu hosta dla hyperwizora Hyper-V, wsparcie dla zonyzowanych urządzeń pamięci w XFS, optymalizacja podsystemu sieciowego, weryfikacja scrub w Bcachefs, możliwość kontroli operacji przez io_uring.
W nowej wersji przyjęto 15945 poprawek od 2154 programistów, rozmiar łatki wynosi 59 MB (zmiany objęły 13596 plików, dodano 739608 linijek kodu, usunięto 312168 linijek). W poprzednim wydaniu było 12115 poprawek od 1984 programistów, rozmiar łatki wynosił 39 MB. Około 41% wszystkich zaprezentowanych w 6.15 zmian związane jest z sterownikami urządzeń, około 16% zmian dotyczy aktualizacji kodu specyficznego dla architektur sprzętowych, 13% odnosi się do steru sieciowego, 5% — do systemów plików, a 4% do wewnętrznych podsystemów jądra.
Główne nowości w jądrze 6.15:
- Podsystem dyskowy, wejście/wyjście i systemy plików
- Do mechanizmu fanotify dodano możliwość śledzenia zdarzeń montowania i odmontowania.
- W XFS dodano wsparcie dla zonyzowanych urządzeń pamięci (podział na strefy grup bloków lub sektorów, do których można dodawać dane jedynie sekwencyjnie z aktualizacją całej grupy bloków). Dodano flagę rwf_dontcache dla wyłączania buforowania przy zapisywaniu. Zrealizowano możliwość atomowego zapisu wielu bloków danych jednocześnie.
- W Btrfs wprowadzono możliwość określenia negatywnych poziomów kompresji zstd przy montażu (od -15 do -1, na przykład „compress=zstd:-5”), zapewniających wyższą prędkość pracy kosztem zmniejszonej efektywności kompresji. Poprawiono buforowanie ścieżek plików (w przeprowadzonym teście wykonanie operacji „send” przyspieszyło o 30%). Dodano wsparcie dla bloków o rozmiarze 2K.
- W EXT4 zwiększono wydajność podczas odtwarzania dziennika z bardzo dużą liczbą odwołanych wpisów (obciążenie charakterystyczne dla partycji pod FS Lustre). Wprowadzono liniowe przeszukiwanie wpisów „dentry” (wewnętrzne przedstawienie elementów katalogów), rozwiązujące problemy z dostępem do niektórych plików w trybie bez rozróżniania wielkości liter. Usprawniono działanie opcji montowania „errors=remount-ro”. Zwiększono odporność na obsługę uszkodzonych FS.
- W F2FS zaimplementowano ioctl do uzyskiwania informacji o priorytecie operacji wejścia/wyjścia dla danego pliku. Przeprowadzono prace nad przejściem na użycie foliantów stron pamięci (page folios).
- W Bcachefs dodano tryb „scrub”, w którym sprawdzana jest poprawność odczytu wszystkich danych i metadanych z systemu plików. W przypadku wykrycia błędów uruchamiana jest procedura odzyskiwania. W Bcachefs dodano również wsparcie dla systemów plików o rozmiarze bloku większym niż rozmiar strony pamięci. Ustabilizowano format struktur dyskowych Bcachefs (dalsze zmiany formatu będą realizowane w formie opcjonalnych dodatków).
- W EROFS dodano wsparcie dla 48-bitowego adresowania bloków.
- W podsistemach FUSE zaimplementowano parametry sysctl default_request_timeout i max_request_timeout do określania limitów czasowych dla wykonywania zapytań, co pozwala na monitorowanie zawieszeń komponentów FUSE działających w przestrzeni użytkownika. Maksymalny rozmiar nazw plików w FUSE zwiększono do 1024 znaków.
- Do wywołania systemowego statmount() dodano możliwość uzyskania informacji o mapowaniu identyfikatorów użytkowników zamontowanych systemów plików, stosowanego do porównywania plików należących do określonego użytkownika na zamontowanej obcej partycji z innym użytkownikiem w bieżącym systemie.
- Wprowadzono możliwość stworzenia punktu montowania z innym mapowaniem identyfikatorów użytkowników niż w przypadku oryginalnej zamontowanej partycji.
- W API do zarządzania montowaniem wprowadzono zmiany, które upraszczają budowę złożonych hierarchii systemów plików bez ujawniania poszczególnych części systemów plików, które powinny pozostawać ukryte.
- Dodano wsparcie dla sprzętowych urządzeń do ochrony kluczy szyfrowania w podsistemach pracy z urządzeniami blokowymi.
- W systemie plików SMB wprowadzono opcję is_network_name_deleted, a domyślnie uruchomiono tryb smb_server_kerberos5.
- Dla systemu plików OverlayFS dodano opcję montowania „override_creds”, przy której do dostępu do dolnych poziomów magazynu używane będą dane uwierzytelniające wywołującego użytkownika, a nie wykonującego montowanie. Zmiana ta, na przykład, umożliwia przy montowaniu OverlayFS wymaganie użytkownika z uprawnieniami CAP_SYS_ADMIN, ale korzystającego z systemu plików z danymi uwierzytelniającymi bez tej przewagi.
- W exFAT przyspieszono operacje usuwania plików. Zamiast wysyłania zapytań „discard” oddzielnie dla każdego zwalnianego klastra usuwanego pliku, sterownik teraz grupuje zapytania. W przeprowadzonym teście czas usunięcia pliku o wielkości 80 GB skrócił się z 286 sekund do 1,6 sekundy.
- Wszystkie pseudo-FS oraz systemy plików EXT2 przeszły na korzystanie z nowego API montowania partycji.
- Usunięto kod wspierający systemy plików SYSV (SystemV/386, Xenix i Coherent), który od 2023 roku oznaczony jest jako nieobsługiwany (orphaned).
- Pamięć i usługi systemowe
- Wymagana do budowy jądra minimalna wersja GCC podniesiona została do 8.1, a Clang do 15.0.0.
- Dodano podsystem fwctl (Firmware Control), który zapewnia API do bezpiecznego zarządzania oprogramowaniem układowym oraz wykonywania handlerów po stronie oprogramowania układowego z przestrzeni użytkownika. Na bazie fwctl przygotowano sterowniki dla urządzeń CXL (Compute Express Link), adapterów Ethernet Mellanox ConnectX (mlx5) oraz kart serwisowych AMD/Pensando.
- Rozszerzono możliwości mechanizmu pidfd, który pozwala na używanie identyfikatorów związanych z konkretnymi procesami i w przeciwieństwie do pid nie są one ponownie przydzielane. Umożliwiono wyciąganie danych o stanie zakończenia procesu, identyfikowanego przez pidfd po tym, jak proces macierzysty otrzymał potwierdzenie zakończenia procesu potomnego (reaped) i jego zasoby zostały zwolnione. Do wywołań systemowych dodano flaga PIDFD_SELF, za pomocą którego proces może odwołać się do siebie.
- Dla architektury RISC-V wprowadzono wsparcie dla rozszerzeń BFloat16, Zaamo (atomowe operacje z pamięcią), Zalrsc (Load-Reserved/Store-conditional) oraz ZBKB (operacje bitowe dla kryptografii).
- Podczas śledzenia zapewniono możliwość zapisywania argumentów wywoływanych funkcji i ich odzwierciedlania w logach śledzenia.
- W systemie asynchronicznego wejścia/wyjścia io_uring dodano wsparcie dla czytania informacji o zdarzeniach epoll. Wykorzystanie io_uring do przetwarzania zdarzeń epoll pozwala na zmniejszenie liczby zmian kontekstu oraz umożliwia przetwarzanie wielu zdarzeń epoll jednocześnie.
- W podsystemie eBPF usprawniono weryfikację programów z pętlami. Dodano nowe instrukcje „timed_may_goto”, „load-acquire” i „store-release”. Umożliwiono modyfikację rozszerzonych atrybutów plików z programów BPF. Dodano funkcję try_alloc_pages(), zaprojektowaną do przydzielania pamięci przy wysokim prawdopodobieństwie niepowodzenia operacji (przy uruchamianiu programów BPF w ograniczonych kontekstach).
Wprowadzono nowy prymityw blokad — rqspinlock (Odporny Kolejkowy Spin Lock), który podczas działania identyfikuje sytuacje prowadzące do zakleszczeń. Nowy prymityw umożliwia ładowanie programów BPF, dla których weryfikator nie gwarantował poprawności działania z blokadami.
- Znacząco zwiększono niezawodność przydzielania dużych stron pamięci (huge-page).
- Zdecydowanie przyspieszono obliczanie sum kontrolnych CRC64 na systemach x86. Między innymi w celu przyspieszenia wykorzystano nowe instrukcje wektorowe z zestawu AVX-512. W niektórych sytuacjach wydajność wzrosła 100 razy.
- Kontynuowane są prace nad przenoszeniem zmian z gałęzi Rust-for-Linux związanych z wykorzystaniem 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 prowadzi do włączenia Rust jako wymaganej zależności kompilacji jądra). Umożliwiono użycie w kodzie jądra makra „#[kunit_tests()]” do uruchamiania testów jednostkowych. Dodano wsparcie dla architektury ARMv7. Zrealizowano moduły dma i hrtimer z powiązaniami Rust dla DMA (dodane przez Linusa poza normalnym procesem, po czym dadł on tę funkcję swojemu następcy) oraz dla wysokiej precyzji timerów. Rozszerzono moduły „list”, „str”, „sync”, „error” i „alloc”. Dodano wsparcie dla nowej składni „&raw” (raw_ref_op).
- W podsystemie perf wprowadzono możliwość profilowania opóźnień, wykorzystując informacje od planisty zadań.
- Dodano parametr wiersza poleceń jądra „traceoff_after_boot”, który wyłącza śledzenie po załadowaniu jądra i uruchomieniu procesu init. Parametr może być używany przy diagnozowaniu problemów związanych z uruchamianiem, zapewniając, że dane śledzenia zgromadzone podczas uruchamiania nie będą nadpisywane.
- Wsparcie dla 32-bitowych systemów x86 z więcej niż 8 CPU i 4 GB RAM zostało zakończone. Tego typu sprzęt od dłuższego czasu nie jest produkowany, a systemy wymagające takich zasobów zostały przeniesione na 64-bitowe CPU.
- Wprowadzono zmiany w implementacji timerów POSIX, które umożliwiają narzędziu CRIU (Checkpoint/Restore in Userspace) zapisywanie i przywracanie identyfikatorów timerów.
- Wirtualizacja i bezpieczeństwo
- Dodano możliwość użycia systemu Linux jako środowiska głównego (Dom0, partycja root) dla hipernadzorcy Hyper-V (Microsoft Hypervisor). Środowisko gospodarza odpowiada za zarządzanie hipernadzorcą, organizowanie uruchamiania maszyn wirtualnych, przydzielanie zasobów oraz zapewnianie interakcji maszyn wirtualnych z urządzeniami. Zarządzanie hipernadzorcą Hyper-V w systemie Linux odbywa się za pośrednictwem urządzenia /dev/mshv.
- Do modułu Landlock, który dostarcza nieuprzywilejowanym programom narzędzia do ograniczania dostępu do obiektów jądra Linux (hierarchie plików, gniazda sieciowe, ioctl itp.), dodano mechanizm audytu. Audyt pozwala na szczegółową ocenę przyczyn blokad dostępu, które są wprowadzane podczas korzystania z Landlock, a także umożliwia zrozumienie, kiedy i która operacja została zablokowana, dlaczego zablokowano i jakie reguły zostały uruchomione.
- Dodano możliwość implementacji w modułach LSM (Linux Security Modules) obsługi kontrolującej operacje na asynchronicznym wejściu/wyjściu io_uring, umożliwiającej zablokowanie korzystania z io_uring w celu obejścia ograniczeń dostępu do wywołań systemowych. Tego typu obsługa została zaimplementowana w module LSM SELinux.
- W SELinux wprowadzono możliwość stosowania polityk do wszelkiego rodzaju danych ładowanych przez jądro, w tym obrazów firmware'ów, polityk bezpieczeństwa i certyfikatów.
- Dodano tryb przypinania (seal) niektórych operacji mapowania pamięci realizowanych przez jądro w przestrzeni adresowej procesu. Przypinanie zmienia mapowanie na tryb tylko do odczytu i uniemożliwia jego modyfikację w przypadku wykorzystania luki. Działanie to obejmuje mapowania vDSO, vsyscall, vvar, sigpage i uprobes. Tryb ten jest domyślnie wyłączony, ponieważ może zakłócać działanie niektórych aplikacji. Aby go włączyć, dodano opcję konfiguracyjną CONFIG_MSEAL_SYSTEM_MAPPINGS.
- Subsystem sieciowy
- Kontynuowano prace nad usuwaniem globalnej blokady RTNL (rtnl_lock) z stosu sieciowego i przekształceniem jej w blokady przypisane do poszczególnych przestrzeni nazw sieciowych.
- Dodano wstępne wsparcie dla odbierania pakietów sieciowych przez io_uring z kopiowaniem zawartości bezpośrednio do pamięci programu w przestrzeni użytkownika bez pośredniej buforowania (zero-copy). W przeprowadzonych testach zmiana umożliwiła obsługę ruchu przez 200-gigabitowy kanał, używając jednego rdzenia CPU.
- Zrealizowane sysctl tcp_rto_max_ms oraz opcja TCP-socketów TCP_RTO_MAX_MS, dzięki którym można ustawić maksymalny czas między próbami retransmisji pakietów.
- W BPF dodano serię wywołań zwrotnych do uzyskiwania informacji o czasie z różnych miejsc w stosie sieciowym, co może być wykorzystane do diagnozowania problemów z opóźnieniami sieciowymi.
- Dodane optymalizacje wydajności operacji sieciowych:
- Optymalizacja GRO (Generic Receive Offload), która łączy kilka małych pakietów w jeden duży, teraz działa podczas przenoszenia przetwarzania pakietu na inny CPU (do równoważenia obciążenia) przy użyciu podsystemu XDP (eXpress Data Path), który pozwala na przetwarzanie pakietów na poziomie sterownika sieciowego przed ich wysłaniem do stosu sieciowego. Wzrost wydajności przetwarzania strumieni TCP dzięki zastosowanej optymalizacji może sięgać dwóch razy.
- W warunkach dużego obciążenia wydajność funkcji connect() wzrosła dwukrotnie dzięki zastąpieniu spin-locka mechanizmem synchronizacji RCU (Read-Copy-Update) przy wyszukiwaniu wpisów z informacjami o stronach połączenia (źródłowe i docelowe) i porty. Dodatkowo przeprowadzono optymalizację hashowania, która zapewniła wzrost wydajności o kolejne 229%. adresy IP Przyspieszono realizację MPTCP (Multipath TCP), rozszerzenia protokołu TCP umożliwiającego dostarczanie pakietów jednocześnie różnymi trasami przez różne interfejsy sieciowe powiązane z różnymi adresami IP. MPTCP w trybie jednego strumienia przyspieszono o 29%.
- W netfilter w przypadku istnienia gniazda przerwano wykonywanie operacji wyszukiwania tras w FIB (Forwarding Information Base). Dzięki tej optymalizacji wydajność wzrosła o 20%.
- Wydajność UDP w warunkach flood zwiększono o 10% poprzez wyeliminowanie zbędnych operacji na strukturze sk_tsflags podczas odbierania pakietów.
- Dodano sterownik z realizacją protokołu MCTP-over-USB.
- Dodano sterownik z realizacją protokołu MCTP-over-USB.
- Sprzęt
- Jądro przyjęło wstępną implementację sterownika Nova dla GPU NVIDIA, wyposażonych w oprogramowanie GSP, używane od serii NVIDIA GeForce RTX 2000, opartej na mikroarchitekturze Turing. Sterownik został napisany w języku Rust. W pierwszym etapie dodano jedynie szkielet nova-core, który zawiera około 400 linii kodu i realizuje podstawowy poziom abstrakcji nad interfejsami programistycznymi oprogramowania GSP. Na następnym etapie planowane jest włączenie do jądra sterownika DRM nova-drm (Direct Rendering Manager) do interakcji z GPU z przestrzeni użytkownika, a także sterownika VFIO z menedżerem vGPU, umożliwiającego wykorzystanie wirtualnych GPU NVIDIA w systemach wirtualizacji.
- Kontynuowane są prace nad sterownikiem drm (Direct Rendering Manager) Xe dla GPU opartych na architekturze Intel Xe, która jest używana w kartach graficznych Intel z rodziny Arc oraz w zintegrowanej grafice, począwszy od procesorów Tiger Lake. Dodano wsparcie dla SVM (Shared Virtual Memory), komponentu frameworka DRM, zarządzającego pamięcią współdzieloną pomiędzy CPU i GPU.
- W sterowniku i915 dodano identyfikatory nowych GPU.
- W sterowniku Nouveau przeprojektowano GSP RPC i zintegrowano interfejs drm_slave_encoder.
- W sterowniku AMDGPU dodano wsparcie dla architektury DCN36 (Display Core Next). Umożliwiono definiowanie własnych krzywych jasności używanych do korekcji jasności wyświetlacza.
- W sterowniku adreno dodano wsparcie dla GPU Qualcomm Adreno 623.
- Dodano wsparcie dla paneli dotykowych Apple Touch Bar.
- Dodano wsparcie dla drugiej wersji rozszerzenia eUSB2 (eUSB2V2 — Embedded USB2 Version 2.0), które umożliwia obniżenie zasilania (do 1,2 woltów) oraz zwiększenie wydajności USB 2.0. Prędkość przesyłania danych w eUSB2V2 może osiągać 4,8 Gb/s, co jest 10 razy szybsze od standardowych 480 Mb/s typowych dla USB 2.0. eUSB2V2 pozwoli producentom laptopów na wyposażenie swoich urządzeń w kamery internetowe o wyższej rozdzielczości, jednocześnie korzystając z magistrali Embedded USB2 do ich podłączenia.
- Dodano wsparcie dla adapterów Ethernet Intel Killer E5000 (RTL8126).
- Dodano wsparcie dla paneli ekranowych Visionox RM692E5, Rockchip w552793dba-v10, kingdisplay-kd110n11-51ie oraz starry-2082109qfh040022-50e.
- Dodano sterownik dla laptopów Samsung Galaxy Book.
- Dodano wsparcie dla systemów dźwiękowych Presonus Studio 1824c, Jabra Evolve 65. Dodano wsparcie dla modułów DSP AMD ACP 7.x, AWINC WM88166, Everest ES8388, Intel AVS PEAKVOL oraz GAIN. Ulepszono wsparcie dźwięku na laptopach ASUS, HP i Lenovo.
- Dodano wsparcie dla platform ARM, SoC i urządzeń: Arm Morello, AMD (Xilinx) Versal NET, Google Pixel Pro 6, NetCube Kumquat, MYIR Remi Pi, Huawei Matebook E Go, Milk-V Jupiter ST STM32MP2, Mediatek MT8370, Apple T2, Skov (i.MX8MP), EVK (i.MX95), Rockchip RK35xx, Allwinner A523, 11 płyt Toradex opartych na i.MX6.
Równocześnie latynoamerykańska Fundacja Wolnego Oprogramowania stworzyła wersję całkowicie wolnego jądra 6.15 — Linux-libre 6.15-gnu, oczyszczoną z elementów firmware i sterowników zawierających własnościowe komponenty lub fragmenty kodu, których użycie jest ograniczone przez producenta. W wydaniu 6.15 zneutralizowano ładowanie blobów w sterownikach nova, Qualcomm iris v4l2, Airoha NPU, Tehuti Networks TN40xx 10G ethernet, Realtek 8814A wifi, Apple Silicon SoC touchscreen, Renesas UFS i aw88166 audio. Zakończono czyszczenie sterownika Spider 1Gb ethernet, który został usunięty z jądra. Usunięto odniesienia do zaktualizowanych plików binarnych. Wprowadzono blokadę ładowania blobów z kodu napisanego w języku Rust.
Źródło: opennet.ru
