Wydanie jądra Linux 5.16

Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 5.16. Wśród najbardziej zauważalnych zmian znajdują się: wywołanie systemowe futex_waitv w celu zwiększenia wydajności gier Windows w Wine, monitorowanie błędów w systemie plików za pomocą fanotify, koncepcja foliantów w gospodarce pamięcią, wsparcie dla instrukcji procesora AMX, możliwość rezerwacji pamięci dla gniazd sieciowych, wsparcie w netfilter dla klasyfikacji pakietów na etapie „egress”, wykorzystanie podsystemu DAMON do wstępnego usuwania nieużywanych obszarów pamięci, poprawa obsługi przeciążeń przy dużej liczbie operacji zapisu, wsparcie dla dysków twardych z wieloma napędami.

Nowa wersja zawiera 15415 poprawek od 2105 programistów, rozmiar łaty wynosi 45 MB (zmiany dotyczą 12023 plików, dodano 685198 linijek kodu, usunięto 263867 linijek). Około 44% wszystkich przedstawionych w 5.16 zmian dotyczy sterowników urządzeń, około 16% zmian odnosi się do aktualizacji kodu specyficznego dla architektur sprzętowych, 16% dotyczy stosu sieciowego, 4% – systemów plików, a 4% – wewnętrznych podsystemów jądra.

