Jądro Linux 5.14

Jądro Linux 5.14

Po dwóch miesiącach prac nad Linusem Torvaldsem wprowadzono wydanie jądra Linux 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łównym innowacje:

  • podsystem dyskowy, systemy wejścia/wyjścia i systemy plików:
    • dla cgroup wdrożone nowy kontroler priorytetów I/O - 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;
    • w systemie plików ext4 wdrożone nowe polecenie ioctl EXT4_IOC_CHECKPOINT, które wymusza zapisanie na dysku wszystkich oczekujących transakcji z dziennika i powiązanych buforów, a także nadpisuje obszar używany przez pamięć logowania. Zmiana została przygotowana w ramach inicjatywy mającej na celu zapobieganie wyciekom informacji z systemów plików;
    • w Btrfs zrobiony Optymalizacje wydajności: Eliminując niepotrzebne rejestrowanie rozszerzonych atrybutów podczas wykonywania fsync, wydajność intensywnych operacji z rozszerzonymi atrybutami wzrosła nawet 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 przerobione wdrożenie bufora pamięci podręcznej, który jest przekazywany do alokacji stron pamięci w trybie wsadowym. Poprawiona wydajność pamięci podręcznej;
    • F2FS dodał opcję pracy w trybie tylko do odczytu i zaimplementował tryb buforowania skompresowanych 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 przez maskę, zaproponowano nową opcję montowania nocompress;
    • wprowadzono prace w sterowniku exFAT, aby poprawić kompatybilność z pamięcią masową niektórych aparatów cyfrowych;
    • dodane wywołanie systemowe quotactl_fd(), który pozwala zarządzać 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. Zachowano w całości obsługę starszych urządzeń, zmiany dotyczą jedynie możliwości korzystania ze starych sterowników, przy użyciu których dyski nazywały się /dev/hd*, a nie /dev/sd*;
    • 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:
    • w harmonogramie zadań zaimplementowano nowy tryb planowania SCHED_CORE, co pozwala kontrolować, które procesy mogą działać 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 wykonywanie zaufanych i niezaufanych zadań w tym samym wątku SMT (Hyper Threading). ;
    • dla mechanizmu 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 być zmuszonym 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, ma możliwość definiowania limitów ograniczonych danym czasem działania, 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;
    • dodany początkowa infrastruktura do tworzenia programów ładujących BPF, która dodatkowo umożliwi pobieranie wyłącznie programów BPF podpisanych wiarygodnym kluczem cyfrowym;
    • dodano nową operację futex FUTEX_LOCK_PI2, która wykorzystuje monotoniczny timer do obliczenia limitu czasu, który uwzględnia czas spędzony przez system w trybie uśpienia;
    • dla architektury RISC-V, obsługa stron o dużej pamięci (Transparent Huge-Pages) oraz możliwość wykorzystania KFENCE identyfikować błędy podczas pracy z pamięcią;
    • do wywołania systemowego madvise(), które umożliwia optymalizację zarządzania pamięcią procesu, dodany Flagi MADV_POPULATE_READ i MADV_POPULATE_WRITE generujące „błąd strony” na wszystkich stronach pamięci mapowanych dla operacji 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, dzięki proaktywnemu wykonaniu procedury obsługi „page error” dla wszystkich nieprzydzielonych stron jednocześnie, bez czekania na faktyczny dostęp do nich;
    • w systemie testów jednostkowych jednostka dodany wsparcie dla 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 przy wybudzaniu z sygnału timera;
  • wirtualizacja i bezpieczeństwo:
    • dodany wywołanie systemowe memfd_secret(), który pozwala na utworzenie prywatnego obszaru pamięci w izolowanej przestrzeni adresowej, widocznej tylko dla procesu właściciela, nie odzwierciedlonego w innych procesach i niedostępnego bezpośrednio dla jądra;
    • w systemie filtrowania wywołań systemowych seccomp, podczas przenoszenia procedur obsługi blokady do przestrzeni użytkownika, możliwe jest użycie jednej operacji atomowej w celu utworzenia deskryptora pliku dla izolowanego zadania i zwrócenia go podczas przetwarzania wywołania systemowego. Proponowana operacja rozwiązuje problem z przerwaniem obsługi w przestrzeni użytkownika po nadejściu sygnału;
    • dodany nowy mechanizm do zarządzania ograniczaniem zasobów w przestrzeni nazw identyfikatora użytkownika, co wiąże indywidualne liczniki rlimit 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 buforów, dostępami przed inicjalizacją i wykorzystaniem poza bieżącym kontekstem;
    • Uwierzytelnianie wskaźników zapewniane przez platformę ARM64 można teraz skonfigurować oddzielnie dla jądra i przestrzeni użytkownika. Technologia pozwala na użycie 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;
    • w systemie Linux w trybie użytkownika dodany obsługa stosowania sterowników dla urządzeń PCI z wirtualną magistralą PCI, realizowana przez sterownik PCI-over-virtio;
    • dla systemów x86 dodano obsługę parawirtualnego urządzenia virtio-iommu, które umożliwia wysyłanie żądań IOMMU, takich jak ATTACH, DETACH, MAP i UNMAP, poprzez transport virtio bez emulacji tablic 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 ładowanie zombiemanipulowanie wyciekiem informacji kanałami obcymi, mającym miejsce podczas działania mechanizmu asynchronicznego przerywania operacji (TAA, TSX Asynchronous Abort);
  • podsystem sieciowy:
    • kontynuacja integracji z rdzeniem MPTCP (MultiPath TCP), rozszerzeniem 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. W nowym numerze dodany mechanizm ustawiania własnej polityki hashowania ruchu dla IPv4 i IPv6 (multipath hash policy), pozwalający z przestrzeni użytkownika określić, które pola w pakietach, także enkapsulowanych, zostaną wykorzystane przy wyliczaniu hasha decydującego o wyborze ścieżki za paczkę;
    • 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 dodany środki do przeniesienia sterowania do innego gniazda w przypadku awarii przetwarzania żądania przez początkowo wybrane gniazdo (rozwiązuje problem utraty poszczególnych połączeń podczas ponownego uruchamiania usług);
  • sprzęt:
    • w sterowniku amdgpu wdrożone obsługa nowej serii procesorów graficznych AMD Radeon RX 6000 o nazwach kodowych „Beige Goby” (Navi 24) i „Yellow Carp”, a także ulepszona obsługa 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 mechanizmu oszczędzania energii 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ółdzielona 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 tym 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ępne wsparcie technologiczne Inteligentna zmiana AMD, który dynamicznie zmienia parametry zużycia energii procesora i karty graficznej w laptopach z chipsetem i kartą graficzną AMD w celu zwiększenia wydajności podczas grania, edycji wideo i renderowania 3D;
    • w sterowniku i915 dla kart graficznych Intel w zestawie obsługa chipów Intel Alderlake P;
    • dodano sterownik drm/hyperv dla wirtualnej karty graficznej Hyper-V;
    • dodany sterownik graficzny Simpledrm, który wykorzystuje bufor ramki EFI-GOP lub VESA dostarczony przez oprogramowanie układowe UEFI lub BIOS. Głównym celem sterownika jest zapewnienie możliwości wyświetlania grafiki podczas początkowych etapów rozruchu, zanim będzie można użyć pełnego sterownika DRM. Sterownik można wykorzystać także jako rozwiązanie tymczasowe dla sprzętu, który nie posiada jeszcze natywnych sterowników DRM;
    • dodany kompleksowa obsługa komputera Raspberry Pi 400;
    • Dodano sterownik dell-wmi-privacy do obsługi przełączników sprzętowych kamery i mikrofonu znajdujących się w laptopach Dell;
    • do laptopów Lenovo dodany Interfejs WMI do zmiany parametrów BIOS-u poprzez sysfs /sys/class/firmware-attributes/;
    • rozszerzony obsługa urządzeń z interfejsem USB4;
    • dodany obsługa 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. Dodany poprawki redukują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