Po dwóch miesiącach prac Linus Torvalds przedstawił wydanie jądra Linux 5.14. Wśród najbardziej zauważalnych zmian: nowe wywołania systemowe quotactl_fd() i memfd_secret(), usunięcie sterowników ide i raw, nowy kontroler priorytetów wejścia/wyjścia dla cgroup, tryb planowania zadań SCHED_CORE, infrastruktura do tworzenia bootloaderów weryfikowanych programów BPF.
Do nowej wersji wprowadzono 15883 poprawek od 2002 deweloperów, rozmiar łaty wynosi 69 MB (zmiany dotyczą 12580 plików, dodano 861501 linijek kodu, usunięto 321654 linijek). Około 47% wszystkich zmian w 5.14 związanych jest ze sterownikami urządzeń, około 14% zmian dotyczy aktualizacji kodu specyficznego dla architektur sprzętowych, 13% związane jest z stosami sieciowymi, 3% z systemami plików i 3% z wewnętrznymi podsystemami jądra.
- 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. Wsparcie dla nowego kontrolera priorytetu dodano do planisty wejścia/wyjścia mq-deadline;
- w systemie plików ext4 zrealizowano nowa komenda ioctl EXT4_IOC_CHECKPOINT, która wymusza zrzucenie na dysk wszystkich oczekujących transakcji z dziennika i związanych z nimi buforów oraz ponowne zapisanie używanej w dzienniku przestrzeni w magazynie. Zmiana została przygotowana w ramach inicjatywy mającej na celu zapobieganie wyciekom informacji z systemów plików;
- w Btrfs zostały wprowadzone optymalizacje wydajności: dzięki wykluczeniu zbędnego dziennikowania rozszerzonych atrybutów w trakcie wykonywania fsync wydajność intensywnych operacji na rozszerzonych atrybutach wzrosła nawet o 17%. Ponadto, podczas wykonywania operacji skracania, które nie dotyczą extentów, wyłączono pełną synchronizację, co skróciło czas wykonania operacji o 12%. W sysfs dodano ustawienie do ograniczenia przepustowości wejścia/wyjścia podczas sprawdzania FS. Dodane zostały wywołania ioctl do anulowania operacji zmiany rozmiaru i usunięcia urządzenia;
- w XFS przerobiono implementację buforowanej pamięci podręcznej, która została przekształcona w przydzielanie stron pamięci w trybie wsadowym. Zwiększona efektywność pracy pamięci podręcznej;
- W F2FS dodano opcję pracy w trybie tylko do odczytu oraz wdrożono tryb buforowania skompresowanych bloków (compress_cache) w celu zwiększenia wydajności losowego odczytu. Zrealizowano wsparcie dla kompresji plików, które są odzwierciedlane w pamięci za pomocą operacji mmap(). Dla selektywnego wyłączania kompresji plików według maski zaproponowano nową opcję montowania nocompress;
- W sterowniku exFAT przeprowadzono prace nad poprawą zgodnoś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 przez wskazanie deskryptora pliku, który jest powiązany z systemem plików, na który dotyczy kwota;
- Z jądra usunięto stare sterowniki dla urządzeń blokowych z interfejsem IDE, które zostały zastąpione przez podsystem libata. Wsparcie dla starych urządzeń pozostaje w pełni zachowane, zmiany dotyczą jedynie możliwości użycia starych sterowników, w przypadku których napędy nazywano /dev/hd*, a nie /dev/sd*;
- Z jądra usunięto sterownik „raw”, który zapewnia niebuforowany dostęp do urządzeń blokowych przez interfejs /dev/raw. Wskazana funkcjonalność jest od dawna realizowana w aplikacjach za pomocą flagi O_DIRECT;
- Pamięć i usługi systemowe:
- W harmonogramie zadań wprowadzono nowy tryb planowania SCHED_CORE, który pozwala zarządzać tym, które procesy mogą być wspólnie wykonywane na jednym rdzeniu CPU. Każdemu procesowi można przypisać identyfikator cookie, który określa obszar zaufania między procesami (na przykład przynależność do jednego użytkownika lub kontenera). Przy organizacji wykonania kodu harmonogram 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ólnemu wykonywaniu w jednym wątku SMT (Hyper Threading) zasługujących i niezasługujących na zaufanie zadań;
- Dla mechanizmu cgroup wdrożono wsparcie dla operacji kill, która umożliwia jednoczesne zakończenie wszystkich procesów powiązanych z grupą (wysłanie SIGKILL) poprzez zapis „1” do wirtualnego pliku cgroup.kill;
- Rozszerzone możliwości związane z reagowaniem na wykrycie rozszczepionych blokad („split lock”), które występują podczas dostępu do niezrównoważonych danych w pamięci z powodu na to, że w trakcie wykonywania atomowej instrukcji dane przecinają dwie linie pamięci podręcznej CPU. Takie blokady prowadzą do znacznego spadku wydajności, dlatego wcześniej była możliwość wymuszonego zakończenia aplikacji, która spowodowała blokadę. W nowym wydaniu dodano parametr wiersza poleceń jądra „split_lock_detect=ratelimit:N”, który umożliwia określenie ogólnosystemowego limitu intensywności operacji blokad na sekundę, po przekroczeniu którego każdy proces będący źródłem rozszczepionej blokady, zamiast zakończenia będzie wymuszony na zatrzymanie na 20 ms;
- W kontrolerze przepustowości cgroup CFS (CFS bandwidth controller), który określa, ile czasu CPU można przydzielić każdej cgroup, wprowadzono możliwość ustalania limitów, ograniczonych określonym 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 umożliwi grupie procesów wydawanie co 100 ms 50 ms czasu CPU;
- dodano Infrastruktura początkowa do tworzenia loaderów programów BPF, która 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 timer 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 związanych z pamięcią;
- w wywołaniu systemowym madvise(), które zapewnia środki optymalizacji zarządzania pamięcią procesu, dodano flagi MADV_POPULATE_READ i MADV_POPULATE_WRITE, aby generować „page fault” w wszystkich stronach pamięci, odzwierciedlonych dla operacji odczytu lub zapisu, bez wykonywania faktycznego odczytu lub zapisu (prefault). Zastosowanie flag może być korzystne w celu zmniejszenia opóźnień w trakcie działania programu, dzięki wstępnemu wykonaniu obsługiwacza „page fault” na raz dla wszystkich nieprzydzielonych stron, nie czekając na faktyczny dostęp do nich;
- w systemie unit testowania kunit dodano wsparcie uruchamiania testów w środowisku QEMU;
- dodane nowe przyrządy: „osnoise” do śledzenia opóźnień w aplikacjach spowodowanych obsługą przerwań oraz „timerlat” do szczegółowego raportowania opóźnień przy budzeniu na sygnał timera;
- wirtualizacja i bezpieczeństwo:
- dodano wywołanie systemowe memfd_secret(), pozwalający na utworzenie prywatnej przestrzeni pamięci w izolowanej przestrzeni adresowej, widocznej tylko dla procesu właściciela, niewidocznej dla innych procesów i bezpośrednio niedostępnej dla jądra;
- w systemie filtrowania wywołań systemowych seccomp przy przenoszeniu obsługujących blokadę do przestrzeni użytkownika umożliwiono użycie jednej atomowej operacji do utworzenia deskryptora plików dla izolowanego zadania i jego zwrócenia podczas przetwarzania wywołania systemowego. Proponowana operacja rozwiązuje problem z przerwaniem obsługi w przestrzeni użytkownika po nadejściu sygnału;
- dodano nowy mechanizm do zarządzania ograniczeniem zasobów w przestrzeni nazw identyfikatorów użytkowników, który wiąże oddzielne liczniki rlimit z użytkownikiem w „user namespace”. Zmiana rozwiązuje problem z zastosowaniem wspólnych liczników zasobów podczas uruchamiania przez jednego użytkownika procesów w różnych kontenerach;
- w hipernadzorze KVM dla systemów ARM64 dodano możliwość używania w gościnnych systemach rozszerzenia MTE (MemTag, Memory Tagging Extension), które pozwala na przypisanie tagów do każdej operacji alokacji pamięci i organizację weryfikacji poprawności użycia wskaźników w celu blokowania eksploatacji luk, spowodowanych dostępem do już zwolnionych bloków pamięci, przepełnieniami bufora, dostępami przed inicjalizacją i używaniem poza aktualnym kontekstem;
- dostarczane przez platformę ARM64 środki do autoryzacji wskaźników (Pointer Authentication) mogą być teraz oddzielnie konfigurowane dla jądra i przestrzeni użytkownika. Technologia pozwala wykorzystać wyspecjalizowane instrukcje ARM64 do weryfikacji adresów powrotu za pomocą podpisów cyfrowych, które są przechowywane w nieużywanych najwyższych bitach samego wskaźnika;
- w User-mode Linux dodano wsparcie dla używania sterowników do urządzeń PCI z wirtualną magistralą PCI, realizowaną przez sterownik PCI-over-virtio;
- Dodano wsparcie dla parawirtualizowanego urządzenia virtio-iommu w systemach x86, które umożliwia wysyłanie żądań 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łączone jest użycie rozszerzeń Intel TSX (Transactional Synchronization Extensions), które zapewniają środki 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 poprzez boczne kanały, który pojawia się podczas pracy mechanizmu asynchronicznego przerywania operacji (TAA, TSX Asynchronous Abort);
- Podsystem sieciowy:
- Kontynuowana jest integracja z jądrem MPTCP (MultiPath TCP), rozszerzenia protokołu TCP, które umożliwia tworzenie połączenia TCP z dostawą pakietów równocześnie przez wiele tras za pośrednictwem różnych interfejsów sieciowych przypisanych do różnych adresów IP. W nowej wersji dodano Wprowadzono mechanizm do definiowania własnych polityk haszowania ruchu dla IPv4 i IPv6 (multipath hash policy), który umożliwia z przestrzeni użytkownika określenie, które z pól w pakietach, w tym enkapsulowanych, będą używane przy obliczaniu hasza, który określa wybór trasy dla pakietu;
- Dodano wsparcie dla gniazd w wirtualnym transporcie virtio SOCK_SEQPACKET (uporządkowane i niezawodne przesyłanie datagramów);
- Rozszerzono możliwości mechanizmu gniazd SO_REUSEPORT, który pozwala kilku nasłuchującym gniazdom jednocześnie połączyć się z jednym portem w celu przyjmowania połączeń z równomiernym rozdzieleniem nadchodzących żądań we wszystkich podłączonych gniazdach przez SO_REUSEPORT, co ułatwia tworzenie aplikacji serwerowych wielowątkowych. W nowej wersji dodano Wprowadzone środki do przekazywania kontroli innemu gniazdu w przypadku awarii przy przetwarzaniu żądania przez pierwotnie wybrane gniazdo (rozwiązuje problem utraty pojedynczych połączeń podczas ponownego uruchamiania usług);
- Sprzęt:
- w sterowniku amdgpu zrealizowano wsparcie nowych serii GPU AMD Radeon RX 6000, rozwijanych pod kodowymi nazwiskami „Beige Goby” (Navi 24) i „Yellow Carp”, a także poprawione wsparcie dla GPU Aldebaran (gfx90a) i APU Van Gogh. Dodano możliwość jednoczesnej pracy z wieloma panelami eDP. Dla APU Renoir wprowadzono wsparcie dla pracy z zaszyfrowanymi buforami w pamięci wideo (TMZ, Trusted Memory Zone). Dodano wsparcie dla hot-unplug kart graficznych. Dla GPU Radeon RX 6000 (Navi 2x) i starszych GPU AMD wsparcie mechanizmu zarządzania energią ASPM (Active State Power Management) jest domyślnie włączone, co wcześniej aktywowane było tylko dla GPU Navi 1x, Vega i Polaris;
- dla chipów AMD dodano wsparcie dla współdzielonej pamięci wirtualnej (SVM, shared virtual memory) opartej na subsystemie HMM (Heterogeneous memory management), umożliwiające korzystanie z urządzeń z własnymi blokami zarządzania pamięcią (MMU, memory management unit), które mogą uzyskiwać dostęp do pamięci głównej. 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 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 i kartą graficzną AMD w celu zwiększenia wydajności w grach, edycji wideo i renderowaniu 3D;
- w sterowniku i915 dla kart graficznych Intel wliczona wsparcie dla chipów Intel Alderlake P;
- dodano sterownik drm/hyperv dla wirtualnego adaptera graficznego Hyper-V;
- dodano sterownik graficzny simpledrm, wykorzystujący do wyjścia framebuffer EFI-GOP lub VESA, dostarczany przez firmware UEFI lub BIOS. Głównym celem sterownika jest zapewnienie możliwości wyjścia graficznego na wczesnych etapach rozruchu, zanim możliwe będzie użycie pełnoprawnego sterownika DRM. Sterownik może być także używany jako tymczasowe rozwiązanie dla sprzętu, dla którego na razie nie ma natywnych sterowników DRM;
- dodano wsparcie dla komputera typu All-in-One Raspberry Pi 400;
- dodano sterownik dell-wmi-privacy do wsparcia sprzętowych przełączników kamery i mikrofonu w laptopach Dell;
- dla laptopów Lenovo dodano interfejs WMI do zmiany ustawień BIOS przez sysfs /sys/class/firmware-attributes/;
- rozszerzone wsparcie dla urządzeń z interfejsem USB4;
- dodano wsparcie 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. Poprawiona obsługa dźwięku na laptopach HP i ASUS. Dodano łaty obniżające opóźnienia przed rozpoczęciem odtwarzania dźwięku na urządzeniach z interfejsem USB.
Źródło – opennet.ru.
Źródło: linux.org.ru
