Po dwóch miesiącach prac programistycznych Linus Torvalds zaprezentował wydanie jądra Linux 6.18. Wśród najbardziej zauważalnych zmian: dm-pcache do pamięci podręcznej dyskowej w pamięci nieulotnej (PMEM), usunięcie Bcachefs, tryb online weryfikacji XFS, sterowniki Binder (Android IPC) i Tyr (GPU Mali) napisane w Rust, możliwość tworzenia sterowników USB w Rust, optymalizacja pamięci w alokatorze pamięci SLUB, adresacja przestrzeni nazw przez deskryptory plików, przyspieszenie działania swapu, weryfikacja programów BPF za pomocą podpisu cyfrowego, wirtualizacja Intel CET w KVM, protokół sieciowy PSP (hybryda TLS i IPsec), wsparcie dla rozszerzenia IP AccECN, optymalizacja stosu UDP.
Nowa wersja zawiera 15035 poprawek od 2217 programistów, rozmiar łatki wynosi 45 MB (zmiany obejmują 13142 plików, dodano 601897 linijek kodu, usunięto 355006 linijek). W poprzednim wydaniu było 14334 poprawek od 2118 programistów, a rozmiar łatki wynosił 46 MB. Około 40% wszystkich przedstawionych w 6.18 zmian dotyczy sterowników urządzeń, około 16% zmian związane są z aktualizacją kodu specyficznego dla architektur sprzętowych, 12% dotyczy stosu sieciowego, 5% związane jest z systemami plików, a 3% z wewnętrznymi podsystemami jądra.
Najważniejsze nowości w jądrze 6.18 (1, 2, 3):
- Podsystem dyskowy, wejście/wyjście i systemy plików
- W Device Mapper dodano obsługę dm-pcache do wykorzystania pamięci trwałej (pamięć CXL adresowana przez urządzenie DAX) jako dodatkowej wydajnej pamięci podręcznej przed wolniejszymi tradycyjnymi dyskami lub pamięciami flash. Dm-pcache zapewnia bezpieczeństwo przechowywania zawartości pamięci podręcznej w przypadku awarii (crash-safe) dzięki wykorzystaniu pamięci nieulotnej, podwajaniu metadanych oraz weryfikacji integralności danych i metadanych za pomocą sum kontrolnych CRC32. Obecnie wspierane jest tylko buforowanie w trybie opóźnionego zapisu (write-back).
- Z jądra usunięto kod systemu plików Bcachefs, który teraz będzie dystrybuowany w formie zewnętrznego modułu, kompilowanego przy użyciu narzędzi DKMS (Dynamic Kernel Module Support). Kod Bcachefs może zostać przywrócony do jądra po tym, jak Kent Overstreet udowodni, że możliwe jest prawidłowe współdziałanie z innymi programistami jądra oraz zdolność do przestrzegania ustalonych zasad rozwoju.
- W systemowym wywołaniu pwritev2() dodano flagę RWF_NOSIGNAL, która wyłącza wysyłanie sygnału SIGPIPE podczas zapisu do zerwanych nieanonsowanych kanałów lub gniazd.
- W Procfs dodano opcję montowania 'pidns' do wskazywania przestrzeni nazw identyfikatorów procesów (PID namespace). Na przykład: 'mount -t proc -o pidns=/proc/self/ns/pid proc /tmp/proc'.
- W XFS zadeklarowano stabilną i włączoną domyślnie możliwość korzystania z narzędzia fsck do sprawdzania i naprawy wykrytych problemów w trybie online, bez odmontowywania systemu plików. Dodano wywołania systemowe file_getattr i file_setattr do zmiany atrybutów specjalnych plików (wszystkich inode). W KConfig domyślnie wyłączono opcje XFS_SUPPORT_V4 (4 wersja XFS) i XFS_SUPPORT_ASCII_CI (tryb bez uwzględniania wielkości liter ASCII), uznane za przestarzałe. Usunięto przestarzałe opcje montowania attr2, noattr2, ikeep i noikeep.
- W MD RAID wprowadzono nowy typ bitmap bitowych — llbitmap (bitmapa bez blokad), działających bez blokad i zapewniających wyższą wydajność.
- Z ogólnej struktury 'inode' wydzielono informacje związane z szyfrowaniem i weryfikacją (wskaźniki i_crypt_info i i_verity_info). Zmiana ta pozwala na obniżenie zużycia pamięci w systemach plików, które nie obsługują szyfrowania i weryfikacji.
- W subsydiarnej FUSE dodano wsparcie dla wywołania systemowego copy_file_range() i bezpośredniego kopiowania zakresów z użyciem rozmiaru z 64-bitowym typem (wcześniej wspierano tylko 32-bitowy rozmiar). Dodano wsparcie dla inicjalizacji w trybie synchronizowanym podczas montowania (FUSE_DEV_IOC_SYNC_INIT).
- W systemie plików ext4 wprowadzono możliwość korzystania z 32-bitowych identyfikatorów użytkowników (uid) i grup (gid) podczas dostępu do zarezerwowanych bloków. Dodano operacje ioctl do ustawiania i odczytywania parametrów superbloku zamontowanych systemów plików (tune2fs będzie mógł zmieniać parametry w superbloku bez uprawnień do zapisu w urządzeniu blokowym). Całkowicie usunięto przestarzałe ustawienia specyficzne dla ext3.
- W f2fs dodano opcję montowania „lookup_mode” do wyboru trybu wyszukiwania: perf — wyszukiwanie według hasha, compat — wyszukiwanie liniowe, auto — automatyczny wybór. Zmiana trybu ma sens w konfiguracjach z katalogami, w których nie uwzględnia się wielkości liter. Aktualny tryb wyszukiwania można sprawdzić w pliku „/sys/fs/f2fs//effective_lookup_mode”. Dodano możliwość rezerwacji inode, dostępnych tylko dla użytkowników z uprawnieniami.
- W Overlayfs dodano tryb pracy bez uwzględniania wielkości liter, aktywowany na poziomie warstw FS (ustawienie dla poszczególnych katalogów na razie nie jest obsługiwane).
- W BTRFS poprawiono równoległość operacji przy wysokim obciążeniu odczytu i niskim obciążeniu zapisu, skrócono czas zatwierdzania transakcji, znacznie skrócono czas synchronizacji (z minut do dziesiątków sekund). Umożliwiono użycie bloków (bs) o rozmiarze większym niż strona pamięci (ps).
- W ksmbd (działający na poziomie jądra serwer SMB) dodano parametr do ograniczenia maksymalnej liczby połączeń z jednego. adresy IPsmbdirect, smbclient i smbserver zostały przeniesione na użycie standardowych struktur jądra.
- W SQUASHFS dodano możliwość używania opcji SEEK_DATA i SEEK_HOLE w wywołaniu systemowym lseek() do wyszukiwania danych i pustych miejsc w plikach rozrzedzonych. W niektórych testach odnotowano zwiększenie wydajności kopiowania plików rozrzedzonych do 150 razy.
- W EXFAT dodano wsparcie dla ioctl FS_IOC_GETFSLABEL i FS_IOC_SETFSLABEL do odczytu i zapisu etykiet partycji. Umożliwiono zmianę opcji montowania podczas ponownego montowania. Przyspieszono ładowanie map bitowych.
- W NTFS3 dodano wsparcie dla ioctl FS_IOC_GETFSLABEL i FS_IOC_SETFSLABEL do odczytu i ustawiania etykiet partycji.
- Pamięć i usługi systemowe
- Do składu przyjęto implementację mechanizmu komunikacji międzyprocesowej Binder, napisaną w języku Rust. Binder jest używany w Androidzie do organizowania interakcji między procesami i zdalnego wywoływania metod (jeden proces Android może wywołać metodę lub funkcję w innym procesie Android, używając Bindera do identyfikacji, wywołania i przekazywania argumentów między procesami). Kod Binder został przepisany w języku Rust w ramach inicjatywy Google mającej na celu zwiększenie bezpieczeństwa Androida.
- W SLUB, alokatorze pamięci jądra, wprowadzono opcjonalną warstwę buforowania „sheaves”, która wykorzystuje wiele buforów, z których każdy jest przypisany do osobnego rdzenia CPU, co pozwala na lokalizację operacji przez jeden rdzeń przy alokacji lub zwalnianiu pamięci. Taki bufor zwiększył wydajność alokacji i zwalniania pamięci w jądrze, eliminując zbędne prymitywy synchronizacji wymagane przy zaangażowaniu różnych rdzeni CPU. W przeprowadzonych testach wzrost wydajności wyniósł od 6,3% do 31% w zależności od rodzaju obciążenia.
- Dodano możliwość tworzenia deskryptorów plików powiązanych z określoną przestrzenią nazw (namespace). W przeciwieństwie do odwołań do przestrzeni nazw za pomocą identyfikatorów (/proc/<pid>/ns/), deskryptor pliku jest przypisany do konkretnego egzemplarza przestrzeni nazw i wyklucza sytuację, w której identyfikator jest ponownie przydzielany i wskazuje już na inny obiekt. Podobnie jak w przypadku użycia pidfds, otwieranie deskryptorów plików, które odnoszą się do przestrzeni nazw, odbywa się za pomocą funkcji open_by_handle_at() i name_to_handle_at().
- Wprowadzono mechanizm „Swap Table”, który pozwala na zwiększenie wydajności podmiany. Przyspieszenie osiągane jest dzięki zmniejszeniu konkurencji o dostęp do bufora podmiany, bardziej efektywnemu wyszukiwaniu w buforze oraz redukcji fragmentacji. Backend oparty na Swap Table służy do buforowania podmiany zamiast backendu XArray i pozwala średnio na zwiększenie wydajności o 5-20%. W teście usemem przepustowość wzrosła o 17-28%, w teście wielowątkowym kompilacji jądra czas budowy zmniejszył się o 1,12-3,19%, test redis-benchmark z BGSAVE wykazał wzrost liczby obsługiwanych zapytań o 6-7%.
- Podsystem Zswap został przestawiony na bezpośrednie użycie systemu alokacji pamięci zsmalloc zamiast warstwy zpool, która nie jest już używana i została usunięta z jądra.
- W celu zarządzania zachowaniem bootloadera mikrokodu w systemach x86 wprowadzono opcję wiersza poleceń „microcode=lista flag”. W obecnej formie nowa opcja zastępuje „microcode.force_minrev” i również pozwala na określenie minimalnej dopuszczalnej wersji mikrokodu do załadowania.
- Rozpoczęto reorganizację nadmiernie rozbudowanej struktury „page”, używanej do zarządzania stronami pamięci operacyjnej. Dodano typ ‘memdesc_flags_t’ dla pól z uniwersalnymi flagami, które będą mogły być używane po przewidywanym w przyszłości wydzieleniu ze struktury „page” oddzielnych struktur dla slab i foliów (folio).
- Dla architektury nios2, stosowanej w procesorach Altera Nios II (oprogramowanie układowe oparte na FPGA), zaimplementowano wsparcie dla wywołania systemowego clone3().
- Do konfiguracji jądra (KConfig) dodano atrybut „transitional”, który można wykorzystać do oznaczania ustawień, które nie są wyświetlane w interfejsach użytkownika, takich jak „make menuconfig”, i nie są dołączane do generowanych plików konfiguracyjnych. Głównym celem atrybutu jest uproszczenie zmiany nazw opcji przy zachowaniu zgodności wstecznej.
- Minimalna wersja kompilatora Clang, przy pomocy którego można zbudować jądro, zwiększona do narzędzi LLVM 15. W Debianie 12 i Ubuntu 22.04 dostarczane jest LLVM 14.
- Kontynuowano przenoszenie 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 wliczania Rust w obowiązkowe zależności budowlane jądra). W nowej wersji dla kodu w języku Rust zaimplementowano atomowe operacje pamięci, strukturę maple tree, możliwość tworzenia plików DebugFS oraz funkcje do manipulacji bitmapami. Rozszerzono dostęp do API dla deweloperów sterowników. Dodano kompletny zestaw abstrakcji do rozwoju sterowników urządzeń USB (przykład sterownika USB). W narzędziu perf dodano wsparcie dla symboli debugowania generowanych przez kompilator rustc.
- Wirtualizacja i bezpieczeństwo
- Dodano wsparcie dla kryptograficznej weryfikacji ładowanych programów BPF za pomocą cyfrowego podpisu. W przyszłości ta funkcjonalność zostanie rozszerzona o mechanizmy do ustalania zasad ładowania podpisanych programów BPF oraz umożliwienie użytkownikom nieuprzywilejowanym korzystania z weryfikowanych programów BPF.
- W hipernadzorze KVM wdrożono wsparcie dla wirtualizacji rozszerzenia Intel CET (Control-flow Enforcement Technology), stosowanego w celu ochrony przed exploitami wykorzystującymi techniki programowania oparte na zwrotach (ROP — Return-Oriented Programming). Zasada ochrony polega na tym, że po przekazaniu kontroli funkcji, adres powrotu jest przechowywany przez procesor nie tylko w zwykłym stosie, ale również w osobnym stosie cieniowym, który nie może być zmieniany bezpośrednio.
- Dodano możliwość wykorzystania więcej niż 255 CPU w systemach gościnnych działających pod hipernadzorcem Bhyve na hostach z FreeBSD 15.
- Dodano warstwę dibs (Direct Internal Buffer Sharing) do zarządzanego współdzielenia buforów w zisolowanym środowisku, takim jak hipernadzorca lub instancja jądra Linux.
- Do podsystemu audytu dodano wsparcie dla pracy z wieloma jednocześnie włączonymi modułami LSM (Linux Security Module).
- Dodano sterownik virtio spi-virtio do dostępu do urządzenia SPI (Serial Peripheral Interface) z maszyn wirtualnych.
- W hipernadzorze KVM dodano wsparcie dla trybu SEV-SNP CipherText Hiding, który blokuje możliwość odczytu szyfrogramu pamięci chronionych systemów gościnnych w nieautoryzowanym CPU.
- Dodano sterownik qtee dla środowisk TEE (Trusted Execution Environment) chipów Qualcomm.
- Subsystem sieciowy
- Dodano wsparcie dla szyfrowania połączeń TCP, wykorzystując protokół PSP (PSP Security Protocol), opracowany przez firmę Google w celu szyfrowania ruchu między centrami danych. PSP zapewnia szyfrowanie, kryptograficzną kontrolę integralności i uwierzytelnianie źródła, realizując swoistą kombinację możliwości protokołów TLS i IPsec. W PSP stosowane jest szyfrowanie na poziomie poszczególnych połączeń sieciowych, a nie całego kanału komunikacyjnego. PSP wykorzystuje oddzielne klucze szyfrowania dla różnych tunelowanych połączeń TCP w celu ściśle izolowanego ruchu między różnymi aplikacjami i obsługiwaczami. Aby zmniejszyć obciążenie CPU, wspierane jest zrzucenie operacji szyfrowania i odszyfrowania na strony kart sieciowych (offload). Do przesyłania danych wykorzystywany jest protokół UDP, na który przekazywana jest zawartość oryginalnego pakietu TCP.

