Wydanie jądra Linuksa 5.16

Po dwóch miesiącach prac Linus Torvalds przedstawił wydanie jądra Linuksa 5.16. Do najważniejszych zmian należą: wywołanie systemowe futex_waitv poprawiające wydajność gier Windows w Wine, śledzenie błędów w FS poprzez fanotify, koncepcja folio w systemie zarządzania pamięcią, obsługa instrukcji procesora AMX, możliwość rezerwowania pamięci dla gniazd sieciowych, obsługa klasyfikacji pakietów na etapie „wychodzenia” netfiltera, wykorzystanie podsystemu DAMON do proaktywnej eksmisji nieużywanych obszarów pamięci, usprawnienie obsługi przeciążeń przy dużym wolumenie operacji zapisu, obsługa wielodyskowych dysków twardych.

Nowa wersja zawiera 15415 2105 poprawki od 45 programistów, rozmiar łatki to 12023 MB (zmiany dotyczyły 685198 263867 plików, dodano 44 5.16 linii kodu, usunięto 16 16 linii). Około 4% wszystkich zmian wprowadzonych w wersji 4 dotyczy sterowników urządzeń, około XNUMX% zmian dotyczy aktualizacji kodu specyficznego dla architektur sprzętowych, XNUMX% dotyczy stosu sieciowego, XNUMX% dotyczy systemów plików, a XNUMX% są powiązane z wewnętrznymi podsystemami jądra.

Główne innowacje w jądrze 5.16:

  • Podsystem dyskowy, wejścia/wyjścia i systemy plików
    • Do mechanizmu fanotify dodano narzędzia umożliwiające monitorowanie stanu systemu plików i śledzenie występowania błędów. Informacja o błędach przekazywana jest za pomocą nowego typu zdarzeń - FAN_FS_ERROR, które mogą zostać przechwycone w systemach monitorujących działających w przestrzeni użytkownika, aby niezwłocznie poinformować administratora lub uruchomić procesy naprawcze. Kiedy kaskadowo pojawia się seria błędów, fanotify zapewnia dostarczenie pierwszego komunikatu o błędzie wraz z ogólnym licznikiem problemów, aby uprościć późniejszą analizę przyczyny awarii. Obsługa śledzenia błędów jest obecnie zaimplementowana tylko dla systemu plików Ext4.
    • Poprawiono obsługę przeciążenia zapisu, które występuje, gdy ilość operacji zapisu przekracza przepustowość dysku i system jest zmuszony blokować żądania zapisu procesu do czasu zakończenia żądań, które już zostały przesłane. W nowej wersji mechanizm jądra służący do uzyskiwania informacji o wystąpieniu przeciążenia i blokowaniu zadań został całkowicie przeprojektowany, ponieważ w starej implementacji występowały problemy ze sprzężeniem przetwarzania przeciążenia zapisu z przemieszczeniem stron pamięci do wymiany sekcji, gdy w systemie nie ma wystarczającej ilości pamięci.
    • Btrfs implementuje obsługę technologii strefowania urządzeń (Zoned Namespace), wykorzystywanej w dyskach twardych lub dyskach SSD NVMe do dzielenia przestrzeni dyskowej na strefy, które tworzą grupy bloków lub sektorów, do których dozwolone jest jedynie sekwencyjne dodawanie danych, aktualizując całą grupę Bloki. Ponadto wprowadzono drobne optymalizacje w logowaniu i-węzłów, co zwiększyło przepustowość w teście dbench o 3% i zmniejszyło opóźnienia o 11%. Przeprojektowano mechanizm logowania katalogów, w którym w celu zwiększenia wydajności zmniejszono liczbę operacji wyszukiwania i blokowania w drzewie. Przyspieszono wstawianie elementów do struktury btree w trybie wsadowym (czas masowego wstawiania elementów został skrócony o 4%, a usuwania o 12%). Dodano ograniczoną obsługę kompresji przy pisaniu częściowych stron, a także możliwość defragmentacji podstron. Poczyniono przygotowania umożliwiające obsługę drugiej wersji protokołu dla komendy „wyślij”.
    • System plików XFS zmniejsza zużycie pamięci poprzez użycie oddzielnych płytowych pamięci podręcznych dla często używanych elementów i redukcję niektórych struktur danych.
    • W systemie plików Ext4 odnotowuje się jedynie poprawki błędów i dokładniejsze obliczenia parametrów leniwej inicjalizacji tabeli i-węzłów.
    • Optymalizacje zostały wdrożone na poziomie urządzeń blokowych, aby znacząco zwiększyć efektywność łączenia operacji z rdzeniami procesora.
    • Dodano wstępną obsługę dysków twardych z wieloma niezależnymi napędami (multi-siłownik), umożliwiając jednoczesny dostęp do kilku sektorów w różnych obszarach talerza magnetycznego.
    • Dodano nową komendę ioctl CDROM_TIMED_MEDIA_CHANGE do wykrywania zdarzeń zmiany nośnika w napędzie optycznym.
    • System plików EROFS (Enhanced Read-Only File System) dodał możliwość pracy na wielu urządzeniach pamięci masowej. Różne urządzenia można mapować do pojedynczej 32-bitowej przestrzeni adresowej bloku. Dodano także obsługę kompresji z wykorzystaniem algorytmu LZMA.
    • Do systemu plików F2FS dodano opcje montowania, aby kontrolować fragmentację plików po umieszczeniu ich w pamięci (na przykład w celu debugowania optymalizacji pod kątem pracy z pofragmentowaną pamięcią masową).
    • CEPH domyślnie umożliwia asynchroniczne tworzenie i usuwanie katalogów (użyj flagi „-o wsync” podczas montowania, aby przywrócić stare zachowanie). Dodano obsługę metryk śledzących operacje kopiowania obiektów zewnętrznych.
    • Do CIFS dodano parametr montowania tcpnodelay, który ustawia tryb tcp_sock_set_nodelay dla gniazda sieciowego, co wyłącza oczekiwanie na zapełnienie stosu TCP przez kolejkę. Dodano obsługę zagnieżdżonych łączy DFS (rozproszony system plików) podczas ponownego montowania.
    • Dodano obsługę kompletowania żądań do urządzenia blokowego w trybie wsadowym. Testowanie zmiany wykazało wzrost intensywności operacji losowego odczytu z dysków Optane z 6.1 do 6.6 miliona IOPS na pojedynczym rdzeniu procesora.
  • Usługi pamięci i systemu
    • Dodano nowe wywołanie systemowe futex_waitv, które umożliwia monitorowanie stanu kilku futeksów jednocześnie za pomocą jednego wywołania systemowego. Ta funkcja przypomina funkcjonalność WaitForMultipleObjects dostępną w systemie Windows, której emulacja poprzez futex_waitv może być przydatna do poprawy wydajności gier Windows działających pod Wine lub Proton. Ponadto jednoczesne oczekiwanie na futeksy można również wykorzystać do optymalizacji wydajności natywnych kompilacji gier dla systemu Linux.
    • Zaimplementowano koncepcję folio stron, których zastosowanie w niektórych podsystemach jądra przyspieszy zarządzanie pamięcią przy typowych obciążeniach. Obecnie główny podsystem zarządzania pamięcią w jądrze i implementacja pamięci podręcznej stron zostały już przeniesione do folio, a w przyszłości planowane jest przeniesienie systemów plików. W przyszłości planowane jest także dodanie do jądra obsługi folio wielostronicowych.

      Tomy przypominają strony złożone, ale mają ulepszoną semantykę i przejrzystszą organizację pracy. Aby zarządzać pamięcią systemową, dostępna pamięć RAM jest dzielona na strony pamięci, których rozmiar różni się w zależności od architektury, ale w systemach x86 mierzony jest w kilobajtach (zwykle 4096 bajtów). Nowoczesne systemy wyposażone są w dziesiątki gigabajtów pamięci RAM, co utrudnia zarządzanie pamięcią ze względu na konieczność przetwarzania ogromnej liczby stron pamięci. Aby zmniejszyć liczbę stron, jądro wcześniej zaimplementowało koncepcję stron złożonych ze strukturami obejmującymi więcej niż jedną fizyczną stronę pamięci. Jednak interfejs API do manipulowania połączonymi stronami pamięci pozostawiał wiele do życzenia i prowadził do dodatkowych kosztów.

    • Do harmonogramu zadań dodano procedurę obsługi, która uwzględnia klastrowanie pamięci podręcznej w procesorze. W niektórych procesorach, takich jak Kunpeng 920 (ARM) i Intel Jacobsville (x86), pewna liczba rdzeni procesora, zwykle 4, może łączyć pamięć podręczną L3 lub L2. Uwzględnienie takich topologii może znacznie poprawić efektywność dystrybucji zadań pomiędzy rdzeniami procesora w harmonogramie zadań, ponieważ przenoszenie zadań w ramach tego samego klastra procesora pozwala zwiększyć przepustowość dostępu do pamięci i zmniejszyć rywalizację o pamięć podręczną.
    • Dodano obsługę instrukcji AMX (Advanced Matrix Extensions) zaimplementowanych w nadchodzących procesorach serwerowych Intel Xeon Scalable o nazwie kodowej Sapphire Rapids. AMX oferuje nowe konfigurowalne rejestry TMM „TILE” oraz instrukcje manipulacji danymi w tych rejestrach, takie jak TMUL (Tile matrix MULtiply) do mnożenia macierzy.
    • W oparciu o dodany w ostatniej wersji podsystem DAMON (Data Access MONitor) zaimplementowano kilka nowych funkcjonalności, które umożliwiają monitorowanie dostępu do danych w pamięci RAM w odniesieniu do wybranego procesu działającego w przestrzeni użytkownika. Podsystem umożliwia na przykład analizę, do jakich obszarów pamięci proces uzyskiwał dostęp w trakcie całego swojego działania, a które pozostały nieobsadzone.
      • DAMON_RECLAIM do identyfikowania i eksmitowania obszarów pamięci, do których nie uzyskano dostępu. Mechanizmu można używać do proaktywnego, miękkiego eksmitowania stron pamięci, gdy wolna pamięć jest bliska wyczerpania.
      • DAMOS (Schematy operacyjne oparte na monitorowaniu dostępu do danych) do stosowania określonych operacji madvise(), takich jak zwalnianie dodatkowej wolnej pamięci, do przetwarzania obszarów pamięci, dla których ustalona jest określona częstotliwość dostępu do pamięci. Parametry DAMOS konfiguruje się poprzez debugfs.
      • Możliwość monitorowania fizycznej przestrzeni adresowej pamięci (wcześniej można było monitorować tylko adresy wirtualne).
    • Implementacja algorytmu kompresji zstd została zaktualizowana do wersji 1.4.10, co znacznie poprawiło wydajność różnych podsystemów jądra korzystających z kompresji (np. rozpakowywanie obrazu jądra zostało przyspieszone o 35%, wydajność rozpakowywania skompresowanych danych w Btrfs i SquashFS wzrósł o 15%, a w ZRAM - o 30%. Jądro początkowo wykorzystywało osobną implementację zstd, opartą na wersji 1.3.1, która została wydana ponad trzy lata temu i nie zawierała wielu ważnych optymalizacji. Oprócz przejścia do aktualnej wersji, dodana łatka upraszcza także synchronizację z gałęzią nadrzędną zstd, umożliwiając wygenerowanie kodu do włączenia do jądra bezpośrednio z głównego repozytorium zstd. W przyszłości planowana jest aktualizacja kodu zstd w jądrze wraz z wydaniem nowych wersji biblioteki zstd.
    • Duża część ulepszeń została wprowadzona w podsystemie eBPF. Dodano możliwość wywoływania funkcji modułu jądra z programów BPF. Zaimplementowano funkcję bpf_trace_vprintk(), w przeciwieństwie do bpf_trace_printk(), która umożliwia jednoczesne wyświetlenie więcej niż trzech argumentów. Dodano nowy filtr rozkwitu struktury przechowywania danych (mapa BPF), który umożliwia wykorzystanie probabilistycznej struktury danych o tej samej nazwie do określenia obecności elementu w zestawie. Dodano nowy atrybut BTF_KIND_TAG, który można wykorzystać w programach BPF do powiązania tagów z parametrami funkcji, na przykład w celu ułatwienia wykrywania błędów w programach użytkownika. W libbpf możliwe jest tworzenie własnych sekcji .rodata.*/.data.*, zaimplementowano obsługę zdarzeń śledzenia uprobe i kprobe oraz dodano API umożliwiające kopiowanie wszystkich typów BTF z jednego obiektu do drugiego. Obsługa AF_XDP została przeniesiona z libbpf do osobnej biblioteki libxdp. Dla architektury MIPS zaimplementowano kompilator JIT dla maszyny wirtualnej BPF.
    • Dla architektury ARM64 zaimplementowano obsługę rozszerzeń timera ARMv8.6, w tym takich, które umożliwiają samosynchronizującą reprezentację rejestrów systemowych bez użycia instrukcji ISB.
    • Dla architektury PA-RISC zaimplementowano możliwość wykorzystania mechanizmu KFENCE do wykrywania błędów podczas pracy z pamięcią oraz dodano obsługę detektora stanu wyścigu KCSAN.
    • Istnieje możliwość skonfigurowania praw dostępu do narzędzi śledzenia na poziomie poszczególnych użytkowników i grup, na przykład można teraz zezwolić na dostęp do narzędzi śledzenia tylko członkom określonej grupy.
  • Wirtualizacja i bezpieczeństwo
    • Podsystemy io_uring i Device-Mapper implementują obsługę generowania zdarzeń audytu. io_uring zapewnia możliwość kontrolowania dostępu poprzez moduły LSM. Dodano możliwość audytu wywołania systemowego openat2().
    • Kod jądra jest całkowicie wolny od ciągłych wyrażeń wielkości liter w przełączniku (bez powrotu i przerwania po każdym bloku case). Podczas budowania jądra możliwe będzie teraz użycie trybu „-Wimplicit-fallthrough”.
    • Uwzględniono zmiany mające na celu zaostrzenie kontroli granic podczas wykonywania funkcji memcpy().
    • Asynchroniczny interfejs we/wy io_uring implementuje możliwość stosowania zasad bezpieczeństwa zdefiniowanych przez moduły SELinux i Smack do operacji we/wy.
    • Podsystem IMA (Integrity Measurement Architecture), który umożliwia zewnętrznej usłudze weryfikację stanu podsystemów jądra w celu zapewnienia ich autentyczności, implementuje możliwość stosowania reguł w oparciu o identyfikator grupy (GID), do której należy plik lub do której użytkownik dostęp do pliku należy.
    • Domyślnie wyłączone zostały niektóre zaawansowane mechanizmy chroniące wątki seccomp() przed atakami Spectre, które uznano za niepotrzebne i nie poprawiające znacząco bezpieczeństwa, ale negatywnie wpływające na wydajność. Zmieniono sposób stosowania ochrony Retpoline.
    • Usunięto implementację mechanizmu cryptoloop, który w 2004 roku został zastąpiony przez dm-crypt i w razie potrzeby obsługuje te same algorytmy.
    • Domyślnie nieuprzywilejowany dostęp do podsystemu eBPF jest zabroniony. Zmianę wprowadzono, aby zapobiec używaniu programów BPF do omijania ochrony przed atakami z kanału bocznego. W razie potrzeby administrator może przywrócić użytkownikom nieuprzywilejowanym możliwość korzystania z eBPF.
    • Hiperwizor ACRN, przeznaczony do zadań w czasie rzeczywistym i stosowania w systemach o znaczeniu krytycznym, dodał obsługę tworzenia/usuwania urządzeń wirtualnych i przekazywania urządzeń MMIO.
    • Do silnika kryptograficznego dodano obsługę definicji KPP (Key-agreement Protocol Primitives), upraszczając logikę tworzenia sterowników dla kryptosystemów.
    • Hiperwizor Hyper-V obsługuje teraz tryb izolacji maszyny wirtualnej, który obejmuje szyfrowanie zawartości pamięci.
    • Hiperwizor KVM dodał obsługę architektury RISC-V. Zaimplementowano możliwość migracji maszyn wirtualnych działających przy użyciu rozszerzeń AMD SEV i SEV-ES w obrębie środowiska hosta. Dodano API do migracji na żywo systemów gościa zaszyfrowanych przy użyciu AMD SEV (Secure Encrypted Virtualization).
    • Dla architektury PowerPC domyślnie włączony jest tryb STRICT_KERNEL_RWX, który blokuje korzystanie ze stron pamięci, które są jednocześnie dostępne do zapisu i wykonania.
    • W 32-bitowych systemach x86 zaprzestano obsługi pamięci typu hotplug, która nie działa od ponad roku.
    • Biblioteka liblockdep została usunięta z jądra i będzie teraz obsługiwana oddzielnie od jądra.
  • Podsystem sieciowy
    • Dla gniazd zaimplementowano nową opcję SO_RESERVE_MEM, dzięki której można zarezerwować dla gniazda określoną ilość pamięci, która zawsze pozostanie dla gniazda dostępna i nie zostanie usunięta. Użycie tej opcji umożliwia osiągnięcie zwiększonej wydajności poprzez zmniejszenie alokacji pamięci i operacji odzyskiwania na stosie sieciowym, zwłaszcza gdy w systemie występuje niedobór pamięci.
    • Dodano obsługę protokołu Automatic Multicast Tunneling (RFC 7450), który umożliwia dostarczanie ruchu multicast z sieci obsługujących Multicast do odbiorców w sieciach bez Multicast. Protokół działa poprzez enkapsulację w pakietach UDP.
    • Ulepszona enkapsulacja danych IOAM (operacje na miejscu, administracja i konserwacja) w pakietach tranzytowych.
    • Do interfejsu API ethtool netlink dodano możliwość kontrolowania trybów zużycia energii transiwera.
    • Podsystem netfilter implementuje możliwość klasyfikacji pakietów na poziomie wyjściowym, tj. na etapie, gdy sterownik odbiera pakiet ze stosu sieciowego jądra. W nftables obsługa odpowiednich filtrów pojawiła się w wersji 1.0.1. Netfilter dodał możliwość porównywania i zmiany wewnętrznych nagłówków i danych dla UDP i TCP (wewnętrzny nagłówek/ładunek) przychodzących po nagłówku transportowym.
    • Dodano nowe parametry sysctl arp_evict_nocarrier i ndisc_evict_nocarrier. Po ustawieniu pamięć podręczna ARP i tablica ndisc (wykrywanie sąsiadów) zostaną wyczyszczone w przypadku awarii połączenia (NOCARRIER).
    • Do mechanizmu zarządzania kolejką sieciową fq_codel (Controlled Delay) dodano tryby małych opóźnień, niskich strat i skalowalnej przepustowości (L4S).
  • Sprzęt
    • Sterownik amdgpu zapewnia wstępną obsługę specyfikacji DP 2.0 (DisplayPort 2.0) i tunelowania DisplayPort przez USB4. Dla jednostek APU Cyan Skillfish (wyposażonych w GPU Navi 1x) dodano obsługę kontrolerów wyświetlania. Rozszerzono obsługę procesorów APU Yellow Carp (procesory mobilne Ryzen 6000 „Rembrandt”).
    • Sterownik i915 stabilizuje obsługę układów Intel Alderlake S oraz implementuje obsługę technologii Intel PXP (Protected Xe Path), która pozwala na zorganizowanie zabezpieczonej sprzętowo sesji graficznej na systemach z chipami Intel Xe.
    • W nowym sterowniku włożono prace mające na celu naprawienie błędów i ulepszenie stylu kodu.
    • Dodano obsługę procesorów Vortex zgodnych z x86 (Vortex86MX). Linux pracował już wcześniej na podobnych procesorach, ale wymagana była wyraźna identyfikacja określonych procesorów, aby wyłączyć ochronę przed atakami Spectre/Meltdown, które nie mają zastosowania w przypadku określonych układów.
    • Dodano początkową obsługę platform x86 dla Surface Pro 8 i Surface Laptop Studio.
    • Dodano sterownik do obsługi układów dźwiękowych stosowanych w AMD Yellow Carp, Van Gogh APU, dodano także obsługę 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 umożliwiający dostęp do wbudowanych kontrolerów Intel PSE (Programmable Service Engine) przy użyciu protokołu ISHTP (Integratd Sensor Hub Transport Protocol), takich jak akumulator, temperatura i interfejs informacyjny związany z UCSI (oprogramowanie systemowe złącza USB Type-C).
    • Dodano sterownik dla kontrolerów gier Nintendo Switch obsługujący Switch Pro i Joy-Cons. Dodano obsługę tabletów Wacom Intuos BT (CTL-4100WL/CTL-6100WL) i klawiatury Apple 2021 Magic Keyboard. Ulepszona obsługa kontrolerów Sony PlayStation DualSense. Dodano obsługę bocznych przycisków myszy Xiaomi Mi.
    • Dodano sterownik RT89 z obsługą układów bezprzewodowych Realtek 802.11ax, a także sterowniki dla adapterów Ethernet Asix AX88796C-SPI i przełączników Realtek RTL8365MB-VC.
    • Do układów Apple M1 dodano sterowniki dla PCI i PASemi i2c.
    • Dodano obsługę ARM SoС, 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, Ren es R8A779M*, Xilinx Kria, Radxa Zero, JetHub D1/H1, Netronix E70K02.

Źródło: opennet.ru

Dodaj komentarz