Główne nowości w jądrze 5.16:

  • Podsystem dyskowy, wejście/wyjście i systemy plików
    • Do mechanizmu fanotify dodano środki do monitorowania stanu systemu plików oraz śledzenia występowania błędów. Informacje o błędach są przekazywane za pomocą nowego rodzaju zdarzeń – FAN_FS_ERROR, które mogą być przechwytywane w działających systemach monitorowania przestrzeni użytkownika, aby na bieżąco informować administratora lub uruchamiać procesy naprawy. W przypadku kaskadowego wystąpienia serii błędów, fanotify zapewnia dostarczenie komunikatu o pierwszym błędzie wraz z ogólnym licznikiem problemów, aby ułatwić późniejsze zrozumienie przyczyn awarii. Obsługa śledzenia błędów jest obecnie realizowana tylko dla systemu plików Ext4.
    • Ulepszono obsługę przeciążeń podczas operacji zapisu (write congestion), które występują, gdy objętość operacji zapisu przewyższa pojemność nośnika, a system musi blokować żądania procesu zapisu do momentu zakończenia realizacji już przekazanych żądań. W nowej wersji całkowicie przebudowano mechanizm jądra używany do pozyskiwania informacji o wystąpieniu przeciążeń i blokowaniu zadań, gdyż w starej implementacji obserwowano problemy z synchronizacją obsługi przeciążeń zapisu z wymianą stron pamięci do obszaru swap w przypadku braku pamięci w systemie.
    • W Btrfs wprowadzono wsparcie dla technologii strefowania urządzeń (Zoned Namespace), stosowanej w dyskach twardych lub NVMe SSD do podziału przestrzeni magazynowej na strefy, składające się z grup bloków lub sektorów, do których dozwolone jest jedynie sekwencyjne dodawanie danych z aktualizacją całej grupy bloków. Ponadto wprowadzono niewielkie optymalizacje logowania inode, co pozwoliło uzyskać wzrost wydajności w teście dbench o 3% oraz skrócić opóźnienia o 11%. Przebudowano mechanizm logowania katalogów, redukując liczbę operacji wyszukiwania i blokad w drzewie, aby zwiększyć efektywność. Przyspieszono wstawianie elementów w trybie zbiorczym do struktury btree (czas masowej wstawki elementów skrócono o 4%, a usunięcia o 12%). Dodano ograniczone wsparcie dla użycia kompresji podczas zapisu niepełnych stron oraz możliwość defragmentacji podstron (subpage). Przygotowano wsparcie dla włączenia drugiej wersji protokołu dla polecenia „send”.
    • W systemie plików XFS zredukowano zużycie pamięci dzięki zastosowaniu oddzielnych pamięci podręcznych typu slab dla często używanych elementów oraz redukcji niektórych struktur danych.
    • W systemie plików Ext4 odnotowano jedynie poprawki błędów oraz dokładniejsze obliczenie parametrów opóźnionej inicjalizacji tabeli Inode.
    • Na poziomie urządzeń blokowych wprowadzono optymalizacje, które znacząco zwiększają efektywność przypisywania operacji do rdzeni CPU.
    • Dodano wstępną obsługę dysków twardych z wieloma niezależnymi napędami (multi-actuator), które umożliwiają jednoczesny dostęp do wielu sektorów w różnych strefach magnetycznej płyty.
    • Dodano nowe polecenie ioctl CDROM_TIMED_MEDIA_CHANGE do określania zdarzeń zmiany nośnika w napędzie optycznym.
    • W systemie plików EROFS (Enhanced Read-Only File System) dodano możliwość pracy na wielu urządzeniach pamięci masowej. Różne urządzenia mogą być odzwierciedlane w jednym 32-bitowym obszarze adresowym bloków. Dodano również wsparcie dla kompresji z użyciem algorytmu LZMA.
    • W systemie plików F2FS dodano opcje montowania do zarządzania fragmentacją plików podczas przechowywania (na przykład do debugowania optymalizacji pracy z fragmentowanymi magazynami).
    • W CEPH domyślnie włączono operacje tworzenia i usuwania katalogów w trybie asynchronicznym (aby przywrócić stare zachowanie, należy użyć flagi '-o wsync' podczas montowania). Dodano prowadzenie metryk śledzących operacje kopiowania zewnętrznych obiektów.
    • W CIFS dodano parametr montowania tcpnodelay, w którym dla gniazda sieciowego ustawia się tryb tcp_sock_set_nodelay, wyłączający oczekiwanie na wypełnienie kolejki w stosie TCP. Dodano wsparcie dla zagnieżdżonych linków DFS (Distributed File System) podczas ponownego montowania.
    • Dodano wsparcie dla kończenia żądań do urządzenia blokowego w trybie pakietowym. Testy zmiany wykazały wzrost intensywności wykonywania operacji losowego odczytu z nośników Optane z 6.1 do 6.6 mln IOPS na jednym rdzeniu CPU.
  • Pamięć i usługi systemowe
    • Dodano nowy systemowy wywołanie futex_waitv, umożliwiające monitorowanie stanu wielu futexów za pomocą jednego wywołania systemowego. Ta możliwość przypomina funkcjonalność WaitForMultipleObjects dostępną w Windows, a jej emulacja przez futex_waitv może być przydatna do zwiększenia wydajności gier Windows uruchamianych pod Wine lub Proton. Co więcej, jednoczesne oczekiwanie na futexy może być stosowane również w celu optymalizacji wydajności natywnych portów gier dla Linux.
    • Zrealizowano koncepcję foliów pamięci (page folios), której zastosowanie w niektórych subsystemach jądra pozwoli przyspieszyć zarządzanie pamięcią przy standardowych obciążeniach. Obecnie główny subsystem zarządzania pamięcią w jądrze oraz implementacja pamięci podręcznej stron zostały już przetłumaczone na foliów, a w przyszłości planuje się również przetłumaczenie systemów plików. Dodatkowo, w jądrze planowane jest wprowadzenie wsparcia dla foliów wielostronicowych.

      Folia przypominają złożone strony pamięci (compound pages), ale różnią się ulepszoną semantyką i bardziej zrozumiałą organizacją pracy. W celu zarządzania pamięcią systemową dostępna pamięć RAM dzielona jest na strony pamięci, których rozmiar zależy od architektury, ale w systemach x86 wynosi zwykle 4096 bajtów. Nowoczesne systemy wyposażone są w dziesiątki gigabajtów RAM, co skomplikuje zarządzanie pamięcią z powodu konieczności obsługi ogromnej liczby stron pamięci. Aby zmniejszyć liczbę stron, wcześniej w jądrze zaimplementowano koncepcję złożonych stron (compound pages) ze strukturami obejmującymi więcej niż jedną fizyczną stronę pamięci. Jednak API do manipulacji złożonymi stronami pamięci pozostawiało wiele do życzenia i prowadziło do dodatkowych kosztów.

    • Do planisty zadań dodano obsługę uwzględniającą klasteryzację pamięci podręcznej w CPU. W niektórych procesorach, takich jak Kunpeng 920 (ARM) i Intel Jacobsville (x86), określona liczba rdzeni CPU, zwykle 4, może współdzielić pamięć podręczną L3 lub L2. Uwzględnienie takich topologii może znacznie zwiększyć efektywność rozdzielania zadań pomiędzy rdzeniami CPU w planie, ponieważ przenoszenie zadań w ramach jednego klastra CPU pozwala zwiększyć przepustowość dostępu do pamięci i zmniejszyć rywalizację w pamięci podręcznej.
    • Dodano wsparcie dla instrukcji AMX (Advanced Matrix Extensions), wdrażanych w nadchodzących serwerowych procesorach Intel Xeon Scalable, rozwijanych pod kodową nazwą Sapphire Rapids. AMX oferuje nowe konfigurowalne rejestry TMM "TILE" oraz instrukcje do manipulacji danymi w tych rejestrach, takie jak TMUL (Tile matrix MULtiply) do mnożenia macierzy.
    • Zrealizowano kilka nowych możliwości opartych na dodanym w poprzedniej wersji subsystemie DAMON (Data Access MONitor), który umożliwia śledzenie dostępu do danych w pamięci operacyjnej, w powiązaniu z wybranym procesem działającym w przestrzeni użytkownika. Na przykład, subsystem umożliwia analizę, do jakich dokładnie obszarów pamięci odwoływał się proces w trakcie swojej pracy, a które obszary pamięci pozostały niewykorzystane.
      • DAMON_RECLAIM do identyfikacji i wypróżniania obszarów pamięci, do których nie było odwołań. Mechanizm ten można wykorzystać do proaktywnego, łagodnego wypróżniania stron pamięci w sytuacjach zbliżających się do wyczerpania dostępnej pamięci.
      • DAMOS (Data Access Monitoring-based Operation Schemes) do stosowania określonych operacji madvise(), takich jak zwalnianie dodatkowej pamięci, do obszarów pamięci procesu, dla których rejestrowana jest określona częstotliwość dostępu do pamięci. Konfiguracja parametrów DAMOS odbywa się przez debugfs.
      • Możliwość monitorowania fizycznej przestrzeni adresowej pamięci (wcześniej można było śledzić tylko adresy wirtualne).
    • Realizacja algorytmu kompresji zstd została zaktualizowana do wersji 1.4.10, co pozwoliło znacznie zwiększyć wydajność różnych subsystemów jądra, w których stosowana jest kompresja (np. rozpakowywanie obrazu jądra przyspieszyło o 35%, wydajność rozpakowywania skompresowanych danych w Btrfs i SquashFS wzrosła o 15%, a w ZRAM — o 30%). Początkowo w jądrze zastosowano osobną implementację zstd opartą na wersji 1.3.1, wydanej ponad trzy lata temu i nieobejmującej wielu ważnych optymalizacji. Oprócz przejścia na aktualną wersję, dodana łatka również upraszcza synchronizację z gałęzią upstream zstd, umożliwiając generowanie kodu do włączenia w jądro bezpośrednio z głównego repozytorium zstd. W przyszłości kod zstd w jądrze ma być aktualizowany w miarę wydawania nowych wersji biblioteki zstd.
    • Wprowadzono szereg usprawnień w podsystemie eBPF. Dodano możliwość wywoływania z programów BPF funkcji modułów jądra. Zaimplementowano funkcję bpf_trace_vprintk(), w przeciwieństwie do bpf_trace_printk() umożliwiającą wypisywanie jednocześnie więcej niż trzech argumentów. Dodano nową strukturę przechowywania danych (BPF map) bloom filter, pozwalającą wykorzystać tę samą probabilistyczną strukturę danych do określenia obecności elementu w zbiorze. Dodano nowy element BTF_KIND_TAG, który może być stosowany w programach BPF do przypisywania tagów do parametrów funkcji, na przykład w celu uproszczenia wykrywania błędów w programach użytkowników. W libbpf zezwolono na tworzenie własnych sekcji .rodata.*/.data.*, zaimplementowano wsparcie dla zdarzeń śledzenia uprobe i kprobe, dodano API do kopiowania wszystkich typów BTF z jednego obiektu do drugiego. Wsparcie dla AF_XDP przeniesiono z libbpf do oddzielnej biblioteki libxdp. Dla architektury MIPS zaimplementowano kompilator JIT dla maszyny wirtualnej BPF.
    • Dla architektury ARM64 zaimplementowano wsparcie dla rozszerzeń ARMv8.6 dla timera, w tym umożliwiające samosynchronizację widoku rejestrów systemowych bez użycia instrukcji ISB.
    • Dla architektury PA-RISC zaimplementowano możliwość zastosowania mechanizmu KFENCE do wykrywania błędów w operacjach pamięci oraz dodano wsparcie dla detektora stanów wyścigu KCSAN.
    • Udostępniono możliwość konfiguracji praw dostępu do tracefs na poziomie poszczególnych użytkowników i grup, na przykład teraz można zezwolić na dostęp do narzędzi śledzenia tylko członkom określonej grupy.
  • Wirtualizacja i bezpieczeństwo
    • W podsystemach io_uring i device-mapper zaimplementowano wsparcie dla generowania zdarzeń audytu. W io_uring wprowadzono możliwość zarządzania dostępem poprzez moduły LSM. Dodano możliwość audytu wywołania systemowego openat2().
    • Kod jądra całkowicie pozbył się nieprzerywanych wyrażeń case w switch (bez return lub break po każdym bloku case). Podczas kompilacji jądra będzie teraz można zastosować tryb "-Wimplicit-fallthrough".
    • Włączono zmiany mające na celu zaostrzenie kontroli granic podczas wykonywania funkcji memcpy().
    • W interfejsie asynchronicznego wejścia/wyjścia io_uring zaimplementowano możliwość stosowania do operacji wejścia/wyjścia polityk bezpieczeństwa określonych przez moduły SELinux i Smack.
    • W podsystemie IMA (Integrity Measurement Architecture), umożliwiającym zewnętrznej usłudze weryfikację stanu podsystemów jądra w celu zapewnienia ich autentyczności, zaimplementowano możliwość stosowania zasad opartych na identyfikatorze grupy (GID), do której należy plik lub w którą wchodzi użytkownik uzyskujący dostęp do pliku.
    • Niektóre zaawansowane mechanizmy ochrony wątków seccomp() przed atakami klasy Spectre są domyślnie wyłączone, ponieważ uznano je za zbędne, znacząco nie zwiększające bezpieczeństwa, ale negatywnie wpływające na wydajność. Zrewidowano zastosowanie ochrony Retpoline.
    • Usunięto implementację mechanizmu cryptoloop, który w 2004 roku został zastąpiony przez dm-crypt, obsługujący te same algorytmy w razie potrzeby.
    • Domyślnie zablokowano nieuprzywilejowany dostęp do podsystemu eBPF. Zmiana wprowadzono w celu zapobieżenia wykorzystaniu programów BPF do omijania ochrony przed atakami kanałami bocznymi. W razie potrzeby administrator może przywrócić możliwość korzystania z eBPF przez użytkowników bez uprzywilejowań.
    • Do hipernadzorcy ACRN, zaprojektowanego do wykonywania zadań czasu rzeczywistego oraz użycia w krytycznych systemach, dodano wsparcie dla tworzenia/usuwania wirtualnych urządzeń oraz przekazywania urządzeń MMIO.
    • W silniku kryptograficznym dodano wsparcie dla definicji KPP (Key-agreement Protocol Primitives), upraszczających logikę tworzenia sterowników dla systemów kryptograficznych.
    • Dla hipernadzorcy Hyper-V wprowadzono wsparcie dla trybu izolacji, maszyn wirtualnychoznaczającego szyfrowanie zawartości pamięci.
    • W hiperwizorze KVM dodano wsparcie dla architektury RISC-V. Zrealizowano możliwość migracji w obrębie hosta wirtualnych maszyn wykonywanych z użyciem rozszerzeń AMD SEV i SEV-ES. Dodano API do migracji na żywo gościnnych systemów szyfrowanych przy użyciu AMD SEV (Secure Encrypted Virtualization).
    • Dla architektury PowerPC domyślnie włączono tryb STRICT_KERNEL_RWX, blokujący użycie stron pamięci, które są jednocześnie dostępne do zapisu i wykonania.
    • Na 32-bitowych systemach x86 zaprzestano wsparcia dla gorącego podłączania pamięci (Memory hotplug), które przez ponad rok było w stanie nieaktywności.
    • Z jądra usunięto bibliotekę liblockdep, która teraz będzie utrzymywana oddzielnie od jądra.
  • Subsystem sieciowy
    • Dla gniazd wprowadzono nową opcję SO_RESERVE_MEM, za pomocą której można zarezerwować określoną ilość pamięci dla gniazda, która zawsze będzie dostępna dla gniazda i nie zostanie odebrana. Użycie tej opcji pozwala zwiększyć wydajność poprzez ograniczenie w sieci operacji alokacji i zwracania pamięci, szczególnie w przypadku wystąpienia warunków niedoboru pamięci w systemie.
    • Dodano wsparcie dla protokołu automatycznego tunelowania multicastowego (Automatic Multicast Tunneling, RFC 7450), który pozwala na dostarczanie multicastowego ruchu z sieci obsługujących multicast do odbiorców w sieciach bez multicastu. Protokół działa poprzez inkapsulację w pakietach UDP.
    • Ulepszono inkapsulację danych IOAM (In-situ Operations, Administration, and Maintenance) w pakietach tranzytowych.
    • W interfejsie API netlink w ethtool dodano możliwość zarządzania trybami zasilania nadajników.
    • W subsystemie netfilter wprowadzono możliwość klasyfikacji pakietów na poziomie egress, tj. w momencie, gdy sterownik otrzymuje pakiet od stosu sieciowego jądra. W nftables wsparcie odpowiednich filtrów pojawiło się w wersji 1.0.1. W netfilter dodano możliwość dopasowywania i modyfikacji wewnętrznych nagłówków i danych dla UDP i TCP (inner header / payload), które następują po nagłówku transportowym (transport header).
    • Dodano nowe parametry sysctl arp_evict_nocarrier i ndisc_evict_nocarrier, przy których ustaleniu cache ARP i tabela ndisc (discovery sąsiadów) będą czyszczone w przypadku zerwania połączenia (NOCARRIER).
    • W mechanizmie zarządzania kolejkami sieciowymi fq_codel (Controlled Delay) dodano tryby Low Latency, Low Loss i Scalable Throughput (L4S).
  • Sprzęt
    • W sterowniku amdgpu wprowadzono początkowe wsparcie specyfikacji DP 2.0 (DisplayPort 2.0) i możliwości tunelowania DisplayPort przez USB4. Dla APU Cyan Skillfish (wyposażonych w GPU Navi 1x) dodano wsparcie dla kontrolerów wyświetlacza. Rozszerzono wsparcie dla APU Yellow Carp (mobilne procesory Ryzen 6000 „Rembrandt”).
    • W sterowniku i915 ustabilizowano wsparcie dla chipów Intel Alderlake S i wprowadzono wsparcie dla technologii Intel PXP (Protected Xe Path), która umożliwia organizację pracy sprzętowo chronionej sesji graficznej na systemach z chipami Intel Xe.
    • W sterowniku nouveau przeprowadzono prace nad poprawą błędów i ulepszeniem stylu kodu.
    • Dodano wsparcie dla procesorów zgodnych z x86 Vortex (Vortex86MX). Linux na takich procesorach działał wcześniej, ale wyraźna identyfikacja tych CPU była potrzebna do wyłączenia zabezpieczeń przed atakami Spectre/Meltdown, które nie mają zastosowania do tych chipów.
    • Dodano wstępne wsparcie dla platform x86 Surface Pro 8 i Surface Laptop Studio.
    • Dodano sterownik do obsługi chipów audio używanych w APU AMD Yellow Carp, Van Gogh, a także dodano wsparcie dla systemów dźwiękowych i kodeków Cirrus CS35L41, Maxim MAX98520/MAX98360A, Mediatek MT8195, Nuvoton NAU8821, NVIDIA Tegra210, NXP i.MX8ULP, Qualcomm AudioReach, Realtek ALC5682I-VS, RT5682S, RT9120, Rockchip RV1126 i RK3568.
    • Dodano sterownik ishtp_eclite do uzyskiwania dostępu do zintegrowanych kontrolerów Intel PSE (Programmable Service Engine) za pomocą protokołu ISHTP (Integratd Sensor Hub Transport Protocol), na przykład do zbierania danych o akumulatorze, temperaturze i informacji związanych z UCSI (USB Type-C Connector System Software Interface).
    • Dodano sterownik dla kontrolerów gier Nintendo Switch, z obsługą urządzeń Switch Pro i Joy-Cons. Dodano wsparcie dla tabletów Wacom Intuos BT (CTL-4100WL/CTL-6100WL) oraz klawiatury Apple 2021 Magic Keyboard. Ulepszono wsparcie dla kontrolerów Sony PlayStation DualSense. Dodano wsparcie dla bocznych przycisków myszy Xiaomi Mi.
    • Dodano sterownik RT89 z obsługą bezprzewodowych chipów Realtek 802.11ax, a także sterowniki dla adapterów Ethernet Asix AX88796C-SPI i przełączników Realtek RTL8365MB-VC.
    • Dla chipów Apple M1 dodano sterowniki dla PCI i PASemi i2c.
    • Dodano wsparcie dla SoC ARM, urządzeń i płyt Raspberry Pi Compute Module 4, Fairphone 4, Snapdragon 690, LG G Watch R, Sony Xperia 10 III, Samsung Galaxy S4 Mini Value Edition, Xiaomi MSM8996 (Mi 5, Mi Note 2, Mi 5s, Mi Mix, Mi 5s Plus i Xiaomi Mi 5), Sony Yoshino (Sony Xperia XZ1 i Sony Xperia XZ Premium), F(x)tec Pro1 QX1000, Microchip LAN966, CalAmp LMU5000, Exegin Q5xR5, sama7g5, Samsung ExynosAutov9, Rockchip RK3566, RK3399 ROCK Pi 4A+, RK3399 ROCK Pi 4B+, Firefly ROC-RK3328-PC, Firefly ROC-RK3399-PC-PLUS, ASUS Chromebook Tablet CT100, Pine64 Quartz64-A, Netgear GS110EMX, Globalscale MOCHAbin 7040, NXP S32G2, Renesas R8A779M*, Xilinx Kria, Radxa Zero, JetHub D1/H1, Netronix E70K02.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster