Wydanie jądra Linux 5.7

Po dwóch miesiącach prac Linus Torvalds przedstawił wydał jądro Linux 5.7. Wśród najbardziej zauważalnych zmian: nowa implementacja systemu plików exFAT, moduł bareudp do tworzenia tuneli UDP, ochrona oparta na autoryzacji wskaźników dla ARM64, możliwość dołączania programów BPF do obsługi LSM, nowa implementacja Curve25519, detektor „split-lock”, kompatybilność BPF z PREEMPT_RT, zniesienie ograniczenia do 80-znakowego rozmiaru linii w kodzie, uwzględnienie temperatury CPU w harmonogramie zadań, możliwość użycia clone() do tworzenia procesów w innym cgroup, ochrona przed zapisem do pamięci za pomocą userfaultfd.

W nową wersję przyjęto 15033 poprawki od 1961 programistów,
rozmiar łatki wynosi 39 MB (zmiany dotyczyły 11590 plików, dodano 570560 linii kodu,
usunięto 297401 linii). Około 41% wszystkich wprowadzonych w 5.7
zmian dotyczy sterowników urządzeń, około 16% zmian ma
związek z aktualizacją kodu specyficznego dla architektur sprzętowych, 13%
dotyczy stosu sieciowego, 4% — systemów plików i 4% z wewnętrznymi
podsystemami jądra.

