Wydanie jądra Linux 5.3

Po dwóch miesiącach prac Linus Torvalds przedstawił wydał jądro Linux 5.3. Wśród najbardziej zauważalnych zmian: wsparcie dla GPU AMD Navi, procesorów Zhaoxi oraz technologii zarządzania energią Intel Speed Select, możliwość używania instrukcji umwait do czekania bez korzystania z pętli,
zwiększająca interaktywność tryb ‘utilization clamping’ dla asymetrycznych CPU, wywołanie systemowe pidfd_open, możliwość używania adresów IPv4 z podsieci 0.0.0.0/8, możliwość sprzętowego przyspieszenia nftables, wsparcie HDR w subsystemie DRM, integracja hyperwizora ACRN.

W zapowiedzi nowego wydania Linus przypomniał wszystkim deweloperom o główniej zasadzie rozwoju jądra — zachowaniu niezmienności zachowań dla komponentów przestrzeni użytkownika. Zmiany w jądrze nie powinny w żaden sposób naruszać już działających aplikacji i prowadzić do regresji na poziomie użytkownika. Przy tym naruszenie zachowania może wywołać nie tylko zmianę ABI, usunięcie przestarzałego kodu lub pojawienie się błędów, ale także pośredni wpływ poprawnie działających użytecznych usprawnień. Jako wymowny przykład została odrzucona użyteczna optymalizacja w kodzie Ext4, redukująca liczbę operacji na dysku poprzez wyłączenie wstępnego odczytu tabeli inode przy drobnych żądaniach wejścia/wyjścia.

Optymalizacja doprowadziła do tego, że z powodu zmniejszonej aktywności dyskowej entropia dla generatora liczb losowych getrandom() zaczęła gromadzić się wolniej i w niektórych konfiguracjach przy określonych okolicznościach mogły występować zawieszenia podczas ładowania do wypełnienia puli entropii. Ponieważ optymalizacja jest rzeczywiście przydatna, wśród deweloperów pojawiła się dyskusja, w której zaproponowano rozwiązanie problemu poprzez wyłączenie domyślnie blokującego trybu wywołania getrandom() z dodaniem opcjonalnego flagu do oczekiwania na entropię, ale taka zmiana wpłynie na jakość liczb losowych na wczesnym etapie ładowania.

W nowej wersji przyjęto 15794 poprawek od 1974 deweloperów,
rozmiar łaty — 92 MB (zmiany objęły 13986 plików, dodano 258419 linii kodu,
usunięto 599137 linii). Około 39% wszystkich wprowadzonych w 5.3
zmian związanych jest z sterownikami urządzeń, około 12% zmian dotyczy
aktualizacji kodu specyficznego dla architektur sprzętowych, 11%
związane z stosami sieciowymi, 3% — z systemami plików i 3% z wewnętrznymi
podsystemami jądra.

