Po dwóch miesiącach prac Linus Torvalds zaprezentował wersję jądra Linux 5.15. Do najbardziej zauważalnych zmian należy nowy sterownik NTFS z obsługą zapisu, moduł ksmbd z implementacją serwera SMB, podsystem DAMON do monitorowania dostępu do pamięci, prymitywy blokad dla trybu rzeczywistego, wsparcie dla fs-verity w Btrfs oraz wywołanie systemowe process_mrelease dla systemów reagujących na niedobór pamięci, a także moduł zdalnej atestacji dm-ima.
Nowa wersja zawiera 13499 poprawek od 1888 programistów, a rozmiar łatki wynosi 42 MB (zmiany objęły 10895 plików, dodano 632522 linie kodu, usunięto 299966 linii). Około 45% wszystkich przedstawionych zmian w wersji 5.15 dotyczy sterowników urządzeń, około 14% zmian ma związek z aktualizacją kodu specyficznego dla architektur sprzętowych, 14% dotyczy stosu sieciowego, 6% - systemów plików, a 3% - wewnętrznych subsystemów jądra.
Główne nowości:
- Podsystem dyskowy, wejście/wyjście i systemy plików
- Do jądra przyjęto nową implementację systemu plików NTFS, otwartą przez firmę Paragon Software. Nowy sterownik może działać w trybie zapisu i obsługuje wszystkie funkcje aktualnej wersji NTFS 3.1, w tym rozszerzone atrybuty plików, listy dostępu (ACL), tryb kompresji danych, efektywne zarządzanie lukami w plikach (sparse) oraz odtwarzanie zmian z dziennika w celu przywrócenia integralności po awariach.
- W systemie plików Btrfs zaimplementowano wsparcie dla mechanizmu fs-verity, stosowanego do przejrzystego kontrolowania integralności i autentyczności poszczególnych plików na podstawie kryptograficznych sum kontrolnych lub kluczy związanych z plikami, przechowywanych w obszarze metadanych. Wcześniej fs-verity był dostępny tylko dla systemów plików Ext4 i F2fs.
W Btrfs dodano również wsparcie dla mapowania identyfikatorów użytkowników dla zamontowanych systemów plików (wcześniej wsparcie dotyczyło systemów FAT, ext4 i XFS). Opisana możliwość pozwala na powiązanie plików określonego użytkownika w zamontowanej obcej partycji z innym użytkownikiem w bieżącym systemie.
Wśród innych zmian w Btrfs: przyspieszenie dodawania kluczy do indeksu katalogu w celu zwiększenia wydajności tworzenia plików; możliwość pracy raid0 z jednym urządzeniem oraz raid10 z dwoma (na przykład podczas rekonfiguracji macierzy); opcja „rescue=ibadroots” do ignorowania niepoprawnego drzewa zasobów; przyspieszenie operacji „send”; zmniejszenie konfliktów blokad podczas operacji zmiany nazw; możliwość użycia sektorów 4K w systemach z rozmiarem strony pamięci 64K.
- W XFS ustabilizowano możliwość używania w systemie plików dat po 2038 roku. Wprowadzono mechanizm opóźnionej deaktywacji inode oraz wsparcie dla opóźnionego ustawiania i usuwania atrybutów plików. W celu wyeliminowania problemów usunięto możliwość wyłączania kwot dyskowych dla już zamontowanych partycji (możliwe jest przymusowe wyłączenie kwot, ale związane z nimi obliczenia będą kontynuowane, dlatego dla pełnego wyłączenia wymagane jest ponowne zamontowanie).
- W EXT4 przeprowadzono prace nad zwiększeniem wydajności zapisu buforów delalloc oraz przetwarzania osieroconych plików (orphan), które nadal istnieją, ponieważ są otwarte, ale nie mają powiązania z katalogiem. Przetwarzanie operacji discard przeniesiono z wątku jbd2 kthread, aby wyeliminować blokady operacji z metadanymi.
- W F2FS dodano opcję „discard_unit=block|segment|section” do powiązania operacji discard (oznaczenie zwolnionych bloków, które można już nie przechowywać fizycznie) z wyrównaniem względem bloku, sektora, segmentu lub sekcji. Dodano wsparcie dla śledzenia zmian opóźnień przy operacjach wejścia/wyjścia.
- W systemie plików EROFS (Extendable Read-Only File System) dodano wsparcie dla bezpośredniego wejścia/wyjścia dla plików przechowywanych bez kompresji, a także wsparcie dla fiemap.
- W OverlayFS poprawne przetwarzanie flag montowania „immutable”, „append-only”, „sync” i „noatime”.
- W NFS poprawiono przetwarzanie sytuacji, gdy serwer NFS przestał odpowiadać na zapytania. Dodano możliwość montowania z już używanego serwera, ale dostępnego przez inny adres sieciowy.
- Rozpoczęto przygotowania do przepisania podsystemu FSCACHE.
- Dodano wsparcie dla partycji EFI z niestandardowym rozmieszczeniem tabel GPT.
- W mechanizmie fanotify wprowadzono nowy flaga FAN_REPORT_PIDFD, który prowadzi do wskazania pidfd wśród zwracanych metadanych. Pidfd pomaga w obsłudze sytuacji związanych z wielokrotnym używaniem PID, co pozwala na dokładniejszą identyfikację procesów, które uzyskują dostęp do śledzonych plików (pidfd jest powiązany z konkretnym procesem i nie zmienia się, podczas gdy PID może być przypisany do innego procesu po zakończeniu aktualnego procesu skojarzonego z tym PID).
- Do wywołania systemowego move_mount() dodano możliwość dodawania punktów montowania do istniejących wspólnych grup, co rozwiązuje problemy z zachowaniem i przywracaniem stanu procesów w narzędziu CRIU w przypadku wielu przestrzeni montowania współdzielonych w izolowanych kontenerach.
- Dodano ochronę przed ukrytymi stanami wyścigu, które mogą prowadzić do uszkodzenia plików podczas czytania z pamięci podręcznej w trakcie obsługi pustek w pliku.
- Zaprzestano wspierania obowiązkowych blokad plików, realizowanych poprzez blokowanie wywołań systemowych prowadzących do zmiany pliku. Z powodu możliwych stanów wyścigu, te blokady zostały uznane za niepewne i wiele lat temu ogłoszono je za przestarzałe.
- Usunięto podsystem LightNVM, który umożliwiał uzyskanie bezpośredniego dostępu do dysku SSD, omijając warstwę emulacji. LightNVM stracił sens po pojawieniu się standardów NVMe, które przewidują możliwość zoniowania (ZNS, Zoned Namespace).
- Pamięć i usługi systemowe
- Zrealizowano podsystem DAMON (Data Access MONitor), który umożliwia monitorowanie aktywności związanej z dostępem do danych w pamięci operacyjnej, w kontekście wybranego procesu działającego w przestrzeni użytkownika. Podsystem ten pozwala na analizę, do jakich obszarów pamięci proces miał dostęp przez cały czas swojej pracy, a które obszary pozostały niewykorzystane. Wśród cech DAMON wyróżnia się niskie obciążenie CPU, niewielkie zużycie pamięci, wysoką dokładność oraz przewidywalne stałe koszty eksploatacyjne, niezależne od rozmiaru. Podsystem może być wykorzystywany zarówno przez jądro do optymalizacji zarządzania pamięcią, jak i przez narzędzia w przestrzeni użytkownika, aby zrozumieć, co dokładnie robi proces i optymalizować wykorzystanie pamięci, na przykład poprzez zwalnianie zbędnej pamięci dla systemu.
- Zrealizowano wywołanie systemowe process_mrelease, które pozwala przyspieszyć proces zwalniania pamięci przez proces kończący swoje działanie. W normalnych warunkach zwalnianie zasobów i zakończenie procesu nie odbywa się natychmiastowo i z różnych powodów może być opóźnione, co utrudnia działanie systemów reagowania na niedobory pamięci działających w przestrzeni użytkownika, takich jak oomd (udostępniany w systemd) i lmkd (używany w Androidzie). Dzięki wywołaniu process_mrelease podobne systemy mogą bardziej przewidywalnie inicjować zwracanie pamięci od wymuszonych procesów kończących działanie.
- Z gałęzi jądra PREEMPT_RT, w której rozwijana jest obsługa pracy w czasie rzeczywistym, przeniesione zostały warianty prymitywów do organizacji blokad mutex, ww_mutex, rw_semaphore, spinlock oraz rwlock, oparte na podsystemie RT-Mutex. W alokatorze SLUB slab dodano zmiany, które poprawiają działanie w trybie PREEMPT_RT i zmniejszają wpływ na przerwania.
- W cgroup dodano wsparcie dla atrybutu planisty zadań SCHED_IDLE, co pozwala na oznaczenie tego atrybutem wszystkich procesów grupy należących do określonego cgroup. Oznacza to, że te procesy zostaną uruchomione tylko wtedy, gdy w systemie nie będzie innych zadań oczekujących na wykonanie. W przeciwieństwie do ustalania atrybutu SCHED_IDLE dla każdego procesu z osobna, przy przypisaniu SCHED_IDLE do cgroup przy wyborze zadania do wykonania uwzględniany jest względny ciężar zadań wewnątrz grupy.
- Mechanizm monitorowania zużycia pamięci w cgroup został rozszerzony o możliwość śledzenia dodatkowych struktur danych jądra, w tym tych tworzonych dla pollingu, przetwarzania sygnałów i przestrzeni nazw.
- Dodano wsparcie dla asymetrycznego planowania przypisania zadań do rdzeni procesora w architekturach, w których niektóre CPU mogą wykonywać 32-bitowe zadania, a inne działają tylko w trybie 64-bitowym (na przykład ARM). Nowy tryb pozwala przy planowaniu wykonywania 32-bitowych zadań uwzględniać tylko CPU, które wspierają 32-bitowe zadania.
- W interfejsie asynchronicznego wejścia/wyjścia io_uring pojawiło się wsparcie dla otwierania plików bezpośrednio w tabeli indeksowej fixed-file, bez używania deskryptora plików, co znacząco przyspiesza niektóre typy operacji, ale jest w sprzeczności z tradycyjnym procesem Uniksa stosowania deskryptorów plików do otwierania plików.
W io_uring dla subsystemu BIO (Block I/O Layer) zaimplementowano nowy mechanizm recyklingu („BIO recycling”), który pozwala na zmniejszenie kosztów zarządzania wewnętrzną pamięcią i zwiększenie liczby przetwarzanych operacji wejścia/wyjścia na sekundę o około 10%. W io_uring dodano także wsparcie dla wywołań systemowych mkdirat(), symlinkat() oraz linkat().
- Dla programów BPF wprowadzono możliwość zapytania i przetwarzania zdarzeń timera. Dodano iterator dla gniazd UNIX, a także możliwość uzyskiwania i ustawiania opcji gniazd dla setsockopt. W BTF dumperze dodano wsparcie dla typowanych danych.
- W systemach NUMA z różnymi typami pamięci, różniącymi się wydajnością, w sytuacji wyczerpania wolnej przestrzeni zrealizowano przenoszenie wypieranych stron pamięci z pamięci dynamicznej (DRAM) do wolniejszej pamięci trwałej (Persistent Memory) zamiast usuwania tych stron. Przeprowadzone testy wykazały, że taka taktyka zazwyczaj poprawia wydajność w takich systemach. Dla NUMA także wprowadzono możliwość rezerwacji stron pamięci dla procesu z wybranego zestawu węzłów NUMA.
- Dla architektury ARC wprowadzono wsparcie dla trzy- i czteropoziomowych tablic stron pamięci, co w przyszłości umożliwi wsparcie dla 64-bitowych procesorów ARC.
- Dla architektury s390 wprowadzono możliwość wykorzystania mechanizmu KFENCE do wykrywania błędów przy pracy z pamięcią, a także dodano wsparcie dla detektora stanów wyścigu KCSAN.
- Dodano wsparcie dla indeksowania listy komunikatów wyświetlanych przez printk(), co pozwala na jednoczesne wyciągnięcie wszystkich podobnych komunikatów i śledzenie zmian w przestrzeni użytkownika.
- W mmap() zaprzestano wsparcia dla opcji VM_DENYWRITE, a kod jądra pozbawiono użycia trybu MAP_DENYWRITE, co ograniczyło liczbę sytuacji prowadzących do zablokowania zapisu do pliku z błędem ETXTBSY.
- Do subsystemu śledzenia dodano nowy typ kontroli „Event probes”, które można podłączyć do istniejących zdarzeń śledzenia, definiując własny format wyjścia.
- Podczas kompilacji jądra z wykorzystaniem kompilatora Clang domyślnie uruchamiany jest teraz wbudowany assembler z projektu LLVM.
- W ramach projektu mającego na celu usunięcie z jądra kodu prowadzącego do wyświetlania ostrzeżeń przez kompilator, przeprowadzono eksperyment z włączeniem domyślnego trybu "-Werror", w którym ostrzeżenia kompilatora są traktowane jak błędy. W trakcie przygotowań do wydania 5.15 Linus zaczął akceptować wyłącznie zmiany, które nie prowadzą do ostrzeżeń podczas budowy jądra, i aktywował budowę z "-Werror", ale potem zgodził się z opinią, że to rozwiązanie jest przedwczesne i odłożył włączenie "-Werror" domyślnie. Zarządzanie włączeniem flagi "-Werror" podczas budowy odbywa się za pomocą parametru WERROR, który domyślnie ustawiony jest na wartość COMPILE_TEST, tzn. jest włączany tylko przy testowych kompilacjach.
- Wirtualizacja i bezpieczeństwo
- W Device Mapper (DM) dodano nowy handler dm-ima z realizacją mechanizmu zdalnej atestacji na podstawie podsystemu IMA (Integrity Measurement Architecture), umożliwiającego zewnętrznej usłudze weryfikację stanu podsystemów jądra, aby upewnić się o ich autentyczności. W praktyce dm-ima pozwala na tworzenie przy pomocy Device Mapper magazynów, związanych z zewnętrznymi systemami chmurowymi, w których przy pomocy IMA sprawdzana jest wiarygodność uruchamianej konfiguracji DM target.
- W prctl() wprowadzono nową opcję PR_SPEC_L1D_FLUSH, która po włączeniu powoduje, że jądro zaczyna resetować zawartość pamięci podręcznej pierwszego poziomu (L1D) za każdym razem przy przełączaniu kontekstu. Ten tryb pozwala na selektywne wprowadzenie dodatkowej ochrony dla najważniejszych procesów przed atakami kanałami bocznymi, które mają na celu określenie danych, które osiedliły się w pamięci podręcznej w wyniku podatności spowodowanych spekulacyjnym wykonywaniem instrukcji w CPU. Kosztem włączenia PR_SPEC_L1D_FLUSH (domyślnie nieaktywowane) jest znaczne obniżenie wydajności.
- Zrealizowano możliwość budowy jądra z dodaniem w GCC flagi "-fzero-call-used-regs=used-gpr", zapewniającej zerowanie wszystkich rejestrów przed powrotem kontroli z funkcji. Wskazana opcja pozwala zabezpieczyć się przed wyciekiem informacji z funkcji i o 20% zmniejsza liczbę bloków nadających się do budowy gadżetów ROP (Return-Oriented Programming) w exploitach.
- Zrealizowano możliwość kompilacji jąder dla architektury ARM64 w formie klientów dla hipernadzoru Hyper-V.
- Proponowany jest nowy framework do tworzenia sterowników „VDUSE”, umożliwiający realizację wirtualnych urządzeń blokowych w przestrzeni użytkownika oraz stosowanie Virtio jako transportu dla dostępu z systemów gości.
- Dodano sterownik Virtio dla magistrali I2C, który umożliwia emulację kontrolerów I2C w trybie parawirtualizacji z wykorzystaniem odrębnych backendów.
- Dodano sterownik Virtio gpio-virtio, który pozwala systemom gościnnym uzyskać dostęp do linii GPIO udostępnianych przez system gospodarza.
- Dodano możliwość ograniczenia dostępu do stron pamięci dla sterowników urządzeń obsługujących DMA w systemach bez I/O MMU (jednostka zarządzania pamięcią).
- W hipernadzorze KVM zrealizowano możliwość wyprowadzania statystyk w postaci histogramów liniowych i logarytmicznych.
- Subsystem sieciowy
- Do jądra dodano moduł ksmbd z realizacją serwera plików, wykorzystującego protokół SMB3. Moduł ten uzupełnia wcześniej dostępną w jądrze realizację klienta SMB i w przeciwieństwie do serwera SMB działającego w przestrzeni użytkownika, jest bardziej wydajny pod względem wydajności, zużycia pamięci i integracji z rozszerzonymi możliwościami jądra. Ksmbd jest przedstawiane jako wydajne i gotowe do użycia rozszerzenie do Samby na urządzenia wbudowane, integrujące się w razie potrzeby z narzędziami i bibliotekami Samby. Wśród możliwości ksmbd wyróżnia się ulepszona obsługa technologii rozproszonego buforowania plików (SMB leases) w lokalnych systemach, co pozwala znacznie zredukować ruch. W przyszłości planowane jest dodanie wsparcia dla RDMA („smbdirect”) oraz rozszerzeń protokołu związanych z wzmocnieniem niezawodności szyfrowania i weryfikacją za pomocą podpisów cyfrowych.
- W kliencie CIFS zakończono wsparcie dla NTLM i mniej bezpiecznych algorytmów uwierzytelniania opartych na algorytmie DES, wykorzystywanych w protokole SMB1.
- W realizacji mostów sieciowych dla vlan wdrożono wsparcie dla multicast.
- W sterowniku bonding, stosowanym do agregacji interfejsów sieciowych, dodano wsparcie dla podsystemu XDP (eXpress Data Path), umożliwiającego manipulowanie pakietami sieciowymi na etapie przed ich przetwarzaniem przez stos sieciowy jądra Linux.
- W bezprzewodowym stosie mac80211 wprowadzono obsługę 6GHZ STA (Special Temporary Authorization) w trybach LPI, SP i VLP, a także możliwość ustawienia oddzielnych TWT (Target Wake Time) w trybie punktu dostępowego.
- Dodano wsparcie dla protokołu MCTP (Management Component Transport Protocol), stosowanego do interakcji pomiędzy kontrolerami zarządzającymi a związanymi z nimi urządzeniami (procesory hosta, urządzenia peryferyjne itp.).
- Kontynuowano integrację w jądrze MPTCP (MultiPath TCP), rozszerzenia protokołu TCP do organizowania pracy połączenia TCP z dostawą pakietów jednocześnie przez kilka tras przez różne interfejsy sieciowe, przypisane do różnych adresów IP. W nowym wydaniu dodano wsparcie dla adresów w trybie fullmesh.
- W netfilter dodano obsługę strumieni sieciowych, enkapsulowanych w protokole SRv6 (Segment Routing IPv6).
- Dodano wsparcie dla sockmap dla strumieniowych soketów Unix.
- Sprzęt
- W sterowniku amdgpu zaimplementowano wsparcie dla APU Cyan Skillfish (wyposażonych w GPU Navi 1x). Dla APU Yellow Carp dodano wsparcie dla kodeków wideo. Poprawiono wsparcie GPU Aldebaran. Dodano nowe identyfikatory kart opartych na GPU Navi 24 „Beige Goby” i RDNA2. Proponowana jest ulepszona implementacja wirtualnych ekranów (VKMS). Zrealizowano wsparcie dla monitorowania temperatury układów AMD Zen 3.
- W sterowniku amdkfd (dla dyskretnych GPU, takich jak Polaris) wdrożono menedżera współdzielonej pamięci wirtualnej (SVM, shared virtual memory) oparty na podsystemie HMM (Zarządzanie pamięcią heterogeniczną), który umożliwia wykorzystanie urządzeń z własnymi blokami zarządzania pamięcią (MMU, jednostka zarządzania pamięcią), mogącymi uzyskać dostęp do głównej pamięci. Dzięki HMM można zorganizować wspólną przestrzeń adresową między GPU a CPU, w której GPU może uzyskać dostęp do głównej pamięci procesu.
- W sterowniku i915 dla kart graficznych Intel rozszerzono zastosowanie menedżera zarządzania pamięcią wideo TTM oraz włączono możliwość zarządzania zużyciem energii na bazie GuC (Graphics micro Controller). Rozpoczęto przygotowania do wprowadzenia wsparcia dla karty graficznej Intel ARC Alchemist oraz GPU Intel Xe-HP.
- W sterowniku nouveau zaimplementowano zarządzanie podświetleniem paneli eDP przy użyciu DPCD (DisplayPort Configuration Data).
- W sterowniku msm dodano wsparcie dla GPU Adreno 7c Gen 3 oraz Adreno 680.
- Dla chipu Apple M1 wdrożono sterownik IOMMU.
- Dodano sterownik dźwięku dla systemów opartych na APU AMD Van Gogh.
- Do gałęzi staging dodano sterownik Realtek R8188EU, który zastąpił stary wariant sterownika (rtl8188eu) dla bezprzewodowych chipów Realtek RTL8188EU 802.11 b/g/n.
- Zaaprobowano sterownik ocp_pt dla rozwijanej przez firmę Meta (Facebook) płytki PCIe z realizacją miniaturowych atomowych zegarów i odbiornika GNSS, które mogą być stosowane do organizacji pracy obszarów serwerów synchronizacji precyzyjnego czasu.
- Dodano wsparcie dla smartfonów Sony Xperia 10II (Snapdragon 665), Xiaomi Redmi 2 (Snapdragon MSM8916), Samsung Galaxy S3 (Snapdragon MSM8226), Samsung Gavini/Codina/Kyle.
- Dodano wsparcie dla ARM SoC oraz płyt NVIDIA Jetson TX2 NX Developer Kit, Sancloud BBE Lite, PicoITX, DRC02, SolidRun SolidSense, SKOV i.MX6, Nitrogen8, Traverse Ten64, GW7902, Microchip SAMA7, ualcomm Snapdragon SDM636/SM8150, Renesas R-Car H3e-2G/M3e-2G, Marvell CN913x, ASpeed AST2600 (serwerowe płyty Facebook Cloudripper, Elbert i Fuji), 4KOpen STiH418-b2264.
- Dodano wsparcie dla paneli LCD Gopher 2b, EDT ETM0350G0DH6/ETMV570G2DHU, LOGIC Technologies LTTD800480070-L6WH-RT, Multi-Innotechnology MI1010AIT-1CP1, Innolux EJ030NA 3.0, ilitek ili9341, E Ink VB3300-KCA, Samsung ATNA33XC20, Samsung DB7430, WideChips WS2401.
- Dodano sterownik LiteETH z obsługą kontrolerów Ethernet, używanych w programowych SoC LiteX (dla FPGA).
- W sterowniku usb-audio dodano opcję lowlatency do zarządzania włączaniem trybu minimalnych opóźnień. Dodano również opcję quirk_flags do przekazywania specyficznych dla urządzenia ustawień.
Jednocześnie latynoamerykańska Fundacja Wolnego Oprogramowania opracowała wariant w pełni wolnego jądra 5.15 — Linux-libre 5.15-gnu, oczyściwszy je z elementów firmware i sterowników zawierających zamknięte komponenty lub fragmenty kodu, których zastosowanie ogranicza producent. W nowej wersji wprowadzono logowanie wiadomości o zakończeniu czyszczenia. Naprawiono problemy z tworzeniem paczek przy użyciu mkspec, poprawiono wsparcie dla paczek snap. Usunięto niektóre ostrzeżenia wyświetlane podczas przetwarzania pliku nagłówkowego firmware.h. Zezwolono na wyświetlanie niektórych rodzajów ostrzeżeń („format-extra-args”, komentarze, nieużywane funkcje i zmienne) podczas kompilacji w trybie „-Werror”. Dodano czyszczenie sterownika gehc-achc. Zaktualizowano kod czyszczenia blobów w sterownikach i podsystemach adreno, btusb, btintel, brcmfmac, aarch64 qcom. Zaprzestano czyszczenia sterowników prism54 (usunięto) i rtl8188eu (zastąpiono r8188eu).
Źródło: opennet.ru