Podstawowe nowości:

  • Podsystem dyskowy, wejście/wyjście i systemy plików
    • Dodano nową implementację sterownika exFAT, opartą na aktualnej bazie kodu „sdfat” (2.x), rozwijanej przez firmę Samsung dla swoich smartfonów z systemem Android. Wcześniej dodany do jądra sterownik oparty był na przestarzałym kodzie Samsunga (wersja 1.2.9) i odstawał pod względem wydajności od nowego sterownika o około 10%. Przypomnijmy, że dodanie wsparcia dla exFAT do jądra stało się możliwe po tym, jak firma Microsoft opublikowała udostępniła ogólne specyfikacje i umożliwiła bezpłatne korzystanie z patentów na exFAT w systemie Linux.
    • W Btrfs wprowadzono nową komendę ioctl() — BTRFS_IOC_SNAP_DESTROY_V2, umożliwiającą usuwanie podziału na podstawie jego identyfikatora. Zapewniono pełne wsparcie dla klonowania wbudowanych_extentów. Rozszerzono liczbę punktów anulowania operacji redystrybucji, co pozwoliło na skrócenie długich oczekiwań przy wykonywaniu polecenia 'balance cancel'. Przyspieszono określanie odwrotnych odniesień do extentów (np. czas realizacji testowego scenariusza zmniejszono z godziny do kilku minut). Dodano możliwość dołączania do każdego inode drzewa extentów pliku. Przerobiono schemat blokowania używany podczas zapisu do podziałów i przy wykluczeniu NOCOW. Zwiększono efektywność wykonania fsync dla zakresów.
    • W XFS ulepszono sprawdzanie metadanych oraz wykonywanie fsck dla aktywnych partycji. Zaproponowano bibliotekę do przebudowy struktur btree, która w przyszłości będzie używana do przeróbki xfs_repair i wdrożenia możliwości odzyskiwania bez odmontowywania partycji.
    • W CIFS dodano eksperymentalne wsparcie dla umieszczania partycji swap w magazynach SMB3. Zrealizowano rozszerzenia POSIX w readdir, określone w specyfikacji SMB3.1.1. Zwiększono wydajność zapisu dla stron o rozmiarze 64KB przy włączonym trybie cache=strict i korzystaniu z wersji protokołu 2.1+.
    • System plików EXT4 został przetworzony z bmap i iopoll na wykorzystanie iomap.
    • W F2FS wprowadzono opcjonalne wsparcie dla kompresji danych z wykorzystaniem algorytmu zstd. Domyślnie do kompresji wykorzystywany jest algorytm LZ4. Dodano wsparcie dla komendy „chattr -c commit”. Zwiększono możliwość wyświetlania czasu montowania. Dodano ioctl F2FS_IOC_GET_COMPRESS_BLOCKS do uzyskiwania informacji o liczbie skompresowanych bloków. Dodano dane o kompresji, które są wyświetlane przez statx.
    • W systemie plików Ceph dodano możliwość lokalnego wykonywania operacji tworzenia i usuwania (unlink) pliku bez oczekiwania na odpowiedź z serwera (praca w trybie asynchronicznym). Zmiana ta pozwala znacznie zwiększyć wydajność podczas pracy narzędzia rsync.
    • W OVERLAYFS dodano możliwość wykorzystania virtiofs jako górnego systemu plików.
    • Przepisano kod przeszukiwania ścieżek w VFS, przerobiono kod analizy linków symbolicznych oraz zjednoczono przeszukiwanie punktów montowania.
    • W podsystemie scsi nieprzywilejowanym użytkownikom zezwolono na wykonywanie poleceń ZBC.
    • W dm_writecache zrealizowano możliwość stopniowego czyszczenia pamięci podręcznej na podstawie parametru max_age, definiującego maksymalny czas życia bloku.
    • W dm_integrity dodano wsparcie dla operacji „discard”.
    • W null_blk dodano wsparcie dla symulacji błędów w celu testowania awarii.
    • Dodano możliwość wysyłania powiadomień udev o zmianie rozmiaru urządzenia blokowego.
  • Subsystem sieciowy
    • W Netfilter włączono zmiany, znacznie przyspieszające przetwarzanie dużych zestawów zgrupowania (nftables set), w których wymagana jest weryfikacja kombinacji podsieci, portów sieciowych, protokołu i adresów MAC.
      Optymalizacje zostały wprowadzone W module nft_set_pipapo (PIle PAcket POlicies), który rozwiązuje zadanie dopasowania zawartości pakietu do stosowanych w regułach filtrowania dowolnych zakresów stanów pól, takich jak zakresy IP i porty sieciowe (nft_set_rbtree i nft_set_hash manipulują dopasowaniem przedziałów i bezpośrednim odzwierciedleniem wartości). Wersja pipapo wykorzystująca wektory 256-bitowe instrukcji AVX2 na systemie z procesorem AMD Epyc 7402 wykazała wzrost wydajności o 420% podczas analizy 30 tysięcy rekordów zawierających pary port-protokół. Wzrost przy dopasowywaniu pary z podsieci i numeru portu podczas analizy 1000 rekordów wyniósł 87% dla IPv4 i 128% dla IPv6.
    • Dodano Moduł bareudp, który umożliwia inkapsulację różnych protokołów L3 w tunelu UDP, takich jak MPLS, IP i NSH.
    • Kontynuowana jest integracja komponentów MPTCP (MultiPath TCP), rozszerzenia protokołu TCP w celu umożliwienia pracy TCP-połączenia z dostawą pakietów jednocześnie przez wiele tras za pośrednictwem różnych interfejsów sieciowych przypisanych do różnych adresów IP.
    • Dodano Wsparcie dla mechanizmów sprzętowego przyspieszenia inkapsulacji ramki Ethernet w 802.11 (Wi-Fi).
    • Podczas przenoszenia urządzenia z jednej przestrzeni nazw podsystemu sieciowego (network namespace) do innej zapewniono korektę uprawnień i właściciela odpowiednich plików w sysfs.
    • Udostępniono możliwość korzystania z flagi SO_BINDTODEVICE użytkownikom, którzy nie mają praw roota.
    • Przyjęto trzecią część poprawek, które przekształcają narzędzia ethtool z ioctl() na korzystanie z interfejsu netlink. Nowy interfejs upraszcza dodawanie rozszerzeń, poprawia obsługę błędów, pozwala na wysyłanie powiadomień przy zmianie stanu, ułatwia interakcję między jądrem a przestrzenią użytkownika i zmniejsza liczbę synchronizowanych nazwanych list.
    • Dodano możliwość korzystania z specjalnych sprzętowych akceleratorów do wykonywania operacji śledzenia połączeń.
    • W netfilter dodano hock do podłączenia klasyfikatorów pakietów wychodzących (egress), który uzupełnia wcześniej istniejący hock dla pakietów przychodzących (ingress).
  • Wirtualizacja i bezpieczeństwo
    • Dodano sprzętową realizację autoryzacji wskaźników (Autoryzacja wskaźnika), wykorzystująca specjalistyczne instrukcje CPU ARM64 do ochrony przed atakami, które wykorzystują techniki ataków zwrotnych (ROP), w których napastnik nie próbuje umieścić swojego kodu w pamięci, lecz operuje już istniejącymi w załadowanych bibliotekach fragmentami instrukcji maszynowych kończącymi się instrukcją powrotu kontroli. Ochrona polega na wykorzystaniu podpisów cyfrowych do weryfikacji adresów powrotu na poziomie jądra. Podpis przechowywany jest w nieużywanych górnych bitach samego wskaźnika. W przeciwieństwie do implementacji programowych, tworzenie i weryfikacja podpisów cyfrowych są realizowane za pomocą specjalnych instrukcji CPU.
    • Dodano możliwość ochrony obszaru pamięci przed zapisem za pomocą wywołania systemowego userfaultfd(), przeznaczonego do obsługi page faults (odwołanie do nieprzydzielonych stron pamięci) w przestrzeni użytkownika. Idea polega na wykorzystaniu userfaultfd() do monitorowania naruszenia dostępu do stron oznaczonych jako chronione przed zapisem oraz wywoływania przetwornika, który może reagować na takie próby zapisu (np. w celu obsługi zmian podczas tworzenia live-snapshotów działających procesów, utrwalania stanu przy zrzutach pamięci na dysk, realizacji pamięci współdzielonej, monitorowania zmian w pamięci). Funkcjonalność jest równoważna zastosowaniu mprotect() w połączeniu z obsługą sygnału SIGSEGV, ale działa wyraźnie szybciej.
    • W SELinux ogłoszono przestarzałym parametr „checkreqprot”, który pozwalał na wyłączenie weryfikacji ochrony pamięci podczas przetwarzania reguł (zezwalał na użycie wykonywalnych obszarów pamięci niezależnie od zaleceń określonych w regułach). Symbolicznym linkom kernfs zezwolono na dziedziczenie kontekstu katalogów rodzicielskich.
    • W skład włączono moduł KRSI, umożliwiający przypinanie programów BPF do dowolnych haków LSM w jądrze. Zmiana ta umożliwia tworzenie modułów LSM (Linux Security Module) w formie programów BPF do realizacji zadań audytu i mądrego kontroli dostępu.
    • Przeprowadzono optymalizacja wydajności /dev/random dzięki pakietowemu przesyłaniu wartości CRNG zamiast pojedynczego wywołania instrukcji RNG. Poprawiono działanie getrandom i /dev/random na systemach ARM64, dostarczających instrukcje RNG.
    • Implementacja krzywej eliptycznej Curve25519 została zastąpiona wariantem z biblioteki HACL, dla którego przygotowano matematyczne dowody formalnej weryfikacji niezawodności.
    • Dodano mechanizm informowania o wolnych stronach pamięci. Dzięki temu mechanizmowi systemy gościnne mogą przekazywać systemowi gospodarza informacje o stronach, które nie są już używane, a system gospodarz może odzyskać te strony.
    • W vfio/pci dodano wsparcie dla SR-IOV (Single-Root I/O Virtualization).
  • Pamięć i usługi systemowe
    • Od 80 do 100 znaków zwiększone ograniczenie maksymalnej długości linii w kodzie źródłowym. Zaleca się jednak, aby programiści nadal trzymali się granicy 80 znaków w linii, chociaż nie jest to już sztywny limit. Ponadto przekroczenie limitu wielkości linii spowoduje wyświetlenie ostrzeżenia podczas kompilacji tylko wtedy, gdy narzędzie checkpatch zostanie uruchomione z opcją '--strict'. Zmiana ta pozwoli programistom nie odwracać uwagi od manipulacje ze spacjami i swobodniej czuć się przy wyrównywaniu kodu, a także zapobiega nadmiernemu łamaniu linii, co przeszkadza w odbiorze kodu i wyszukiwaniu.
    • Dodano wsparcie dla mieszanym trybie rozruchu EFI, pozwalające na załadowanie 64-bitowego jądra z 32-bitowego firmware'u na 64-bitowym CPU bez użycia specjalizowanego bootloadera.
    • Włączona system wykrywania i debugowania zablokowanych jednostek ('split lock'), występujących podczas dostępu do niewyrównanych danych w pamięci, ponieważ podczas wykonywania atomowej instrukcji dane przecinają dwie linie pamięci podręcznej CPU. Tego typu blokady prowadzą do znacznego spadku wydajności (o 1000 cykli wolniej niż atomowa operacja z danymi mieszczącymi się w jednej linii pamięci podręcznej). W zależności od parametru rozruchowego 'split_lock_detect', jądro może dynamicznie wykrywać takie blokady i wyświetlać ostrzeżenia lub wysyłać sygnał SIGBUS aplikacji, która spowodowała blokadę.
    • W harmonogramie zadań zapewniono śledzenie wskaźników temperatury (Thermal Pressure) i wdrożono monitorowanie przegrzania podczas realizacji zadań. Korzystając z wydawanej statystyki, menedżer temperatury (thermal governor) może korygować maksymalną częstotliwość CPU w przypadku przegrzania, a planista zadań teraz uwzględnia spadek mocy obliczeniowej spowodowany takim ograniczeniem częstotliwości przy planowaniu uruchomienia zadań (wcześniej planista reagował na zmianę częstotliwości z pewnym opóźnieniem, przez jakiś czas podejmując decyzje na podstawie zawyżonych założeń dotyczących dostępnych zasobów obliczeniowych).
    • W planista zadań zaangażowane są niezmienne wskaźniki monitorowania obciążenia, pozwalające poprawnie ocenić obciążenie, niezależnie od aktualnej częstotliwości pracy CPU. Zmiana ta umożliwia dokładniejsze prognozowanie zachowania zadań w warunkach dynamicznego zmieniającego się napięcia i częstotliwości CPU. Na przykład zadanie, które wykorzystywało 1/3 zasobów CPU przy częstotliwości 1000 MHz, będzie korzystać z 2/3 zasobów przy obniżeniu częstotliwości do 500 MHz, co wcześniej tworzyło fałszywe przypuszczenie o pracy na pełną moc (tj. zadania dla planisty wydawały się większe tylko przez obniżenie częstotliwości, co prowadziło do podejmowania błędnych decyzji w schedutil cpufreq governor).
    • Sterownik Intel P-state, odpowiedzialny za wybór trybów wydajności, został przestawiony na korzystanie z schedutil.
    • Zrealizowano możliwość wykorzystania podsystemu BPF podczas pracy jądra w trybie rzeczywistym (PREEMPT_RT). Wcześniej przy włączonym PREEMPT_RT nakazywano wyłączenie BPF.
    • Dodano nowy typ programów BPF — BPF_MODIFY_RETURN, które mogą być przypięte do funkcji w jądrze i zmieniać zwracane przez tę funkcję wartości.
    • Dodano możliwość użycia wywołania systemowego clone3() do tworzenia procesu w cgroup, różniącego się od macierzystego cgroup, co pozwala macierzystemu procesowi na nałożenie ograniczeń i włączenie obliczeń od razu po utworzeniu nowego procesu lub wątku. Na przykład menedżer usług może bezpośrednio przydzielać nowe usługi do oddzielnych cgroup, a nowe procesy umieszczane w «zamrożonych» cgroup będą natychmiast zatrzymywane.
    • w Kbuild dodano wsparcie dla zmiennej środowiskowej «LLVM=1» do przełączania na narzędzia Clang/LLVM podczas budowania jądra. Podniesiono wymagania dotyczące wersji binutils (2.23).
    • W debugfs dodano sekcję /sys/kernel/debug/kunit/ z wynikami testów kunit.
    • Dodano parametru ładowania jądra pm_debug_messages (odpowiednik /sys/power/pm_debug_messages), który włącza wyjście informacji diagnostycznych dotyczących pracy systemu zarządzania energią (przydatne przy debugowaniu problemów z trybem uśpienia i oczekiwania).
    • W interfejsie asynchronicznego wejścia/wyjścia io_uring dodano wsparcie dla splice() i atomowego wyboru buforów.
    • Udoskonalono profilowanie cgroup za pomocą narzędzia perf. Wcześniej perf mógł profilować zadania tylko w określonej cgroup i nie mógł ustalić, do której cgroup należy bieżąca próbka. Teraz perf uzyskuje informacje o cgroup dla każdej próbki, co umożliwia profilowanie więcej niż jednej cgroup i stosowanie sortowania według
      cgroup w raportach.
    • W cgroupfs, pseudo-POC dla zarządzania cgroups, dodano wsparcie dla rozszerzonych atrybutów (xattrs), dzięki którym można na przykład pozostawiać dodatkowe informacje dla obsługi w przestrzeni użytkownika.
    • W kontrolerze pamięci cgroup dodanododano wsparcie dla rekurencyjnej ochrony wartości „memory.low”, regulującej minimalną ilość pamięci RAM przydzielonej uczestnikom grupy. Przy montowaniu hierarchii cgroup z opcją „memory_recursiveprot” wartość „memory.low”, która jest ustawiona dla dolnych węzłów, automatycznie będzie rozdzielana dla wszystkich węzłów podrzędnych.
    • Dodano framework Uacce (Unified/User-space-access-intended Accelerator Framework) do współdzielenia wirtualnych adresów (SVA, Shared Virtual Addressing) między CPU a urządzeniami peryferyjnymi, umożliwiający akceleratorom sprzętowym dostęp do struktur danych w głównym CPU.
  • Architektury sprzętowe
    • Dla architektury ARM zrealizowano możliwość gorącego wyciągania pamięci.
    • Dla architektury RISC-V dodano wsparcie dla gorącego podłączania i wyciągania CPU (CPU hotplug). Dla 32-bitowych RISC-V zrealizowano eBPF JIT.
    • Usunięto możliwość używania 32-bitowych systemów ARM do uruchamiania środowisk gościnnych KVM.
    • Usunięto "fikcyjną" implementację NUMA dla architektury s390, dla której nie znaleziono przypadków użycia, pozwalających na zwiększenie wydajności.
    • Dla ARM64 dodano wsparcie dla rozszerzenia AMU (Activity Monitors Unit), określonego w ARMv8.4 i dostarczającego liczniki wydajności, które wykorzystane zostały do obliczenia współczynników korekcyjnych skalowania częstotliwości w planowaniu zadań.
  • Sprzęt
    • Dodano Wsparcie dla urządzeń vDPA, w których wykorzystywany jest kanał wymiany danych zgodny ze specyfikacjami virtio. Urządzenia vDPA mogą być zarówno fizycznym sprzętem, jak i emulowanymi programowo wirtualnymi urządzeniami.
    • W podsystemie GPIO pojawiła się nowa komenda ioctl() do monitorowania zmian, umożliwiająca poinformowanie procesu o zmianie stanu dowolnej linii GPIO. Jako przykład użycia nowej komendy zaproponowana narzędzie gpio-watch.
    • W sterowniku DRM i915 dla kart graficznych Intel wliczona domyślnie wsparcie dla chipów Tigerlake („Gen12”) oraz wstępne wsparcie dla kontroli podświetlenia OLED. Ulepszono wsparcie dla chipów Ice Lake, Elkhart Lake, Baytrail i Haswell.
    • W sterowniku amdgpu dodano możliwość ładowania firmware do chipu USBC dla ASIC. Ulepszono wsparcie dla chipów AMD Ryzen 4000 „Renoir”. Dodano wsparcie dla kontroli paneli OLED. Zapewnia wyświetlanie stanu firmware w debugfs.
    • W sterowniku DRM vmwgfx dla systemów wirtualizacji VMware dodano możliwość korzystania z OpenGL 4 w systemach gościnnych (wcześniej wspierano OpenGL 3.3).
    • Dodano nowy sterownik DRM tidss dla systemu wyświetlania platformy TI Keystone.
    • Dodano sterowniki dla paneli LCD: Feixin K101 IM2BA02, Samsung s6e88a0-ams452ef01, Novatek NT35510, Elida KD35T133, EDT, NewEast Optoelectronics WJFH116008A, Rocktech RK101II01D-CT, Frida FRD350H54004.
    • W systemie zarządzania energią dodano wsparcie dla platformy Intel Jasper Lake (JSL) opartej na Atomie.
    • Dodano wsparcie dla laptopa Pinebook Pro opartego na Rockchip RK3399, tabletu Pine64 PineTab i smartfona PinePhone opartego na Allwinner A64.
    • Dodano wsparcie dla nowych kodeków dźwiękowych i chipów:
      Amlogic AIU, Amlogic T9015, Texas Instruments TLV320ADCX140, Realtek RT5682, ALC245, Broadcom BCM63XX I2S, Maxim MAX98360A, Presonus Studio 1810c, MOTU MicroBook IIc.
    • Dodano wsparcie dla platform ARM oraz platform Qualcomm Snapdragon 865 (SM8250), IPQ6018, NXP i.MX8M Plus, Kontron „sl28”, 11 wariantów płyty i.MX6 TechNexion Pico, trzy nowe warianty Toradex Colibri, Samsung S7710 Galaxy Xcover 2 oparty na ST-Ericsson u8500, DH Electronics DHCOM SoM i PDK2, Renesas M3ULCB, Hoperun HiHope, Linutronix Testbox v2, PocketBook Touch Lux 3.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster