Wydanie jądra Linuksa 5.14

Po dwóch miesiącach prac Linus Torvalds przedstawił wydanie jądra Linuksa 5.14. Do najważniejszych zmian należą: nowe wywołania systemowe quotactl_fd() i memfd_secret(), usunięcie sterowników ide i raw, nowy kontroler priorytetów I/O dla cgroup, tryb planowania zadań SCHED_CORE, infrastruktura do tworzenia zweryfikowanych ładowarek programów BPF.

Nowa wersja zawiera 15883 2002 poprawek od 69 programistów, rozmiar łatki to 12580 MB (zmiany dotyczyły 861501 321654 plików, dodano 47 5.14 linii kodu, usunięto 14 13 linii). Około 3% wszystkich zmian wprowadzonych w wersji 3 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:

  • Podsystem dyskowy, wejścia/wyjścia i systemy plików
    • Dla cgroups zaimplementowano nowy kontroler priorytetyzacji we/wy, rq-qos, który może kontrolować priorytet przetwarzania żądań blokowania urządzeń generowanych przez członków każdej grupy cgroup. Do harmonogramu we/wy mq-deadline dodano obsługę nowego kontrolera priorytetów.
    • System plików ext4 implementuje nową komendę ioctl, EXT4_IOC_CHECKPOINT, która wymusza wypisanie na dysk wszystkich oczekujących transakcji z dziennika i powiązanych z nimi buforów, a także zastępuje obszar pamięci używany przez dziennik. Zmiana została przygotowana w ramach inicjatywy mającej na celu zapobieganie wyciekom informacji z systemów plików.
    • Dokonano optymalizacji wydajności w Btrfs: eliminując niepotrzebne rejestrowanie rozszerzonych atrybutów podczas wykonywania fsync, wydajność intensywnych operacji z rozszerzonymi atrybutami wzrosła aż o 17%. Dodatkowo podczas wykonywania operacji przycinania, które nie mają wpływu na zakresy, wyłączana jest pełna synchronizacja, co skraca czas operacji o 12%. Do sysfs dodano ustawienie ograniczające przepustowość wejścia/wyjścia podczas sprawdzania systemu plików. Dodano wywołania ioctl umożliwiające anulowanie operacji zmiany rozmiaru i usuwania urządzenia.
    • W XFS przeprojektowano implementację bufora pamięci podręcznej, która została przestawiona na alokację stron pamięci w trybie wsadowym. Poprawiona wydajność pamięci podręcznej.
    • F2FS dodaje opcję działania w trybie tylko do odczytu i implementuje tryb skompresowanej pamięci podręcznej bloków (compress_cache), aby poprawić wydajność losowego odczytu. Zaimplementowano obsługę kompresji plików mapowanych do pamięci przy użyciu operacji mmap(). Aby selektywnie wyłączyć kompresję plików w oparciu o maskę, zaproponowano nową opcję montowania nocompress.
    • W sterowniku exFAT włożono prace mające na celu poprawę kompatybilności z niektórymi pamięciami masowymi aparatów cyfrowych.
    • Dodano wywołanie systemowe quotactl_fd(), które umożliwia zarządzanie limitami nie poprzez specjalny plik urządzenia, ale poprzez określenie deskryptora pliku powiązanego z systemem plików, dla którego limit jest stosowany.
    • Z jądra usunięto stare sterowniki urządzeń blokowych z interfejsem IDE, które już dawno zastąpiono podsystemem libata.
    • Z jądra usunięto „surowy” sterownik, zapewniający niebuforowany dostęp do urządzeń blokowych poprzez interfejs /dev/raw. Funkcjonalność ta jest od dawna implementowana w aplikacjach korzystających z flagi O_DIRECT.
  • Usługi pamięci i systemu
    • Harmonogram zadań implementuje nowy tryb planowania, SCHED_CORE, który pozwala kontrolować, które procesy mogą być wykonywane razem na tym samym rdzeniu procesora. Każdemu procesowi można przypisać identyfikator pliku cookie, który określa zakres zaufania pomiędzy procesami (np. przynależność do tego samego użytkownika lub kontenera). Organizując wykonanie kodu, program planujący może zapewnić, że jeden rdzeń procesora będzie współdzielony tylko między procesami powiązanymi z tym samym właścicielem, co może zostać wykorzystane do zablokowania niektórych ataków Spectre, uniemożliwiając uruchamianie zaufanych i niezaufanych zadań w tym samym wątku SMT (Hyper Threading). .
    • Dla cgroup zaimplementowano obsługę operacji kill, która pozwala na jednoczesne zabicie wszystkich procesów powiązanych z grupą (wysłanie SIGKILL) poprzez wpisanie „1” do wirtualnego pliku cgroup.kill.
    • Rozszerzone możliwości związane z reagowaniem na wykrycie blokad rozdzielonych („split lock”) występujących podczas dostępu do niewyrównanych danych w pamięci ze względu na fakt, że podczas wykonywania instrukcji atomowej dane przekraczają dwie linie pamięci podręcznej procesora. Takie blokowanie prowadzi do znacznego spadku wydajności, dlatego wcześniej możliwe było wymuszenie zakończenia aplikacji, która spowodowała blokowanie. W nowej wersji dodano parametr wiersza poleceń jądra „split_lock_detect=ratelimit:N”, który umożliwia zdefiniowanie ogólnosystemowego limitu szybkości operacji blokowania na sekundę, po przekroczeniu którego dowolny proces, który stał się źródłem podzielonej blokady zostanie zmuszony do zatrzymania się na 20 ms zamiast zakończenia.
    • Kontroler przepustowości cgroup CFS (kontroler przepustowości CFS), który określa, ile czasu procesora można przydzielić każdej grupie cgroup, implementuje możliwość definiowania limitów ograniczonych czasowo, co pozwala na lepszą regulację obciążeń wrażliwych na opóźnienia. Na przykład ustawienie cpu.cfs_quota_us na 50000 i cpu.cfs_period_us na 100000 pozwoli grupie procesów marnować 100 ms czasu procesora co 50 ms.
    • Dodano początkową infrastrukturę do tworzenia programów ładujących BPF, która dodatkowo umożliwi ładowanie tylko programów BPF podpisanych zaufanym kluczem cyfrowym.
    • Dodano nową operację futex FUTEX_LOCK_PI2, która wykorzystuje monotoniczny timer do obliczenia limitu czasu uwzględniającego czas spędzony przez system w trybie uśpienia.
    • Dla architektury RISC-V zaimplementowano obsługę dużych stron pamięci (Transparent Huge-Pages) oraz możliwość wykorzystania mechanizmu KFENCE do wykrywania błędów podczas pracy z pamięcią.
    • Wywołanie systemowe madvise(), które umożliwia optymalizację zarządzania pamięcią procesu, dodało flagi MADV_POPULATE_READ i MADV_POPULATE_WRITE w celu wygenerowania „błądu strony” na wszystkich stronach pamięci odwzorowanych na operacje odczytu lub zapisu bez wykonywania rzeczywistego odczytu lub zapisu (prefault ). Użycie flag może być przydatne w celu zmniejszenia opóźnień w wykonywaniu programu, ze względu na proaktywne wykonanie procedury obsługi „page error” dla wszystkich nieprzydzielonych stron jednocześnie, bez czekania na faktyczny dostęp do nich.
    • W systemie testów jednostkowych kunit dodano obsługę uruchamiania testów w środowisku QEMU.
    • Dodano nowe znaczniki: „osnoise” do śledzenia opóźnień aplikacji spowodowanych obsługą przerwań oraz „timerlat” do wyświetlania szczegółowych informacji o opóźnieniach podczas wybudzania z sygnału timera.
  • Wirtualizacja i bezpieczeństwo
    • Dodano wywołanie systemowe memfd_secret() w celu utworzenia prywatnego obszaru pamięci w izolowanej przestrzeni adresowej, widocznego tylko dla procesu będącego właścicielem, nie odzwierciedlanego dla innych procesów i niedostępnego bezpośrednio dla jądra.
    • W systemie filtrowania wywołań systemowych seccomp, podczas przenoszenia procedur obsługi blokowania do przestrzeni użytkownika, możliwe jest użycie pojedynczej operacji atomowej w celu utworzenia deskryptora pliku dla izolowanego zadania i zwrócenia go podczas przetwarzania wywołania systemowego. Proponowana operacja rozwiązuje problem przerywania procedury obsługi w przestrzeni użytkownika po nadejściu sygnału.
    • Dodano nowy mechanizm zarządzania limitami zasobów w przestrzeni nazw użytkownika, który wiąże indywidualne liczniki rlimitów z użytkownikiem w „przestrzeni nazw użytkownika”. Zmiana rozwiązuje problem stosowania wspólnych liczników zasobów, gdy jeden użytkownik uruchamia procesy w różnych kontenerach.
    • Hiperwizor KVM dla systemów ARM64 dodał możliwość wykorzystania rozszerzenia MTE (MemTag, Memory Tagging Extension) w systemach gościnnych, co pozwala na powiązanie tagów z każdą operacją alokacji pamięci oraz zorganizowanie sprawdzania poprawności użycia wskaźników w celu zablokowania wykorzystania podatności spowodowane dostępem do już zwolnionych bloków pamięci, przepełnieniem bufora, dostępami przed inicjalizacją i użyciem poza bieżącym kontekstem.
    • Funkcje uwierzytelniania wskaźników platformy ARM64 można teraz konfigurować oddzielnie dla jądra i przestrzeni użytkownika. Technologia pozwala na wykorzystanie specjalistycznych instrukcji ARM64 do weryfikacji adresów zwrotnych za pomocą podpisów cyfrowych, które są przechowywane w nieużywanych górnych bitach samego wskaźnika.
    • Linux w trybie użytkownika dodał obsługę używania sterowników dla urządzeń PCI z wirtualną magistralą PCI, zaimplementowaną przez sterownik PCI-over-virtio.
    • W przypadku systemów x86 dodano obsługę parawirtualnego urządzenia virtio-iommu, umożliwiając wysyłanie żądań IOMMU, takich jak ATTACH, DETACH, MAP i UNMAP, za pośrednictwem transportu virtio bez emulowania tabel stron pamięci.
    • W przypadku procesorów Intel, od rodziny Skylake po Coffee Lake, korzystanie z technologii Intel TSX (Transactional Synchronization Extensions), które udostępniają narzędzia poprawiające wydajność aplikacji wielowątkowych poprzez dynamiczną eliminację niepotrzebnych operacji synchronizacji, jest domyślnie wyłączone. Rozszerzenia są wyłączone ze względu na możliwość ataków Zombieload manipulujących wyciekiem informacji za pośrednictwem kanałów stron trzecich, który ma miejsce podczas działania mechanizmu TAA (TSX Asynchronous Abort).
  • Podsystem sieciowy
    • Integracja z rdzeniem MPTCP (MultiPath TCP), rozszerzenie protokołu TCP do organizowania działania połączenia TCP z dostarczaniem pakietów jednocześnie kilkoma trasami przez różne interfejsy sieciowe powiązane z różnymi adresami IP. Nowa wersja dodaje mechanizm ustawiania własnych zasad mieszania ruchu dla IPv4 i IPv6 (polityka mieszania wielościeżkowego), umożliwiając określenie z przestrzeni użytkownika, które pola w pakietach, w tym także hermetyzowanych, zostaną użyte podczas obliczania skrótu określającego wybór ścieżki dla pakietu.
    • Do wirtualnego transportu virtio dodano obsługę gniazd SOCK_SEQPACKET (uporządkowana i niezawodna transmisja datagramów).
    • Rozszerzono możliwości mechanizmu gniazd SO_REUSEPORT, który pozwala na jednoczesne podłączenie kilku gniazd nasłuchowych do jednego portu w celu odbierania połączeń z dystrybucją żądań przychodzących jednocześnie na wszystkie gniazda połączone poprzez SO_REUSEPORT, co ułatwia tworzenie wielowątkowych aplikacji serwerowych . W nowej wersji dodano narzędzia pozwalające na przeniesienie kontroli do innego gniazda w przypadku niepowodzenia przetwarzania żądania przez pierwotnie wybrane gniazdo (rozwiązuje problem utraty poszczególnych połączeń przy ponownym uruchomieniu usług).
  • Sprzęt
    • Sterownik amdgpu zapewnia obsługę nowej serii procesorów graficznych AMD Radeon RX 6000 o nazwach kodowych „Beige Goby” (Navi 24) i „Yellow Carp”, a także ulepszoną obsługę procesora graficznego Aldebaran (gfx90a) i Van Gogh APU. Dodano możliwość jednoczesnej pracy z kilkoma panelami eDP. Dla APU Renoir zaimplementowano obsługę pracy z zaszyfrowanymi buforami w pamięci wideo (TMZ, Trusted Memory Zone). Dodano obsługę kart graficznych z możliwością odłączania podczas pracy. W przypadku procesorów graficznych Radeon RX 6000 (Navi 2x) i starszych procesorów graficznych AMD obsługa ASPM (Active State Power Management) jest domyślnie włączona, która wcześniej była włączona tylko dla procesorów graficznych Navi 1x, Vega i Polaris.
    • Dla układów AMD dodano obsługę współdzielonej pamięci wirtualnej (SVM, wspólna pamięć wirtualna) w oparciu o podsystem HMM (Heterogeneous Memory Management), który umożliwia korzystanie z urządzeń posiadających własne jednostki zarządzania pamięcią (MMU, memory Management Unit), który może uzyskać dostęp do pamięci głównej. W szczególności za pomocą HMM można zorganizować wspólną przestrzeń adresową pomiędzy procesorem graficznym i procesorem, w której procesor graficzny może uzyskać dostęp do pamięci głównej procesu.
    • Dodano wstępną obsługę technologii AMD Smart Shift, która dynamicznie zmienia ustawienia zasilania procesora i karty graficznej w laptopach z chipsetem AMD i kartą graficzną, aby zwiększyć wydajność w grach, edycji wideo i renderowaniu 3D.
    • Sterownik i915 dla kart graficznych Intel obsługuje chipy Intel Alderlake P.
    • Dodano sterownik drm/hyperv dla wirtualnej karty graficznej Hyper-V.
    • Dodano obsługę komputera typu all-in-one Raspberry Pi 400.
    • Dodano sterownik dell-wmi-privacy do obsługi sprzętowych przełączników kamery i mikrofonu znajdujących się w laptopach Dell.
    • W przypadku laptopów Lenovo dodano interfejs WMI umożliwiający zmianę ustawień BIOS-u za pomocą sysfs /sys/class/firmware-attributes/.
    • Rozszerzona obsługa urządzeń z interfejsem USB4.
    • Dodano obsługę kart dźwiękowych i kodeków AmLogic SM1 TOACODEC, Intel AlderLake-M, NXP i.MX8, NXP TFA1, TDF9897, Rockchip RK817, Qualcomm Quinary MI2 i Texas Instruments TAS2505. Ulepszona obsługa dźwięku w laptopach HP i ASUS. Dodano poprawki redukujące opóźnienia przed rozpoczęciem odtwarzania dźwięku na urządzeniach USB.

Źródło: opennet.ru

Dodaj komentarz