Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 5.11. Wśród najbardziej zauważalnych zmian znajdują się: wsparcie dla Enklaw Intel SGX, nowy mechanizm przechwytywania wywołań systemowych, wirtualna magistrala auxiliary, zakaz kompilacji modułów bez MODULE_LICENSE(), tryb szybkiej filtracji wywołań systemowych w seccomp, zakończenie wsparcia dla architektury ia64, przeniesienie technologii WiMAX do gałęzi «staging», możliwość enkapsulacji SCTP w UDP.
W nowej wersji przyjęto 15480 poprawek od 1991 programistów, rozmiar łaty wynosi 72 MB (zmiany dotyczyły 12090 plików, dodano 868025 linijek kodu, usunięto 261456 linijek). Około 46% wszystkich przedstawionych w 5.11 zmian związane jest z sterownikami urządzeń, około 16% zmian dotyczy aktualizacji kodu specyficznego dla architektur sprzętowych, 13% dotyczy stosu sieciowego, 3% — systemów plików, a 4% z wewnętrznymi podsystemami jądra.
Główne nowości:
- Podsystem dyskowy, wejście/wyjście i systemy plików
- W Btrfs dodano kilka opcji montowania do zastosowania przy odzyskiwaniu danych z uszkodzonego FS: «rescue=ignorebadroots» do montowania pomimo uszkodzeń niektórych korzeni drzew (extent, uuid, data reloc, device, csum, free space), «rescue=ignoredatacsums» do wyłączenia sprawdzania sum kontrolnych dla danych oraz «rescue=all» do jednoczesnego włączenia trybów ‘ignorebadroots’, ‘ignoredatacsums’ i ‘nologreplay’. Zakończono wsparcie dla opcji montowania «inode_cache», która wcześniej została ogłoszona jako przestarzała. Przygotowano kod do wdrożenia wsparcia dla bloków z metadanymi i danymi mniejszymi od strony (PAGE_SIZE) oraz wsparcia dla trybu strefowanego przydzielania miejsca. Niebuforowane (Direct IO) zapytania zostały przeniesione na infrastrukturę iomap. Zoptymalizowano wydajność szeregu operacji, w niektórych przypadkach przyspieszenie może osiągać dziesiątki procent.
- W XFS wprowadzono flagę «needsrepair», sygnalizującą konieczność naprawy. Po ustawieniu tej flagi FS nie może być zamontowane, dopóki flaga nie zostanie zresetowana przez narzędzie xfs_repair.
- W Ext4 wprowadzono jedynie poprawki błędów i optymalizacje, a także dokonano czyszczenia kodu.
- Zezwolono na ponowny eksport systemów plików zamontowanych na NFS (to znaczy, że zamontowany przez NFS podział można teraz eksportować przez NFS i używać jako pośredniego cache).
- W systemowym wywołaniu close_range(), które pozwala procesowi na jednoczesne zamknięcie całego zakresu otwartych deskryptorów plików, dodano opcję CLOSE_RANGE_CLOEXEC do zamykania deskryptorów w trybie close-on-exec.
- W systemie plików F2FS dodano nowe wywołania ioctl(), umożliwiające zarządzanie z poziomu użytkownika tym, które pliki są przechowywane w skompresowanej postaci. Dodano opcję montowania „compress_mode=” do wyboru, gdzie umieszczony jest zarządzający kompresją kontroler po stronie jądra lub w przestrzeni użytkownika.
- Umożliwiono montowanie Overlayfs przez procesy nieuprzywilejowane, używając oddzielnej przestrzeni identyfikatorów użytkowników (user namespace). W celu weryfikacji zgodności z modelem bezpieczeństwa przeprowadzono pełny audyt kodu. W Overlayfs dodano również możliwość uruchamiania z użyciem kopii obrazów systemu plików dzięki opcjonalnemu wyłączeniu weryfikacji UUID.
- W systemie plików Ceph dodano wsparcie dla protokołu msgr2.1, który umożliwia stosowanie algorytmu AES-GCM podczas przesyłania danych w zaszyfrowanej postaci.
- W module dm-multipath wprowadzono możliwość uwzględnienia przywiązania do CPU („IO affinity”) podczas wyboru trasy dla żądań wejścia/wyjścia.
- Pamięć i usługi systemowe
- Dodano nowy mechanizm przechwytywania wywołań systemowych oparty na prctl(), który pozwala z poziomu użytkownika generować wyjątki podczas odwoływania się do określonego wywołania systemowego i emulować jego wykonanie. Wskazana funkcjonalność jest pożądana w Wine i Proton w celu emulacji wywołań systemowych Windows, co jest niezbędne do zapewnienia zgodności z grami i programami, które bezpośrednio wykonują wywołania systemowe, omijając Windows API (na przykład w celu ochrony przed nieautoryzowanym użyciem).
- W systemowym wywołaniu userfaultfd(), przeznaczonym do obsługi błędów page faults (odwołań do nieprzydzielonych stron pamięci) w przestrzeni użytkownika, pojawiła się możliwość wyłączenia przetwarzania wyjątków występujących na poziomie jądra, aby utrudnić wykorzystanie niektórych luk.
- W podsystemie BPF dodano wsparcie dla lokalnego przechowywania danych dla zadań (task-local storage), zapewniającego przywiązanie danych do konkretnego przetwarzającego BPF.
- Całkowicie przebudowano monitorowanie zużycia pamięci przez programy BPF — aby zarządzać wykorzystaniem pamięci w obiektach BPF, zamiast memlock rlimit wprowadzono kontroler cgroup.
- W mechanizmie BTF (BPF Type Format), który dostarcza informacje do weryfikacji typów w pseudokodzie BPF, zaimplementowano wsparcie dla modułów jądra.
- W interfejsie asynchronicznego wejścia/wyjścia io_uring dodano wsparcie dla wywołań systemowych shutdown(), renameat2() i unlinkat(). Przy wywołaniu io_uring_enter() dodano możliwość wskazania limitu czasowego (wsparcie argumentu do wskazywania limitu czasowego można sprawdzić przy użyciu flagi IORING_FEAT_EXT_ARG).
- Architektura ia64, stosowana w procesorach Intel Itanium, została przeklasyfikowana do kategorii porzuconych ('orphaned'), co oznacza zaprzestanie testowania. Firma Hewlett Packard Enterprise zakończyła przyjmowanie zamówień na nowy sprzęt Itanium, a Intel uczynił to jeszcze w zeszłym roku.
- Zaprzestano wsparcia dla systemów opartych na architekturze MicroBlaze, które nie były wyposażone w jednostkę zarządzania pamięcią (MMU). Takie systemy dawno już nie są spotykane w użytkowaniu.
- Dla architektury MIPS dodano wsparcie dla testowania pokrycia kodu (coverage testing) z wykorzystaniem narzędzia gcov.
- Dodano wsparcie dla wirtualnej magistrali auxiliary do współpracy z wielofunkcyjnymi urządzeniami, które łączą funkcjonalności wymagające różnych sterowników (np. karty sieciowe z obsługą Ethernet i RDMA). Magistrala może być używana do przypisania dla urządzenia pierwotnego i wtórnego sterownika, w sytuacji, gdy trudne jest użycie podsystemu MFD (Multi-Function Devices).
- Dla architektury RISC-V dodano wsparcie dla systemu rozdzielania pamięci CMA (Contiguous Memory Allocator), który jest zoptymalizowany do przydzielania dużych ciągłych obszarów pamięci z wykorzystaniem techniki przenoszenia stron pamięci. Dla RISC-V zrealizowano również środki ograniczające dostęp do /dev/mem oraz śledzenie czasu obsługi przerwań.
- Dla 32-bitowych systemów ARM dodano wsparcie dla narzędzia debugowego KASan (Kernel address sanitizer), które pozwala na wykrywanie błędów związanych z pamięcią. Dla 64-bitowych ARM implementacja KASan została przeniesiona na użycie tagów MTE (MemTag).
- Dodano wywołanie systemowe epoll_pwait2(), które umożliwia korzystanie z limitów czasowych z precyzją nanosekundową (wywołanie epoll_wait operuje na milisekundach).
- W systemie budowy zapewniono wyjście błędu przy próbie kompilacji modułów jądra, w których nie zdefiniowano licencji na kod przy pomocy makra MODULE_LICENSE(). Błąd podczas kompilacji będzie również wywoływany przez użycie makra EXPORT_SYMBOL() dla funkcji statycznych.
- Dodano obsługę mapowania obiektów GEM z pamięci wykorzystywanej do wejścia/wyjścia, co pozwoliło przyspieszyć pracę z framebufferem na niektórych architekturach.
- W Kconfig zakończono wsparcie dla Qt4 (pozostawiono wsparcie dla Qt5, GTK i Ncurses).
- Wirtualizacja i bezpieczeństwo
- Do wywołania systemowego seccomp() dodano wsparcie dla trybu szybkiej reakcji, pozwalającego bardzo szybko określić, czy dane wywołanie systemowe jest dozwolone czy zabronione na podstawie przylegającej do procesu tabeli uprawnień (constant-action bitmap), która nie wymaga uruchamiania programu BPF.
- Zintegrowano komponenty jądra do tworzenia i zarządzania enklawami opartymi na technologii Intel SGX (Software Guard eXtensions), umożliwiającej aplikacjom wykonywanie kodu w izolowanych, zaszyfrowanych obszarach pamięci, z ograniczonym dostępem dla reszty systemu.
- W ramach inicjatywy ograniczającej dostęp z przestrzeni użytkownika do rejestrów MSR (model-specific register) zabroniono zapisu do rejestru MSR_IA32_ENERGY_PERF_BIAS, który pozwala na zmianę trybu efektywności energetycznej procesora ("normalny", "wydajność", "oszczędność energii").
- Z gałęzi kernel-rt dla systemów czasu rzeczywistego przeniesiono możliwość wyłączenia migracji wysokopriorytetowych zadań między CPU.
- Dla systemów ARM64 dodano możliwość stosowania znaczników MTE (MemTag, Memory Tagging Extension) dla adresów pamięci obsługujących sygnały. Użycie MTE jest włączane poprzez wskazanie opcji SA_EXPOSE_TAGBITS w sigaction() i pozwala na organizację weryfikacji poprawności użycia wskaźników w celu zablokowania wykorzystania luk, wywołanych odwołaniami do już zwolnionych bloków pamięci, przepełnieniami bufora, odwołaniami przed inicjacją i użyciem poza bieżącym kontekstem.
- Dodano parametr „DM_VERITY_VERIFY_ROOTHASH_SIG_SECONDARY_KEYRING”, pozwalający subsysteemowi dm-verity weryfikować hash-podpisy certyfikatów umieszczonych w drugorzędnym magazynie kluczy (keyring). W praktyce konfiguracja ta pozwala na weryfikację nie tylko certyfikatów wbudowanych w jądro, ale również certyfikatów załadowanych w czasie pracy, co umożliwia aktualizację certyfikatów bez konieczności aktualizacji całego jądra.
- W trybie User-mode Linux dodano wsparcie dla trybu suspend-to-idle, który umożliwia zamrożenie środowiska i użycie sygnału SIGUSR1 do wybudzenia z trybu uśpienia.
- W mechanizmie virtio-mem, który pozwala na gorące podłączanie i odłączanie pamięci w maszynach wirtualnych, dodano wsparcie dla trybu dużego bloku (BBM, Big Block Mode), co pozwala na przesyłanie lub odbieranie pamięci w blokach przewyższających rozmiar bloku pamięci jądra, co jest niezbędne do optymalizacji VFIO w QEMU.
- W działającej na poziomie jądra implementacji TLS dodano wsparcie dla szyfru CHACHA20-POLY1305.
- Subsystem sieciowy
- Dla 802.1Q (VLAN) wprowadzono mechanizm zarządzania awariami połączenia (CFM, Connectivity Fault Management), który pozwala na wykrywanie, weryfikację i izolację awarii w sieciach z wirtualnymi mostami (Virtual Bridged Networks). Na przykład, CFM można używać do lokalizowania problemów w sieciach obejmujących kilka niezależnych organizacji, których pracownicy mają dostęp tylko do swojego sprzętu.
- Dodano wsparcie dla enkapsulacji pakietów protokołu SCTP w pakietach UDP (RFC 6951), co pozwala na korzystanie z SCTP w sieciach z starszymi translatorami adresów, które nie obsługują SCTP bezpośrednio, a także na implementację SCTP w systemach, które nie zapewniają bezpośredniego dostępu do warstwy IP.
- Implementacja technologii WiMAX została przeniesiona do staging i w przyszłości planowane jest jej usunięcie, jeśli nie znajdą się użytkownicy, którzy potrzebują WiMAX. WiMAX nie jest już używany w publicznych sieciach, a w jądrze jedynym sterownikiem, z którym można używać WiMAX, pozostaje przestarzały sterownik Intel 2400m. W konfiguratorze sieci NetworkManager wsparcie dla WiMAX zostało zakończone w 2015 roku. Obecnie WiMax jest praktycznie w pełni wypierany przez takie technologie jak LTE, HSPA+ i Wi-Fi 802.11n.
- Przeprowadzono prace nad optymalizacją wydajności obsługi przychodzącego ruchu TCP w trybie zerocopy, czyli bez dodatkowego kopiowania do nowych buforów. Dla ruchu średniej wielkości, obejmującego dziesiątki lub kilkaset kilobajtów danych, zastosowanie zerocopy zamiast recvmsg() jest znacznie bardziej efektywne. Na przykład wprowadzone zmiany pozwoliły zwiększyć efektywność obsługi ruchu RPC z komunikatami o wielkości 32 KB przy użyciu zerocopy o 60-70%.
- Dodano nowe wywołania ioctl() do tworzenia mostów sieciowych obejmujących wiele kanałów PPP. Proponowana funkcjonalność umożliwia przesyłanie ramek z jednego kanału do drugiego, na przykład z PPPoE do sesji PPPoL2TP.
- Kontynuowana jest integracja z jądrem MPTCP (MultiPath TCP), rozszerzenia protokołu TCP, które umożliwia działanie połączenia TCP z dostarczaniem pakietów jednocześnie przez wiele tras przez różne interfejsy sieciowe przypisane do różnych adresów IP. W nowej wersji wdrożono wsparcie dla opcji ADD_ADDR do ogłaszania dostępnych adresów IP do których możliwe jest połączenie przy dodawaniu nowych strumieni do istniejącego połączenia MPTCP.
- Dodano możliwość konfiguracji działań w przypadku przekroczenia budżetu polingowania połączeń (busy-polling). Wcześniej dostępny tryb SO_BUSY_POLL zakładał przełączenie na softirq przy wyczerpaniu budżetu. Dla aplikacji, które muszą nadal korzystać z polingowania, proponuje się nową opcję SO_PREFER_BUSY_POLL.
- W IPv6 wdrożono wsparcie dla trybów SRv6 End.DT4 i End.DT6, stosowanych do tworzenia wielodostępnych IPv4 L3 VPN i urządzeń VRF (Wirtualne routowanie i przekazywanie).
- W Netfilter ujednolicono implementację wyrażeń set, co umożliwiło wskazanie wielu wyrażeń dla każdego elementu list set.
- W bezprzewodowej stos 802.11 dodano API do konfigurowania ograniczeń mocy SAR oraz parametrów AE PWE i HE MCS. W sterowniku Intel iwlwifi dodano wsparcie zakresu 6 GHz (Ultra High Band). W sterowniku Qualcomm Ath11k dodano wsparcie technologii szybkiej konfiguracji połączenia FILS (Fast Initial Link Setup, znormalizowanej jako IEEE 802.11ai), która pozwala na eliminację opóźnień podczas roamingu w trakcie migracji z jednego punktu dostępowego do drugiego.
- Sprzęt
- W sterowniku amdgpu wdrożono wsparcie dla APU AMD „Green Sardine” (Ryzen 5000) i GPU „Dimgrey Cavefish” (Navi 2), a także wstępne wsparcie dla APU AMD Van Gogh z rdzeniem Zen 2 i GPU RDNA 2 (Navi 2). Dodano wsparcie dla nowych identyfikatorów APU Renoir (opartych na CPU Zen 2 i GPU Vega).
- W sterowniku i915 dla kart graficznych Intel zaimplementowano wsparcie dla technologii IS (Integer scaling) z realizacją filtra do skalowania uwzględniającego stan sąsiednich pikseli (interpolacja Nearest-neighbor) w celu określenia koloru brakujących pikseli. Rozszerzono wsparcie dla dedykowanych kart Intel DG1. Zrealizowano wsparcie dla technologii „Big Joiner”, obecnej od układów Ice Lake / Gen11, która umożliwia użycie jednego transcoder do przetwarzania dwóch strumieni, na przykład do wyjścia na ekran 8K przez jeden DisplayPort. Dodano tryb asynchronicznego przełączania między dwoma buforami w pamięci wideo (async flip).
- W sterowniku nouveau dodano początkowe wsparcie dla GPU NVIDIA opartego na mikroarchitekturze „Ampere” (GA100, GeForce RTX 30xx), na razie ograniczone do narzędzi do zarządzania trybami wideo.
- Dodano wsparcie dla protokołu 3WIRE, używanego w panelach LCD. Dodano wsparcie dla paneli novatek nt36672a, TDO tl070wsh30, Innolux N125HCE-GN1 i ABT Y030XX067A 3.0. Osobno można wyróżnić wsparcie dla panelu smartfona OnePlus 6 i 6T, co umożliwiło uruchomienie na urządzeniach niemodyfikowanego jądra.
- Dodano wsparcie dla pierwszego dyskretnego kontrolera hosta USB4 Intel Maple Ridge.
- Dodano wsparcie dla kodeków dźwiękowych Allwinner H6 I2S, Analog Devices ADAU1372, Intel Alderlake-S, GMediatek MT8192, NXP i.MX HDMI i XCVR, Realtek RT715 oraz Qualcomm SM8250.
- Dodano wsparcie dla platform ARM, urządzeń i platform: Galaxy Note 10.1, Microsoft Lumia 950 XL, NanoPi R1, FriendlyArm ZeroPi, Elimo Initium SBC, Broadcom BCM4908, Mediatek MT8192/MT6779/MT8167, MStar Infinity2M, Nuvoton NPCM730, Marvell Armada 382, Mikrotik na bazie Marvell Prestera 98DX3236, serwery z Nuvoton NPCM750 BMC, Kontron i.MX8M Mini, Espressobin Ultra, Chromebook „Trogdor”, Kobol Helios64, Engicam PX30.Core.
- Wbudowano wsparcie dla konsoli do gier Ouya opartej na NVIDIA Tegra 3.
Jednocześnie latynoamerykańska Fundacja Wolnego Oprogramowania opracowała wersję całkowicie wolnego jądra 5.11 — Linux-libre 5.11-gnu, oczyszczonego z elementów firmware i sterowników zawierających niesekretne komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W nowym wydaniu przeprowadzono czyszczenie sterowników dla qat_4xxx (crypto), lt9611uxcm (dsi/hdmi bridge), ccs/smia++ (sensor), ath11k_pci, nxp audio transceiver i mhi pci controller. Zaktualizowano kod czyszczenia blobów w sterownikach i subsystemach amdgpu, btqca, btrtl, btusb, i915 csr. Wyłączono nowe bloby w m3 rproc, idt82p33 ptp clock i qualcomm arm64.
Źródło: opennet.ru
