Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 5.14. Wśród najbardziej zauważalnych zmian znajdują się: nowe wywołania systemowe quotactl_fd() oraz memfd_secret(), usunięcie sterowników ide i raw, nowy kontroler priorytetów wejścia/wyjścia dla cgroup, tryb planowania zadań SCHED_CORE oraz infrastruktura do tworzenia bootloaderów zweryfikowanych programów BPF.
Nowa wersja zawiera 15883 poprawek od 2002 programistów, rozmiar łatki wynosi 69 MB (zmiany dotknęły 12580 plików, dodano 861501 linii kodu, usunięto 321654 linii). Około 47% wszystkich zmian wprowadzonej w 5.14 dotyczy sterowników urządzeń, około 14% zmian związanych jest z aktualizacją kodu specyficznego dla architektur sprzętowych, 13% dotyczy stosu sieciowego, 3% - systemów plików oraz 3% - z wewnętrznych podsystemów jądra.
Główne nowości:
- Podsystem dyskowy, wejście/wyjście i systemy plików
- Dla cgroup zrealizowano nowy kontroler priorytetu wejścia/wyjścia – rq-qos, który może zarządzać priorytetem przetwarzania żądań do urządzeń blokowych, generowanych przez uczestników każdej cgroup. Obsługa nowego kontrolera priorytetu została dodana do planisty wejścia/wyjścia mq-deadline.
- W systemie plików ext4 wprowadzono nową komendę ioctl EXT4_IOC_CHECKPOINT, która wymusza zapisywanie na dysku wszystkich oczekujących transakcji z dziennika oraz powiązanych z nimi buforów, a także nadpisuje obszar zajmowany przez dziennik w pamięci. Zmiana została przygotowana w ramach inicjatywy mającej na celu zapobieganie wyciekom informacji z systemów plików.
- W Btrfs wprowadzono optymalizacje wydajności: poprzez wyeliminowanie zbędnego dziennikowania rozszerzonych atrybutów podczas wykonywania fsync wydajność intensywnych operacji z rozszerzonymi atrybutami wzrosła o 17%. Ponadto podczas wykonywania operacji obcinania, które nie dotyczą ekstentów, wyłączono pełną synchronizację, co skróciło czas realizacji operacji o 12%. W sysfs dodano ustawienie ograniczające przepustowość wejścia/wyjścia podczas sprawdzania FS. Dodano wywołania ioctl do anulowania operacji zmiany rozmiaru i usuwania urządzeń.
- W XFS przeprojektowano implementację buforowego cache, który przeszedł na alokację stron pamięci w trybie pakietowym. Zwiększona została efektywność działania cache.
- W systemie F2FS dodano opcję pracy w trybie tylko do odczytu oraz wprowadzono tryb buforowania skompresowanych bloków (compress_cache) w celu zwiększenia wydajności losowego odczytu. Wprowadzono wsparcie dla kompresji plików, odzwierciedlonych w pamięci za pomocą operacji mmap(). Zaproponowano nową opcję montowania nocompress do selektywnego wyłączania kompresji plików według maski.
- W sterowniku exFAT przeprowadzono prace nad poprawą kompatybilności z pamięciami niektórych cyfrowych aparatów fotograficznych.
- Dodano wywołanie systemowe quotactl_fd(), które umożliwia zarządzanie kwotami nie przez plik specjalnego urządzenia, ale poprzez wskazanie deskryptora pliku związanego z systemem plików, dla którego stosuje się kwotę.
- Z jądra usunięto stare sterowniki dla urządzeń blokowych z interfejsem IDE, zastąpione wieloletnią podsystemem libata.
- Z jądra usunięto sterownik „raw”, zapewniający niebuforowany dostęp do urządzeń blokowych przez interfejs /dev/raw. Wskazana funkcjonalność od dawna jest realizowana w aplikacjach za pomocą flagi O_DIRECT.
- Pamięć i usługi systemowe
- W plannerze zadań wprowadzono nowy tryb planowania SCHED_CORE, który pozwala na zarządzanie tym, które procesy mogą współdziałać na jednym rdzeniu CPU. Każdemu procesowi można przypisać identyfikator cookie, określający obszar zaufania między procesami (np. przynależność do jednego użytkownika lub kontenera). Podczas organizacji wykonywania kodu planner może zapewnić współdzielenie jednego rdzenia CPU tylko dla procesów związanych z jednym właścicielem, co może być wykorzystane do zablokowania niektórych ataków klasy Spectre poprzez zapobieganie współbieżnemu wykonywaniu zaufanych i niezasługujących na zaufanie zadań w jednym wątku SMT (Hyper Threading).
- Dla cgroup wprowadzono wsparcie dla operacji kill, pozwalającej na jednoczesne zakończenie wszystkich procesów związanych z grupą (wysłanie SIGKILL) poprzez zapis „1” w wirtualnym pliku cgroup.kill.
- Rozszerzone możliwości reagowania na wykrywanie blokad rozszczepionych („split lock”), które występują podczas dostępu do niewyrównanych danych w pamięci z powodu tego, że podczas wykonywania atomowej instrukcji dane przecinają dwie linie cache CPU. Takie blokady prowadzą do znacznego spadku wydajności, dlatego wcześniej udostępniano możliwość przymusowego zakończenia aplikacji, która wywoływała blokadę. W nowym wydaniu dodano parametr wiersza poleceń rdzenia „split_lock_detect=ratelimit:N”, który pozwala określić ogólny limit intensywności operacji blokady na sekundę; po jego przekroczeniu każdy proces, który stał się źródłem rozszczepionej blokady, zamiast zakończenia, zostanie przymusowo zatrzymany na 20 ms.
- W kontrolerze grup cgroup o przepustowości CFS (CFS bandwidth controller), określającym, ile czasu procesora można przydzielić każdej grupie cgroup, wprowadzono możliwość określenia limitów ograniczonych zadanym czasem działania, co pozwala lepiej regulować obciążenia wrażliwe na opóźnienia. Na przykład, ustawienie wartości cpu.cfs_quota_us na 50000 i cpu.cfs_period_us na 100000 da grupie procesów możliwość wykorzystywania 50 ms czasu CPU co 100 ms.
- Dodano początkową infrastrukturę do tworzenia loaderów programów BPF, co w przyszłości umożliwi ładowanie tylko programów BPF podpisanych zaufanym kluczem cyfrowym.
- Dodano nową operację futex FUTEX_LOCK_PI2, wykorzystującą monotoniczny zegar do obliczania limitu czasu, który uwzględnia czas spędzony przez system w trybie uśpienia.
- Dla architektury RISC-V wprowadzono wsparcie dla dużych stron pamięci (Transparent Huge-Pages) oraz możliwość zastosowania mechanizmu KFENCE do wykrywania błędów w pracy z pamięcią.
- Do wywołania systemowego madvise() dodano flagi MADV_POPULATE_READ i MADV_POPULATE_WRITE, które generują „page fault” na wszystkich stronach pamięci przeznaczonych do operacji odczytu lub zapisu, bez wykonywania faktycznego odczytu lub zapisu (prefault). Zastosowanie tych flag może być przydatne w celu zmniejszenia opóźnień podczas działania programu, dzięki wcześniejszemu uruchomieniu obsługi „page fault” dla wszystkich nieprzydzielonych stron, nie czekając na faktyczne odwołanie do nich.
- W systemie testów jednostkowych kunit dodano wsparcie dla uruchamiania testów w środowisku QEMU.
- Dodano nowe narzędzia śledzące: „osnoise” do monitorowania opóźnień w aplikacjach spowodowanych przetwarzaniem przerwań, oraz „timerlat” do szczegółowego raportowania opóźnień przy obudzeniu sygnalizowanym przez timer.
- Wirtualizacja i bezpieczeństwo
- Dodano wywołanie systemowe memfd_secret(), które umożliwia utworzenie prywatnego obszaru pamięci w izolowanej przestrzeni adresowej, widocznej tylko dla procesu właściciela, niewidzianym przez inne procesy i bezpośrednio niedostępnej dla jądra.
- W systemie filtrowania wywołań systemowych seccomp dodano możliwość wykorzystania jednej atomowej operacji do utworzenia deskryptora pliku dla izolowanej zadań i jego zwrócenia podczas przetwarzania wywołania systemowego. Zaproponowana operacja rozwiązuje problem przerywania obsługi w przestrzeni użytkownika w przypadku przybycia sygnału.
- Dodano nowy mechanizm do zarządzania ograniczeniami zasobów w przestrzeni nazw identyfikatorów użytkowników, który wiąże poszczególne liczniki rlimit z użytkownikiem w „user namespace”. Zmiana ta rozwiązuje problem dotyczący wspólnego stosowania liczników zasobów przez jednego użytkownika uruchamiającego procesy w różnych kontenerach.
- W hipernadzorze KVM Dla systemów ARM64 dodano możliwość korzystania z rozszerzenia MTE (MemTag, Memory Tagging Extension) w systemach gościnnych, która pozwala przypisać tagi do każdej operacji przydzielania pamięci i zorganizować weryfikację poprawności użycia wskaźników w celu zablokowania wykorzystania luk, spowodowanych odwołaniami do już zwolnionych bloków pamięci, przepełnieniami buforów, dostępem przed inicjalizacją i używaniem poza obecnym kontekstem.
- Dostarczane przez platformę ARM64 narzędzia do uwierzytelniania wskaźników (Pointer Authentication) mogą być teraz konfigurowane osobno dla jądra i przestrzeni użytkownika. Technologia umożliwia wykorzystanie specjalizowanych instrukcji ARM64 do weryfikacji adresów powrotów za pomocą podpisów cyfrowych przechowywanych w nieużywanych górnych bitach samego wskaźnika.
- W User-mode Linux dodano wsparcie dla użycia sterowników urządzeń PCI z wirtualną szyną PCI, realizowaną przez sterownik PCI-over-virtio.
- Dla systemów x86 dodano wsparcie dla parawirtualizowanego urządzenia virtio-iommu, które pozwala na wysyłanie zapytań IOMMU, takich jak ATTACH, DETACH, MAP i UNMAP, przez transport virtio bez emulacji tabel stron pamięci.
- Dla procesorów Intel, od rodziny Skylake do Coffee Lake, domyślnie wyłączono użycie rozszerzeń Intel TSX (Transactional Synchronization Extensions), które oferują narzędzia do zwiększenia wydajności aplikacji wielowątkowych poprzez dynamiczne wykluczanie zbędnych operacji synchronizacji. Rozszerzenia zostały wyłączone z powodu możliwości przeprowadzania ataków Zombieload, manipulujących wyciekiem informacji przez boczne kanały, które występuje podczas działania mechanizmu asynchronicznego przerywania operacji (TAA, TSX Asynchronous Abort).
- Subsystem sieciowy
- Kontynuowana jest integracja z jądrem MPTCP (MultiPath TCP), rozszerzenia protokołu TCP do organizacji pracy połączenia TCP z dostarczaniem pakietów jednocześnie przez kilka tras przez różne interfejsy sieciowe. adresów IP. W nowym wydaniu dodano mechanizm do definiowania własnych polityk haszowania ruchu dla IPv4 i IPv6 (multipath hash policy), który daje możliwość z przestrzeni użytkownika określania, które z pól w pakietach, w tym enkapsulowanych, będą używane do obliczania hasha, określającego wybór ścieżki dla pakietu.
- Do wirtualnego transportu virtio dodano wsparcie dla gniazd SOCK_SEQPACKET (uporządkowane i niezawodne przesyłanie datagramów).
- Rozszerzono możliwości mechanizmu gniazd SO_REUSEPORT, który pozwala wielu nasłuchującym gniazdom jednocześnie łączyć się z jednym portem, aby odbierać połączenia z rozdziałem przychodzących żądań między wszystkimi podłączonymi gniazdami przez SO_REUSEPORT, co upraszcza tworzenie wielowątkowych aplikacji serwerowych. W nowej wersji dodano narzędzia do przekazywania kontroli innemu gniazdu w przypadku awarii podczas obsługi żądania przez pierwotnie wybrane gniazdo (rozwiązuje problem utraty pojedynczych połączeń przy ponownym uruchomieniu usług).
- Sprzęt
- W sterowniku amdgpu dodano wsparcie dla nowych serii GPU AMD Radeon RX 6000, rozwijanych pod kodowymi nazwami „Beige Goby” (Navi 24) i „Yellow Carp”, a także poprawiono wsparcie dla GPU Aldebaran (gfx90a) oraz APU Van Gogh. Dodano możliwość jednoczesnej pracy z wieloma panelami eDP. Dla APU Renoir wprowadzono wsparcie dla pracy z szyfrowanymi buforami w pamięci wideo (TMZ, Trusted Memory Zone). Dodano wsparcie dla gorącego wyjmowania kart graficznych (hot-unplug). Dla GPU Radeon RX 6000 (Navi 2x) oraz starszych GPU AMD domyślnie włączono wsparcie dla mechanizmu oszczędzania energii ASPM (Active State Power Management), który wcześniej był aktywowany tylko dla GPU Navi 1x, Vega i Polaris.
- Dla układów AMD dodano wsparcie dla współdzielonej pamięci wirtualnej (SVM, shared virtual memory) opartej na systemie HMM (Heterogeneous memory management), co pozwala na korzystanie z urządzeń z własnymi jednostkami zarządzania pamięcią (MMU, memory management unit), które mogą uzyskiwać dostęp do pamięci głównej. Przy pomocy HMM można zorganizować wspólną przestrzeń adresową między GPU a CPU, w której GPU może uzyskać dostęp do pamięci głównej procesu.
- Dodano początkowe wsparcie dla technologii AMD Smart Shift, dynamicznie zmieniającej parametry zużycia energii CPU i GPU w laptopach z chipsetem oraz kartą graficzną AMD, co zwiększa wydajność podczas grania, edytowania wideo oraz renderowania 3D.
- W sterowniku i915 dla kart graficznych Intel włączono wsparcie dla układów Intel Alder Lake P.
- Dodano sterownik drm/hyperv dla wirtualnego adaptera graficznego Hyper-V.
- Dodano wsparcie dla komputera jednopłytowego Raspberry Pi 400.
- Dodano sterownik dell-wmi-privacy dla wsparcia sprzętowych wyłączników kamery i mikrofonu dostarczanych w laptopach Dell.
- Dla laptopów Lenovo dodano interfejs WMI do zmiany ustawień BIOS przez sysfs /sys/class/firmware-attributes/.
- Rozszerzono wsparcie dla urządzeń z interfejsem USB4.
- Dodano wsparcie dla kart dźwiękowych i kodeków AmLogic SM1 TOACODEC, Intel AlderLake-M, NXP i.MX8, NXP TFA1, TDF9897, Rockchip RK817, Qualcomm Quinary MI2 oraz Texas Instruments TAS2505. Ulepszono wsparcie dźwięku w laptopach HP i ASUS. Dodano łatki zmniejszające opóźnienia przed rozpoczęciem odtwarzania dźwięku na urządzeniach z interfejsem USB.
Źródło: opennet.ru
