Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 6.14. Wśród najbardziej zauważalnych zmian znajdują się: sterownik ntsync z prymitywami synchronizacji Windows NT, konfiguracja równoważenia operacji odczytu w Btrfs RAID1, wsparcie dla reflink w XFS w trybie realtime, możliwość buforowanego wejścia/wyjścia bez pamięci podręcznej, cgroup dmem do ograniczania pamięci GPU, wykorzystanie io_uring w FUSE, delegowanie atrybutów w NFS, wsparcie dla atomowych zapisów w Device mapper, przyspieszenie linków symbolicznych, zarządzanie możliwością uruchamiania skryptów, wsparcie dla chipów Qualcomm Snapdragon 8 Elite, sterownik dla NPU AMD.
W nowej wersji przyjęto 12115 poprawek od 1984 deweloperów, rozmiar łatki wynosi 39 MB (zmiany dotyczyły 10170 plików, dodano 531586 linii kodu, usunięto 235999 linii). W poprzednim wydaniu było 14172 poprawek od 2086 deweloperów, rozmiar łatki wynosił 46 MB. Około 41% wszystkich zaprezentowanych w wersji 6.14 zmian dotyczy sterowników urządzeń, około 13% zmian ma związek z aktualizacją kodu specyficznego dla architektur sprzętowych, 14% dotyczy stosu sieciowego, 7% - systemów plików, a 4% z wewnętrznych podsystemów jądra.
Główne nowości w jądrze 6.14:
- Podsystem dyskowy, wejście/wyjście i systemy plików
- W systemie plików Btrfs pojawiło się wsparcie dla nowych metod równoważenia operacji odczytu między nośnikami wchodzącymi w skład macierzy RAID1. Oprócz wcześniej działającego rozkładu obciążenia na podstawie identyfikatorów procesów (pid), w nowej wersji zaproponowano trzy nowe tryby równoważenia: „rotation” (równe rozłożenie obciążenia na wszystkie nośniki, tryb włączony domyślnie); „latency” (rozkład uwzględniający opóźnienia, może być przydatny w przypadku awarii lub niestabilnej pracy nośników); devid (ręczne zarządzanie). Aby zmienić tryb równoważenia, dodano interfejs „/sys/fs/btrfs//read_policy”. Wśród innych zmian w Btrfs — realizacja ioctl FS_IOC_READ_VERITY_METADATA.
- Dodano tryb buforowanego wejścia/wyjścia bez buforowania, w którym dane są usuwane z pamięci podręcznej strony od razu po zakończeniu operacji ich odczytu lub zapisu. Zmiana może być korzystna przy korzystaniu z bardzo szybkich urządzeń pamięci masowej, gdzie buforowanie operacji w pamięci RAM jest zbędne. Dla takich urządzeń nowy tryb pozwala na wykluczenie nadmiernego zużycia pamięci przez pamięć podręczną strony bez potrzeby korzystania z złożonego API bezpośredniego wejścia/wyjścia (Direct I/O).
- W fsnotify, mechanizmie śledzenia zmian w systemie plików, dodano nowe zdarzenie FS_PRE_ACCESS, generowane w fazie przed dostępem do zawartości pliku. Zdarzenie jest przetwarzane w trybie synchronicznym, co oznacza, że jądro wysyła zdarzenie i czeka na odpowiedź. Jeśli odpowiedź zostanie otrzymana – operacja jest wykonywana, a jeśli wystąpi błąd – wywołanie systemowe zwraca kod błędu do przestrzeni użytkownika. Dzięki FS_PRE_ACCESS proces w przestrzeni użytkownika może na przykład organizować wypełnienie pliku w miarę dostępności danych w wolnym magazynie.
- W subsystemie FUSE, umożliwiającym tworzenie implementacji systemów plików w przestrzeni użytkownika, dodano wsparcie dla wymiany danych między jądrem a programem w przestrzeni użytkownika z użyciem mechanizmu wejścia/wyjścia io_uring. Zmiana pozwala na poprawę wydajności FUSE przez redukcję przełączeń kontekstu między jądrem a przestrzenią użytkownika.
- W systemie plików XFS dodano możliwość użycia odwrotnego mapowania (rmap, reverse-mapping) w trybie pracy z przewidywalnymi opóźnieniami („realtime device”). Odwrócone mapowanie pozwala określić, do przechowywania którego pliku używany jest dany blok na urządzeniu pamięci masowej. Dzięki rmap w XFS dla trybu realtime zrealizowano wsparcie dla operacji reflink, umożliwiającej tworzenie kopii plików poprzez klonowanie metadanych pliku i tworzenie odniesienia do już istniejących danych bez ich fizycznego kopiowania.
- W VFS wdrożono buforowanie rozmiaru dowiązań symbolicznych, co pozwoliło na przyspieszenie wykonania operacji readlink o 1,5% (w teście z /initrd.img w ext4). Buforowanie włączono w systemach plików ext4 i tmpfs.
- W realizacji NFSv4.2 dodano wsparcie dla delegacji atrybutów plików, co umożliwia zarządzanie takimi atrybutami jak czas modyfikacji (mtime) po stronie klienta NFS, bez konieczności przekazywania zmian na serwer. W NFS poprawiono również wsparcie dla protokołu „LOCALIO”, który pozwala określić, czy klient i serwer NFS znajdują się na tym samym hoście, aby wykorzystać odpowiednie optymalizacje, takie jak użycie bezpośredniego wejścia/wyjścia (Direct I/O) przez klienta.
- Zwiększono wydajność operacji odczytu w systemach plików NETFS, CIFS i AFS (Andrew File System).
- W Squashfs wprowadzono tryb bezpośredniego ładowania bloków do pamięci podręcznej stron (SQUASHFS_FILE_DIRECT), co pozwala na ominięcie osobnej pamięci podręcznej read_page. Zmiana ta pozwoliła zmniejszyć zużycie pamięci podczas pracy z Squashfs.
- W wywołaniu systemowym statx() wprowadzono flagę STATX_DIO_READ_ALIGN, aby określić wymagane wyrównanie dla operacji odczytu z pliku.
- W systemie plików Bcachefs zaktualizowano i ustabilizowano format struktur dysków. Jakiekolwiek przyszłe zmiany formatu będą traktowane jako opcjonalne i będą realizowane w formie opcjonalnych dodatków. Znacząco zwiększono prędkość sprawdzania integralności FS. Ponadto w Bcachefs poprawiono działanie w trybie tylko do odczytu; usunięto problemy prowadzące do dostępu do pamięci po jej zwolnieniu (use after free); rozwiązano problemy z wskaźnikami reflink w fsck; poprawiono obsługę ponownego uruchamiania transakcji.
- Przywrócono moduł md-linear, przeznaczony do łączenia urządzeń blokowych. Moduł ten został wcześniej uznany za przestarzały i usunięty z jądra 6.8, ale okazało się, że jest potrzebny, dlatego został teraz przywrócony.
- Systemy plików F2FS i SQUASHFS przeszły na używanie foliów stron pamięci (page folios).
- Systemy plików OCFS2 i DLMFS przeszły na używanie nowego API montowania partycji.
- W sterowniku null_blk wprowadzono atrybut „rotational”, ustawiany przez configfs, który pozwala symulować pracę z urządzeniem opartym na obracających się dyskach w celu uproszczenia testowania funkcji jądra.
- W systemie Device mapper oraz w modułach dm-mirror, dm-io, dm-table, dm-linear, dm-stripe i dm-raid1 dodano wsparcie dla atomowych zapisów.
- Pamięć i usługi systemowe
- Zakończono integrację z jądrem sterownika ntsync, implementującego urządzenie symboliczne /dev/ntsync oraz zestaw prymitywów synchronizacji stosowanych w jądrze Windows NT. Implementacja takich prymitywów na poziomie jądra pozwala znacznie zwiększyć wydajność gier Windows uruchamianych za pomocą Wine. Wzrost wydajności osiągany jest dzięki wyeliminowaniu kosztów związanych z używaniem RPC w przestrzeni użytkownika. Utworzenie oddzielnego sterownika dla jądra Linux tłumaczy się problemami z poprawną realizacją API synchronizacji NT na istniejących prymitywach w jądrze.
- Dodano nowy kontroler cgroup DMEM do oddzielnego naliczania obszarów pamięci urządzeń, takich jak GPU. DMEM umożliwia tworzenie osobnych cgroup dla różnych zadań korzystających z GPU, aby mogły one działać bez wzajemnego wpływu. Nowa funkcjonalność rozwiązuje problem przymusowego zakończenia operacji GPU przy wyczerpaniu dostępnej pamięci, dzięki naliczaniu pamięci GPU oraz pamięci CPU wykorzystywanej przez sterowniki w oddzielnych cgroup.
- Wprowadzone optymalizacje skalowania operacji czyszczenia (flush) pamięci podręcznej TLB (Translation Lookaside Buffer), stosowanego w celu przyspieszenia konwersji adresów wirtualnych na fizyczne. Dodane optymalizacje sprowadzają się do opóźnionego aktualizowania niektórych struktur danych podczas przełączania kontekstu, co pozwala na zwiększenie wydajności w trakcie przeprowadzania niektórych testów.
- Zwiększono wydajność mechanizmu MGLRU (Multi-Generational LRU), stosowanego do określania, które strony pamięci są używane, a które można wypchnąć do pamięci wirtualnej.
- Kontynuacja przenoszenia zmian z gałęzi Rust-for-Linux, związanych z używaniem 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). Umożliwiono użycie w kodzie jądra makra „derive(CoercePointee)”, które pozwala na wykorzystanie inteligentnych wskaźników z obiektami typu trait. W skład jądra włączono opakowania Rust dla PCI, platform, Open Firmware, urządzeń symbolicznych oraz niektórych funkcji we/wy. Greg Kroah-Hartman, odpowiadający za wsparcie stabilnej gałęzi jądra Linux, określił obecny stan jako „prawie gotowe do napisania rzeczywistego sterownika w Rust”.
- W skryptach budowlanych zaproponowano nowy kod do generowania wersji symboli debugowania dla modułów ładowanych, który teraz wykorzystuje informacje z wpisów debugowania w formacie DWARF, zamiast analizować kod źródłowy bezpośrednio. Zmiana ta umożliwia stosowanie wersjonowania symboli debugowania dla modułów napisanych w języku Rust. Stara implementacja również pozostała w jądrze, a wybór generatora dokonuje się na poziomie opcji budowy.
- Dla architektury PowerPC zaimplementowano wsparcie dla trybu leniwego wywłaszczania zadań (PREEMPT_LAZY, leniwe wywłaszczanie), który odpowiada trybowi pełnego wywłaszczania («full preemption») dla zadań realtime (RR/FIFO/DEADLINE), ale opóźnia wywłaszczenie zwykłych zadań (SCHED_NORMAL) do granicy tyku.
- Do podsystemu profilowania wydajności «perf» dodano wsparcie dla liczników zużycia energii procesorów AMD. Dodano możliwość pracy na systemach posiadających do 2048 rdzeni CPU.
- Umożliwiono korzystanie z parametru sysctl pid_max z przestrzeniami nazw identyfikatorów procesów (ID namespace). Parametr pid_max służy do ograniczenia maksymalnej wartości identyfikatorów procesów (PID) i może być teraz używany do ograniczenia maksymalnej liczby procesów uruchomionych w danej przestrzeni nazw. Przetwarzanie parametru odbywa się hierarchicznie, tzn. ograniczenia w zewnętrznych przestrzeniach nazw rozciągają się na zagnieżdżone przestrzenie nazw.
- Podczas korzystania z systemowego wywołania execveat w systemie plików /proc teraz wyświetlana będzie nazwa uruchamianego pliku, a nie numer deskryptora pliku.
- Do kodu źródłowego jądra (w katalogu samples/vfs) dodano narzędzie mountinfo, które demonstruje użycie wywołań systemowych statmount() i listmount().
- W subsysystemie BPF zaproponowano nowe funkcje bpf_local_irq_save() oraz bpf_local_irq_restore() do tymczasowego wyłączania przerwań na lokalnym CPU. Funkcje te można stosować do realizacji struktur, których przetwarzanie nie jest przerywane.
- W wywołaniu systemowym madvise() przy użyciu flag MADV_DONTNEED i MADV_FREE zapewniono zwolnienie tablic stron pamięci związanych z uwalnianym zakresem adresów, ponieważ w niektórych sytuacjach puste strony pamięci mogą zajmować dość dużo pamięci.
- Dla architektury OpenRISC zaimplementowano wsparcie dla mechanizmu sekwencji możliwych do restartu (rseq, restartable sequences), zaprojektowanego do szybkiego atomowego wykonywania operacji, które w przypadku przerwania przez inny wątek są czyszczone i podejmuje się ponowną próbę wykonania.
- Przeprowadzono reorganizację kodu z wdrożeniem algorytmów CRC32 i CRC-T10DIF, który już nie koliduje z subsystemem crypto i jest wywoływany bezpośrednio z interfejsu bibliotecznego. Zmiana pozwoliła uprościć kod i zwiększyć jego wydajność.
- Do systemu asynchronicznego wejścia/wyjścia io_uring dodano interfejs do przesyłania dodatkowych metadanych o integralności podczas wykonywania operacji odczytu i zapisu.
- Wirtualizacja i bezpieczeństwo
- Do wywołania systemowego execveat dodano flagę AT_EXECVE_CHECK, która umożliwia sprawdzenie dopuszczalności wykonania pliku bez jego faktycznego uruchamiania, z uwzględnieniem polityki bezpieczeństwa, praw dostępu i aktywnych modułów LSM. Do użycia w połączeniu z AT_EXECVE_CHECK zaproponowano flagi securebit SECBIT_EXEC_RESTRICT_FILE oraz SECBIT_EXEC_DENY_INTERACTIVE, które można wykorzystać do ograniczenia wykonywania plików ze skryptami w interpretowanych językach programowania. Flaga SECBIT_EXEC_RESTRICT_FILE nakłada na kompilatory i interpretery wymóg stosowania opcji AT_EXECVE_CHECK do sprawdzenia dopuszczalności wykonania, a flaga SECBIT_EXEC_DENY_INTERACTIVE zabrania przetwarzania komend interaktywnych. Główna idea zmiany polega na możliwości stosowania polityk bezpieczeństwa nie tylko do tradycyjnych plików wykonywalnych, ale również do plików tekstowych ze skryptami, które można załadować poprzez uruchomienie interpretera (tj. zakaz wykonania może być realizowany nie tylko przy uruchamianiu './script.sh', ale również przy wykonywaniu w formie 'sh script.sh').
- Na systemach x86 wprowadzono wsparcie dla zabezpieczonych liczników czasu dla systemów gościnnych, które uniemożliwiają zmianę zegara systemowego gościa z poziomu środowiska hosta. Możliwość ta została zrealizowana na bazie mechanizmu AMD SEV (Secure Encrypted Virtualization), stosowanego w systemach wirtualizacji w celu ochrony maszyn wirtualnych przed ingerencją ze strony hypervisora lub administratora systemu hosta.
- Do systemu mandatywnego dostępu SELinux dodano wsparcie dla zasad xperm, co umożliwia powiązanie polityk SELinux z określonymi wywołaniami ioctl() lub komunikatami netlink.
- Do podpisywania modułów jądra cyfrowym podpisem zamiast algorytmu SHA1 domyślnie używany jest algorytm SHA512.
- W sterownikach dla systemów gościnnych VirtualBox włączono wsparcie dla architektury ARM64.
- W hiperwizorze KVM kontynuowano prace nad wykorzystaniem mechanizmu Intel TDX (Trusted Domain Extensions) do szyfrowania pamięci systemów gościnnych.
- W virtio_blk dodano wsparcie dla trybu odzyskiwania błędów.
- Subsystem sieciowy
- W implementacji protokołu RxRPC pojawiła się możliwość używania dużych ramek UDP w celu zwiększenia przepustowości.
- Dla TCP dodano wsparcie dla algorytmu RACK-TLP do określania utraty pakietów.
- Dodano nowy parametr sysctl tcp_tw_reuse_delay, działający w kontekście przestrzeni nazw (network namespace) i umożliwiający określenie opóźnienia, przed którym system może ponownie użyć numeru portu sieciowego po zamknięciu gniazda TCP.
- Dodano możliwość wyboru dostawcy precyzyjnego czasu (PTP) do generowania znaczników czasowych na poziomie PHY i MAC.
- Dla IPsec wprowadzono wsparcie dla mechanizmu agregacji i fragmentacji enkapsulowanych pakietów IP — IP-TFS/AGGFRAG (IP Traffic Flow Security/Aggregation and Fragmentation Mode for Encapsulating Security Payload).
- Do systemu gniazd sieciowych dodano wsparcie dla przekazywania informacji o priorytecie (SO_PRIORITY) w formie komunikatów kontrolnych (cmsg). Dla gniazd sieciowych dodano opcję SO_RCVPRIORITY, która włącza w funkcji recvmsg() przekazywanie informacji o priorytecie gniazda.
- Sprzęt
- Dodano sterownik amdxdna dla zintegrowanych w procesorach AMD akceleratorów NPU (Neural Processing Unit) opartych na architekturze XDNA, przeznaczonych do przyspieszania operacji związanych z uczeniem maszynowym. NPU oparty na architekturze XDNA jest dostarczany w seriach procesorów AMD Ryzen 7040 i 8040, akceleratorach AMD Alveo V70 oraz SoC AMD Versal.
- Do sterownika i915 dodano identyfikatory nowych GPU, zaimplementowano obsługę błędów inicjalizacji HDMI, zwiększono niezawodność resetowania rdzeni GPU w systemach Haswell i starszych.
- Kontynuowana jest praca nad sterownikiem drm (Direct Rendering Manager) Xe dla GPU opartych na architekturze Intel Xe, stosowanej w kartach graficznych Intel z serii Arc oraz w zintegrowanej grafice, zaczynając od procesorów Tiger Lake.
- W sterowniku Nouveau dodano możliwość przesyłania buforów z logami GSP-RM przez debugfs.
- W sterowniku AMDGPU wprowadzono obsługę mechanizmu DRM panic, który wyświetla podobieństwo «niebieskiego ekranu śmierci» podczas awarii. Kontynuowane są przygotowania do obsługi przyszłej serii kart graficznych Radeon RX 9000 opartych na architekturze RDNA4. Zaktualizowano wsparcie dla DCN 3.5, GG 9.5, IH 4.4, PSP 13.x, SMU 13.x, VCN 5.x, JPEG 5.x, GC 12.x, DC FAMS, RAS oraz ISP.
- W sterowniku DRM msm (GPU Qualcomm Adreno) dodano obsługę platformy Qualcomm SM6150 (QCS615).
- W sterowniku DRM panfrost dodano wsparcie dla SoC MediaTek MT8188 z GPU Mali-G57.
- W sterowniku DRM vc4 dodano wsparcie dla SoC Broadcom BCM2712 (Raspberry Pi 5).
- W sterowniku vfio nvgrace-gpu dodano wsparcie dla chipów NVIDIA Grace Blackwell 200.
- W skład wchodzi sterownik do kontrolerów Intel THC (Touch Host Controller), stosowany do interakcji z ekranami dotykowymi i touchpadami w niektórych laptopach. Dodano wsparcie dla urządzeń Wacom z interfejsem PCI. Dodano wsparcie dla kontrolerów gier QH Electronics.
- Dodano wsparcie dla platform ARM, SoC i urządzeń: Qualcomm Snapdragon 8 Elite (SM8750), Qualcomm Snapdragon AR2 (SAR2130P), Qualcomm IQ6/IQ8, Snapdragon 425 (MSM8917), Samsung Exynos 9810, Blaize BLZP1600, Microchip SAMA7D65, Renesas R-Car V4H ES3.0, Renesas RZ/G3E. Dodano wsparcie dla SoC SpacemiT K1 opartego na architekturze RISC-V.
- W systemie dźwiękowym ALSA dla MIDI 2.0 rozszerzono API rawmidi i sequencer. W API do przenoszenia operacji kompresji na stronę karty dźwiękowej dodano obsługę ASRC (Asynchronous Sample Rate Conversion).
- Dodano wsparcie dla systemów dźwiękowych urządzeń Allwinner suinv F1C100s, Awinc AW88083, Realtek ALC5682I-VE, TAS2781, Focusrite Scarlett 4th Gen 16i16, 18i16 i 18i20. Dodano wsparcie dla bezprzewodowych słuchawek SteelSeries Arctis 9.
Źródło: opennet.ru