- Dodano wstępne wsparcie dla rozszerzenia AccECN (Dokładne Eksplicytne Powiadomienie o Zatorze), które jest ulepszoną wersją rozszerzenia ECN, umożliwiającego hostom oznaczanie pakietów IP w przypadku przeciążenia, zamiast ich odrzucania, co pozwala na wczesne wykrywanie początkowych faz zatorów w kanałach komunikacyjnych bez utraty pakietów. Pierwotne rozszerzenie ECN miało ograniczenie, które pozwalało na sygnalizowanie tylko jednego przeciążenia w ramach jednego cyklu transmisji TCP (RTT, Round-Trip Time, wysłanie żądania i odebranie odpowiedzi). AccECN znosi to ograniczenie i pozwala odbiorcy przesyłać do nadawcy więcej niż jedną etykietę o przeciążeniu w nagłówku pakietu TCP. Algorytmy zarządzania przeciążeniem mogą wykorzystać te informacje do dokładniejszego reagowania na przeciążenia i nie muszą drastycznie zmniejszać intensywności wysyłania pakietów w przypadku niewielkiego przeciążenia.
- W stosie UDP zoptymalizowano przetwarzanie przychodzących pakietów w warunkach ataków DDoS, prowadzących do dostarczenia dużej liczby pakietów do jednego lub kilku gniazd UDP. Wprowadzone optymalizacje, takie jak zmniejszenie blokad konkurencyjnych, optymalizacja rozmieszczenia struktur danych w pamięci i wdrożenie blokad uwzględniających architekturę NUMA (Non-Uniform Memory Access), pozwoliły zwiększyć wydajność przy odbiorze pakietów UDP o 47% i więcej w ekstremalnych warunkach.
- Wprowadzono możliwość wyłączenia buforowania wejścia/wyjścia na serwerze NFS, co pozwala na jego zastosowanie w systemach z ograniczoną pamięcią (na przykład w uproszczonych środowiskach chmurowych). Wyłączenie bufora może być również przydatne na obciążonych serwerach NFS, aby uniknąć wypychania z bufora danych związanych z lokalnymi nośnikami w wyniku zwolnienia pamięci dla bufora NFS.
- Maksymalny rozmiar buforów przychodzących i wychodzących pakietów dla gniazd sieciowych (net.core.rmem_max i net.core.wmem_max) został zwiększony z 2 MB do 4 MB. Domyślnie ustawiony rozmiar nie zmienił się (net.core.rmem_default i net.core.wmem_default = 2 MB).
- Dodano sterownik dla akceleratora operacji sieciowych Qualcomm PPE (Silnik Przetwarzania Pakietów), używanego w SoC Qualcomm IPQ9574.
- Dodano wsparcie dla szyfrowania połączeń TCP, wykorzystując protokół PSP (PSP Security Protocol), opracowany przez firmę Google w celu szyfrowania ruchu między centrami danych. PSP zapewnia szyfrowanie, kryptograficzną kontrolę integralności i uwierzytelnianie źródła, realizując swoistą kombinację możliwości protokołów TLS i IPsec. W PSP stosowane jest szyfrowanie na poziomie poszczególnych połączeń sieciowych, a nie całego kanału komunikacyjnego. PSP wykorzystuje oddzielne klucze szyfrowania dla różnych tunelowanych połączeń TCP w celu ściśle izolowanego ruchu między różnymi aplikacjami i obsługiwaczami. Aby zmniejszyć obciążenie CPU, wspierane jest zrzucenie operacji szyfrowania i odszyfrowania na strony kart sieciowych (offload). Do przesyłania danych wykorzystywany jest protokół UDP, na który przekazywana jest zawartość oryginalnego pakietu TCP.
- Sprzęt
- Jądro zawiera sterownik Tyr, napisany w języku Rust, który obsługuje GPU ARM Mali, w których zastosowano technologię CSF (Command Stream Frontend), takie jak Mali G310, G510 i G710. Sterownik nie jest jeszcze gotowy do stałego użytku przez zwykłych użytkowników i jest traktowany jako eksperymentalny prototyp do testowania abstrakcji dla rozwoju sterowników w języku Rust.
- Do sterowników urządzeń wejściowych z interfejsem HID (Human Interface Device) dodano wsparcie dla gładzików z haptyką i czujnikami siły nacisku.
- Kontynuowano prace nad sterownikiem drm (Direct Rendering Manager) Xe dla GPU opartych na architekturze Intel Xe, które są używane w kartach graficznych Intel z rodziny Arc oraz w zintegrowanej grafice, począwszy od procesorów Tiger Lake. W nowej wersji dodano interfejs madvise, włączono wsparcie dla SR-IOV PF (Single Root I/O Virtualization Physical Function), dodano wsparcie trybu Intel PSMI do walidacji sprzętu, zapewniono obsługę informacji o błędach przesyłanych przez firmware oraz zrealizowano profil poboru energii SLPC, a także dodano wsparcie dla ładowania dodatkowych firmware'ów (na przykład do kontrolera wentylatora i regulatora napięcia) w trakcie weryfikacji sterownika.
- W sterowniku AMDGPU dodano wsparcie dla urządzeń z APU Cyan Skillfish, poprawiono wsparcie dla AMD GCN 1.0, wdrożono zgodność z narzędziem criu, a w sysfs dodano metryki temperatury oraz zezwolono na zapytania o remapping MMIO z przestrzeni użytkownika.
- W sterowniku i915 włączono wsparcie dla układów z rodziny Wildcat Lake i poprawiono działanie z GPU Jasper Lake, Elkhart Lake, Gen7 i Gen6.
- W sterowniku Nouveau domyślnie wykorzystano GSP firmware NVIDIA oraz ulepszono obsługę błędów.
- Kontynuowano integrację komponentów sterownika Nova dla GPU NVIDIA, wyposażonych w GSP firmware, używanych od serii NVIDIA GeForce RTX 2000 opartej na mikroarchitekturze Turing. Sterownik napisano w języku Rust. W nowej wersji rozszerzono wsparcie dla firmware'ów GSP, poprawiono implementację makra „register!“, dodano wsparcie dla klas urządzeń PCI oraz identyfikatorów producentów.
- Dodano sterownik rocket dla akceleratorów NPU stosowanych w SoC Rockchip RK3588.
- Dodano parametr jądra „boot_display” do wyboru urządzenia wyjściowego do wyświetlania procesu rozruchu w systemach z wieloma GPU.
- W sterowniku vesadrm zrealizowano wsparcie dla 8-bitowych palet.
- Do sterownika msm dodano wsparcie dla GPU Adreno 663 oraz zaimplementowano technologię oszczędzania energii IFPC (Inter Frame Power Collapse).
- Do sterownika panthor dodano wsparcie dla GPU Mali-G710, Mali-G510, Mali-G310, Mali-Gx15, Mali-Gx20 i Mali-Gx25.
- Dodano wsparcie dla systemów dźwiękowych ASoC Qualcomm Glymur i PM4125, Realtek RT1321, Shanghai FourSemi FS2104/5S, Texas Instruments PCM1754 oraz TAS2783A, qcs615, CS35L56 B2, tas2118, tas2x20, tas5825. Dodano wsparcie dla kart dźwiękowych USB Tascam US-144mkII i Presonus S1824c.
- Dodano wsparcie dla procesorów ARM Cortex-A320/A520AE/A720AE i C1-Nano/Pro/Premium/Ultra.
- Dodano wsparcie dla platform ARM, SoC i urządzeń: Apple M2 Pro, M2 Max i M2 Ultra, Sony Xperia SP, Samsung Galaxy S22, Samsung Galaxy S20 FE, ASUS Eee Pad Slider SL101, Lenovo ThinkBook 16, HP Omnibook X14 X1P42100, Dell Inspiron 7441 / Latitude 7455, Sige1, NanoPi Zero2, Axis Artpec8, NXP i.MX91, ROCK 2A/2F, Qualcomm Lemans Auto, Renesas RZ/T2H, RZ/N2H, RZ/T2H i RZ/N2H, Aspeed AST27xx, Meta Clemente BMC, Netcube Nagami som, Tqma91xx, Ultratronik i.MX8MP Ultra-MACH, i.MX8ULP EVK9, Buffalo WXR-1750DHP.
Jednocześnie latynoamerykańska Fundacja Wolnego Oprogramowania stworzyła wersję w pełni wolnego jądra 6.18 — Linux-libre 6.18-gnu, oczyszczoną z elementów firmware i sterowników zawierających nie-wolne komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W wydaniu 6.18 zaktualizowano kod czyszczenia blobów w sterownikach Nova-Core, Intel XE, TI PRUeth, Lantiq GSWIP, Marvell WiFi-Ex. Wykonano czyszczenie nazw blobów w plikach dts (devicetree) dla chipów ARM Qualcomm, Mediatek i TI ARM64. Zneutralizowano ładowanie blobów w nowych sterownikach FourSemi fs2104/5s, TI TAS2783 oraz Qualcomm GENI.
Źródło: opennet.ru