Podstawowe nowości:

  • Pamięć i usługi systemowe
    • Rozwój funkcjonalności 'pidfd' został kontynuowany, co ułatwia obsługę sytuacji związanych z ponownym wykorzystaniem PID (pidfd jest powiązany z konkretnym procesem i nie zmienia się, podczas gdy PID może być przypisany innemu procesowi po zakończeniu aktualnego procesu powiązanego z tym PID). Wcześniej do jądra dodano
      wywołanie systemowe pidfd_send_signal() oraz flagę CLONE_PIDFD w wywołaniu clone(), co umożliwia uzyskanie pidfd do użycia w pidfd_send_signal(). Przy użyciu wywołania clone() z flagą CLONE_PIDFD mogą wystąpić problemy z menedżerami usług lub systemem wymuszającym zakończenie procesów w przypadku braku pamięci na platformie Android. W takim przypadku używane jest wywołanie fork() lub clone() bez CLONE_PIDFD.

      W jądrze 5.3 wprowadzono wywołanie systemowe pidfd_open(), które pozwala uzyskać zweryfikowany pidfd dla dowolnego istniejącego procesu, który nie został utworzony przez wywołanie clone() z flagą CLONE_PIDFD. Dodano również wsparcie dla pollowania pidfd za pomocą poll() i epoll(), co pozwala w menedżerach procesów śledzić zakończenia dowolnych procesów, nie obawiając się stanu wyścigu w przypadku przypisania PID nowemu procesowi. Mechanizm powiadamiania o zakończeniu pracy procesu związanego z pidfd jest analogiczny do informowania o zakończeniu własnego procesu potomnego;

    • Do planisty zadań dodano wsparcie dla mechanizmu ograniczenia obciążenia (Utilization clamping), które pozwala przestrzegać minimalnych lub maksymalnych zakresów częstotliwości, w zależności od aktywnych zadań na CPU. Wprowadzony mechanizm przyspiesza zadania, które bezpośrednio wpływają na jakość interakcji z użytkownikiem, uruchamiając te zadania przynajmniej w dolnej granicy 'żądanej' częstotliwości. Zadania o niskim priorytecie, które nie wpływają na pracę użytkownika, są uruchamiane z wykorzystaniem górnego limitu 'dozwolonej' częstotliwości. Limity są ustalane za pomocą atrybutów sched_uclamp_util_min i sched_uclamp_util_max w wywołaniu systemowym sched_setattr().
    • Dodano wsparcie dla technologii zarządzania energią Intel Speed Select, dostępnej na niektórych serwerach z procesorami Intel Xeon. Wskazana technologia pozwala na ustawienie konfiguracji wydajności i przepustowości sekcji dla różnych rdzeni CPU, co umożliwia nadanie priorytetu wydajności dla zadań wykonywanych na konkretnych rdzeniach, kosztem wydajności innych rdzeni;
    • Procesom w przestrzeni użytkownika oferowana możliwość oczekiwania przez krótki czas bez użycia cykli za pomocą instrukcji umwait. Instrukcja ta, wraz z instrukcjami umonitor i tpause, będzie oferowana w nadchodzących chipach Intel "Tremont", co pozwoli na realizację opóźnień, efektywnych pod względem zużycia energii i nie wpływających na wydajność innych wątków przy użyciu Hyper Threading;
    • Dla architektury RISC-V dodano wsparcie dla dużych stron pamięci (huge pages);
    • Do mechanizmu śledzenia „kprobes” dodano możliwość dereferencji wskaźników jądra w przestrzeni użytkownika, co można zastosować na przykład do oceniania zawartości struktur przekazywanych do wywołań systemowych. Dodano również możliwość ustalania kontroli na etapie ładowania.
    • Do pliku konfiguracyjnego dodano opcję PREEMPT_RT do pracy w trybie rzeczywistym. Sam kod obsługujący tryb rzeczywisty jeszcze nie został dodany do jądra, ale pojawienie się opcji jest dobrym znakiem, że wieloletnia epopeja związana z integracją łat Realtime-Preempt zbliża się do końca;
    • Dodano wywołanie systemowe clone3() z bardziej rozszerzalnym wariantem interfejsu clone(), umożliwiającym wskazanie większej liczby flag;
    • Dodano handler bpf_send_signal(), umożliwiający programom BPF wysyłanie sygnałów do dowolnych procesów;
    • Dla zdarzeń perf w środowisku hipernadzorcy KVM dodano nowy mechanizm filtracji zdarzeń, pozwalający administratorowi określić typy zdarzeń, które są dozwolone lub niedozwolone do monitorowania po stronie systemu gościa;
    • Do mechanizmu weryfikacji aplikacji eBPF dodano możliwość obsługi programów z pętlami, o ile wykonanie pętli jest ograniczone i nie może prowadzić do przekroczenia limitu maksymalnej liczby instrukcji;
  • Podsystem dyskowy, wejście/wyjście i systemy plików
    • Dla systemu plików XFS wprowadzono możliwość wielowątkowego przeszukiwania inode (na przykład przy sprawdzaniu limitów). Dodano nowe ioctl BULKSTAT i INUMBERS, które zapewniają dostęp do funkcji pojawiających się w piątej wersji formatu FS, takich jak czas utworzenia inode oraz możliwość ustawienia parametrów BULKSTAT i INUMBERS dla każdej grupy AG (Allokacyjne Grupy);
    • W Ext4 dodano wsparcie dla pustek w katalogach (nieprzypisanych bloków).
      Zapewniono obsługę flagu „i” (niemutowalna) dla otwartych plików (zakaz zapisu w sytuacji, gdy flaga została ustawiona w momencie, gdy plik już był otwarty);
    • W Btrfs zapewniono możliwość szybkiej realizacji crc32c na wszystkich architekturach;
    • W CIFS, z kodu obsługującego smbdirect usunięto status eksperymentalny. W SMB3 dodano możliwość używania algorytmów kryptograficznych w trybie GCM. Dodano nową opcję montowania do wydobywania parametrów trybu z wpisów ACE (Entry Kontroli Dostępu). Zoptymalizowano wydajność wywołania open();
    • W F2FS dodano opcję ograniczającą zbieranie śmieci w trybie checkpoint=disable. Dodano ioctl do usuwania zakresów bloków z F2FS, co umożliwia dynamiczne dostosowanie rozmiaru partycji. Dodano możliwość umieszczania w F2FS pliku wymiany z zapewnieniem bezpośredniego wejścia/wyjścia. Dla wszystkich użytkowników dodano wsparcie dla blokowania pliku i przydzielania bloków dla podobnych plików;
    • W interfejsie do asynchronicznego wejścia/wyjścia io_uring dodano wsparcie dla asynchronicznych operacji sendmsg() i recvmsg();
    • W systemie plików UBIFS dodano wsparcie dla kompresji przy użyciu algorytmu zstd oraz możliwość weryfikacji podpisanych obrazów FS;
    • W FS Ceph dodano wsparcie dla oznaczeń bezpieczeństwa SELinux dla plików;
    • Dla NFSv4 wprowadzono nową opcję montowania „nconnect=”, określającą liczbę ustanowionych połączeń z serwerem. Ruch między tymi połączeniami będzie rozkładany z wykorzystaniem równoważenia obciążenia. Ponadto serwer NFSv4 teraz tworzy katalog /proc/fs/nfsd/clients z informacjami o bieżących klientach, w tym danymi o otwartych przez nich plikach;
  • Wirtualizacja i bezpieczeństwo
    • Do składu jądra dołączono hipernadzorcę dla urządzeń wbudowanych ACRN, który został napisany z myślą o gotowości do wykonywania zadań w czasie rzeczywistym i przydatności do stosowania w krytycznych systemach. ACRN zapewnia minimalne narzuty, gwarantuje niskie opóźnienia (low latency) i odpowiednią reakcję podczas interakcji z urządzeniami. Obsługiwane jest wirtualizowanie zasobów CPU, wejścia/wyjścia, podsystemu sieciowego, operacji graficznych i dźwiękowych. ACRN może być stosowany do uruchomienia kilku izolowanych maszyn wirtualnych w elektronicznych jednostkach sterujących, panelach przyrządowych, systemach informacyjnych w pojazdach, urządzeniach IoT dla konsumentów i innej technice wbudowanej;
    • W trybie użytkownika Linux dodano tryb „podróży w czasie”, który pozwala spowolnić lub przyspieszyć czas w wirtualnym środowisku UML w celu uproszczenia debugowania kodu związanego z czasem. Dodatkowo dodano parametr
      time-travel-start, pozwalający na uruchomienie zegarów systemowych od wskazanego momentu w formacie epoch;
    • Dodano nowe opcje wiersza poleceń jądra „init_on_alloc” i „init_on_free”, których włączenie powoduje zerowanie przydzielanych i zwalnianych obszarów pamięci (wypełnienie zerami przy malloc i free), co zwiększa bezpieczeństwo kosztem dodatkowych narzutów na inicjalizację;
    • Dodano nowy sterownik virtio-iommu z implementacją parawirtualizowanego urządzenia, które umożliwia wysyłanie zapytań IOMMU, takich jak ATTACH, DETACH, MAP i UNMAP, przez transport virtio bez emulacji tabel stron pamięci;
    • Dodano nowy sterownik virtio-pmem, zapewniający dostęp do urządzeń pamięci masowej, odzwierciedlonych w fizycznej przestrzeni adresowej, takich jak NVDIMM;
    • Zrealizowano możliwość przypinania kluczy kryptograficznych do przestrzeni nazw użytkownika lub sieciowej (klucze stają się niedostępne poza wybraną przestrzenią nazw) oraz zabezpieczania kluczy za pomocą ACL;
    • W systemie kryptograficznym dodano wsparcie bardzo szybkiego algorytmu niekryptograficznego haszowania xxhash, którego prędkość opiera się na wydajności pamięci;
  • Subsystem sieciowy
    • Zapewniono obsługę adresów IPv4 w zakresie 0.0.0.0/8, który wcześniej był niedostępny do wykorzystania. Wprowadzenie tej podsieci pozwoli rozdzielić jeszcze 16 milionów adresów IPv4;
    • W Netfilter dla nftables dodano wsparcie mechanizmów sprzętowego przyspieszania filtrowania pakietów dzięki zastosowaniu w dodanych sterownikach Flow Block API. Na stronie adapterów sieciowych mogą być prezentowane całe tabele reguł ze wszystkimi łańcuchami. Włączenie odbywa się poprzez przypisanie flagi NFT_TABLE_F_HW do tabeli. Obsługiwane są proste metadane protokołów warstw 3 i 4, działania zaakceptuj/odrzuć, dopasowania według IP oraz portów sieciowych nadawcy/odbiorcy i typu protokołu;
    • Dodano wbudowane wsparcie dla śledzenia połączeń dla mostów sieciowych, które nie wymaga zastosowania warstwy emulacyjnej br_netfilter;
    • W nf_tables dodano wsparcie dla modułu SYNPROXY, który powtarza podobną funkcjonalność z iptables, a także zrealizowana możliwość weryfikacji w regułach według poszczególnych opcji w nagłówku IPv4;
    • Dodano możliwość dołączenia programów BPF do wywołań systemowych setsockopt() i getsockopt(), co na przykład umożliwia przypięcie własnych kontrolerów dostępu do tych wywołań. Ponadto dodano nowy punkt wywołania (hook), który umożliwia wywołanie programu BPF raz na każdy interwał RTT (round-trip-time, czas ping);
    • Dla IPv4 i IPv6 dodano nowy mechanizm przechowywania danych o trasach nexthop, mający na celu zwiększenie skalowalności tabel trasowania. Przeprowadzone testy wykazały, że przy użyciu nowego systemu zestaw 743 tysięcy tras został załadowany do jądra w zaledwie 4.3 sekundy;
    • Dla Bluetooth zrealizowano funkcjonalność niezbędna do obsługi LE ping;
  • Sprzęt
    • Dodano wsparcie dla procesorów zgodnych z x86 firmy Zhaoxin, rozwijanych w wyniku wspólnego projektu VIA Technologies i samorządu Szanghaju. Rodzina CPU ZX oparta jest na architekturze x86-64 Isaiah, kontynuującej rozwój technologii VIA Centaur;
    • Do podsystemu DRM (Direct Rendering Manager), a także do sterowników graficznych amdgpu i i915, dodano wsparcie dla analizy, przetwarzania i przesyłania przez port HDMI metadanych HDR (szeroki zakres dynamiki), umożliwiającego korzystanie z paneli HDR i ekranów zdolnych do wyświetlania dodatkowych zakresów jasności;
    • W sterowniku amdgpu dodano początkowe wsparcie dla GPU AMD NAVI (RX5700), które obejmuje podstawowy sterownik, kod do interakcji z ekranami (DCN2), wsparcie GFX i obliczeń (GFX10),
      SDMA 5 (System DMA0), środki zarządzania energią oraz multimedia kodeków/dekoderów (VCN2). W amdgpu również poprawiono wsparcie dla kart opartych na GPU Vega12 i Vega20, dla których dodano dodatkowe możliwości zarządzania pamięcią i zużyciem energii;
    • W sterowniku amdkfd (dla dedykowanych GPU, takich jak Fiji, Tonga, Polaris) dodano wsparcie dla kart opartych na GPU VegaM;
    • W sterowniku DRM dla kart graficznych Intel dla chipów Icelake zrealizowano nowy tryb multisegmentowej korekcji gamma. Dodano możliwość wyjścia przez DisplayPort w formacie YCbCr4:2:0. Dodano nowe firmware GuC dla SKL, BXT, KBL, GLK i ICL. Zrealizowano możliwość wyłączania zasilania ekranu w trybie asynchronicznym. Dodano wsparcie dla zapisywania i przywracania kontekstu renderowania dla chipów Ironlake (gen5) i gen4 (Broadwater — Cantiga), co pozwala na przywracanie stanu GPU z przestrzeni użytkownika przy przechodzeniu od jednych operacji wsadowych do innych;
    • W sterowniku Nouveau zapewniono identyfikację chipsetu NVIDIA Turing TU116;
    • Rozszerzono możliwości sterownika DRM/KMS dla akceleratorów operacji graficznych ARM Komeda (Mali D71), dodano wsparcie dla skalowania, dzielenia/łączenia warstw, rotacji, odroczonego zapisu, AFBC, SMMU oraz formatów kodowania koloru Y0L2, P010, YUV420_8/10BIT;
    • W sterowniku MSM dodano wsparcie dla serii GPU Adreno A540, stosowanej w procesorach Qualcomm, a także wsparcie dla kontrolera DSI MSM8998 dla Snapdragon 835;
    • Dodano sterowniki dla paneli LCD Samsung S6E63M0, Armadeus ST0700, EDT ETM0430G0DH6, OSD101T2045-53TS,
      Evervision VGG804821, FriendlyELEC HD702E, KOE tx14d24vm1bpa, TFC S9700RTWV43TR-01B, EDT ET035012DM6 oraz VXT VL050-8048NT-C01;
    • Dodano sterownik do wykorzystania środków przyspieszania dekodowania
      wideo, dostępnych w SoC Amlogic Meson;
    • W sterowniku v3d (dla GPU Broadcom Video Core V, używanego w Raspberry Pi) dodano wsparcie zarządzanie obliczeniowymi shaderami;
    • Dodano sterownik dla klawiatur i touchpadów SPI stosowanych w nowoczesnych modelach laptopów Apple MacBook i MacBookPro;
    • Dodano dodatkową ochronę wywołań ioctl związanych ze sterownikiem floppy, a sam sterownik oznaczono jako pozostający bez wsparcia
      („orphaned”), co oznacza zakończenie jego testowania. Sterownik wciąż jest zachowany w jądrze, ale jego poprawne działanie nie jest gwarantowane. Sterownik uznawany jest za przestarzały, ponieważ trudno znaleźć działający sprzęt do jego testowania — wszystkie aktualne zewnętrzne nośniki zazwyczaj korzystają z interfejsu USB.
    • Dodano sterownik cpufreq dla płyt Raspberry Pi, umożliwiający dynamiczne zarządzanie zmianą częstotliwości procesora;
    • Dodano wsparcie dla nowych SoC ARM Mediatek mt8183 (4x Cortex-A73 + 4x Cortex-A53), TI J721E (2x Cortex-A72 + 3x Cortex-R5F + 3 DSP + MMA) oraz Amlogic G12B (4x Cortex-A73 + 2x Cortex-A53), a także płyty:
      • Purism Librem5,
      • Aspeed BMC,
      • Microsoft Olympus BMC,
      • Kontron SMARC,
      • Novtech Meerkat96 (i.MX7),
      • ST Micro Avenger96,
      • Google Cheza (Qualcomm SDM845),
      • Qualcomm Dragonboard 845c (Qualcomm SDM845),
      • Hugsun X99 TV Box (Rockchip RK3399),
      • Khadas Edge/Edge-V/Captain (Rockchip RK3399),
      • HiHope RZ/G2M,
      • NXP LS1021A-TSN.

Jednocześnie Fundacja Wolnego Oprogramowania Ameryki Łacińskiej utworzyła
wariant w pełni otwarte jądro 5.3Linux-libre 5.3-gnu, oczyszczone z elementów oprogramowania i sterowników zawierających zamknięte komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W nowym wydaniu wyłączono ładowanie blobów w sterownikach qcom, hdcp drm, allegro-dvt i meson-vdec.
Zaktualizowano kod czyszczenia blobów w sterownikach i podsystemach amdgpu, i915, netx, r8169, brcmfmac, rtl8188eu, adreno, si2157, pvrusb2, touchscreen_dmi, w sterowniku dźwięku dla skylake oraz w dokumentacji mikrokodu.

Ź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