Реліз ядра Linux 5.3

Після двох місяців розробки Лінус Торвальдс представив реліз ядра Linux 5.3. Серед найбільш помітних змін: підтримка GPU AMD Navi, процесорів Zhaoxi та технології управління енергоспоживанням Intel Speed ​​Select, можливість використання інструкцій umwait для очікування без використання циклів,
підвищує інтерактивність режим 'utilization clamping' для асиметричних CPU, системний виклик pidfd_open, можливість використання IPv4-адрес з підмережі 0.0.0.0/8, можливість прискорення апаратного nftables, підтримка HDR в підсистемі DRM, інтеграція гіпервізора ACRN.

В анонсі Новий випуск Лінус нагадав усім розробникам про головне правило розробки ядра — збереження незмінності поведінки для компонентів простору користувача. Зміни в ядрі жодним чином не повинні порушувати вже працюючі програми і призводити до регресії на рівні користувача. При цьому порушення поведінки може викликати не тільки зміну ABI, видалення застарілого коду або появу помилок, але й опосередкований вплив корисних поліпшень, що коректно працюють. Як наочний приклад була відкинута корисна оптимізація у коді Ext4, що скорочує кількість звернень до накопичувача рахунок відключення випереджального читання таблиці inode при дрібних запитах вводу/вывода.

Оптимізація призвела до того, що через зниження дискової активності ентропія для генератора випадкових чисел getrandom() почала накопичуватися повільніше і в деяких конфігураціях при певному збігу обставин могли спостерігатися підвисання під час завантаження до заповнення пулу ентропії. Так як оптимізація дійсно корисна, серед розробників виникла дискусія, в якій пропонувалося усунути проблему за рахунок відключення за замовчуванням режиму роботи виклику getrandom() з додаванням опціонального прапора для очікування ентропії, але подібна зміна вплине на якість випадкових чисел на початковому етапі завантаження.

У нову версію прийнято 15794 виправлень від 1974 розробників,
розмір патча - 92 Мб (зміни торкнулися 13986 файлів, додано 258419 рядків коду,
видалено 599137 рядків). Близько 39% усіх представлених у 5.3
змін пов'язані з драйверами пристроїв, приблизно 12% змін мають
ставлення до оновлення коду специфічного для апаратних архітектур, 11%
пов'язано з мережевим стеком, 3% - файловими системами та 3% з внутрішніми
підсистемами ядра.

Основні нововведення:

  • Пам'ять та системні сервіси
    • Продовжено розвиток функціональності pidfd, що допомагає обробляти ситуації з повторним використанням PID (pidfd зв'язується з конкретним процесом і не змінюється, в той час як PID може бути прив'язаний до іншого процесу після завершення поточного процесу, асоційованого з цим PID). Раніше в ядро ​​вже було додано
      системний виклик pidfd_send_signal() та прапор CLONE_PIDFD у виклику clone(), що дозволяє отримати pidfd для використання у idfd_send_signal(). При використанні виклику clone() з прапором CLONE_PIDFD могли виникати проблеми із сервісними менеджерами або системою примусового завершення процесів при нестачі пам'яті на платформі Android. У цьому випадку для запуску використовується виклик fork() або clone() без CLONE_PIDFD.

      У ядрі 5.3 наведено системний виклик pidfd_open(), що дозволяє отримати pidfd, що перевіряється, для довільного існуючого процесу, створеного не через виклик clone() з прапором CLONE_PIDFD. Також додано підтримку полілінгу pidfd за допомогою poll() і epoll(), що дозволяє в менеджерах процесів відстежувати завершення довільних процесів, не побоюючись стану гонки у разі присвоєння PID новому процесу. Механізм повідомлення про завершення роботи процесу, пов'язаного з pidfd, аналогічний до інформування про завершення свого дочірнього процесу;

    • У планувальник завдань додано підтримку механізму закріплення навантаження (Utilization clamping), що дозволяє дотримуватися мінімального або максимального діапазонів частот, залежно від активних на CPU завдань. Представлений механізм прискорює завдання, які впливають на якість взаємодії з користувачем, через запуск цих завдань як мінімум у нижній межі «запитаної» частоти. Низькопріоритетні завдання, які не позначаються на роботі користувача, запускаються з використанням верхнього ліміту «дозволеної» частоти. Ліміти задаються через атрибути sched_uclamp_util_min та sched_uclamp_util_max у системному виклику sched_setattr().
    • Додано підтримку технології управління енергоспоживанням Intel Speed ​​Select, доступною на деяких серверах із процесорами Intel Xeon. Зазначена технологія дозволяє встановлювати налаштування продуктивності та пропускної спроможності розділів для різних ядер CPU, що дозволяє зробити більш пріоритетною продуктивність для завдань, що виконуються на певних ядрах, жертвуючи продуктивністю на інших ядрах;
    • Процесів у просторі користувача надана можливість очікування протягом невеликого часу без використання циклів за допомогою umwait інструкції. Дана інструкція, разом з інструкціями umonitor і tpause, буде запропонована в чіпах Intel «Tremont», що готуються до випуску, і дозволить реалізовувати затримки, ефективні з точки зору енергоспоживання і не впливають на продуктивність інших потоків при використанні Hyper Threading;
    • Для архітектури RISC-V додано підтримку великих сторінок пам'яті (huge pages);
    • У механізм трасування «kprobes» додано можливість розіменування покажчиків ядра в простір користувача, що може застосовуватися, наприклад, для оцінки вмісту структур, що передаються системними викликами. Також додано можливість встановлення перевірок на етапі завантаження.
    • У файл конфігурації додано опцію PREEMPT_RT для роботи в режимі реального часу. Сам код для підтримки режиму реального часу поки не доданий в ядро, але поява опції є гарним знаком, що багаторічна епопея по інтеграції патчів Realtime-Preempt наближається до фіналу;
    • Додано системний виклик clone3() з реалізацією більш розширюваного варіанта інтерфейсу clone(), що допускає вказівку більшої кількості прапорів;
    • Доданий обробник bpf_send_signal(), що дозволяє BPF-програм відправляти сигнали довільним процесам;
    • Для подій perf в оточенні гіпервізора KVM доданий новий механізм фільтрації подій, що дозволяє адміністратору визначити типи подій, припустимі або неприпустимі для моніторингу на стороні гостьової системи;
    • У механізм верифікації eBPF-додатків додано можливість обробки програм із циклами, якщо виконання циклу обмежене і не може призвести до перевищення ліміту на максимальну кількість інструкцій;
  • Дискова підсистема, введення/виведення та файлові системи
    • Для файлової системи XFS реалізовано можливість багатопоточного обходу inode (наприклад, під час перевірки квот). Додані нові ioctl BULKSTAT та INUMBERS, що надають доступ до можливостей, що з'явилися у п'ятій редакції формату ФС, таким як час народження inode та можливість завдання параметрів BULKSTAT та INUMBERS для кожної групи AG (Allocation Groups);
    • У Ext4 додано підтримку пустот у каталогах (не прив'язаних блоків).
      Забезпечено обробку прапора "i" (immutable) для відкритих файлів (заборона запису в ситуації, якщо прапор був встановлений у момент, коли файл вже був відкритий);

    • Btrfs забезпечено визначення швидкої реалізації crc32c на всіх архітектурах;
    • У CIFS з коду підтримки smbdirect знято ознаку експериментальної розробки. У SMB3 додано можливість використання криптоалгоритмів у режимі GCM. Додано нову опцію монтування для вилучення параметрів режиму із записів ACE (Access Control Entry). Оптимізовано продуктивність виклику open();
    • У F2FS додано опцію для обмеження збирача сміття під час роботи в режимі checkpoint=disable. Доданий ioctl для видалення діапазонів блоків F2FS, що дозволяє реалізувати коригування розміру розділу на льоту. Додана можливість розміщення у F2FS файлу підкачки із забезпеченням прямого введення/виводу. Для всіх користувачів додано підтримку закріплення файлу та виділення блоків для подібних файлів;
    • В інтерфейс для асинхронного введення/виведення io_uring додано підтримку асинхронних операцій sendmsg() та recvmsg();
    • У файлову систему UBIFS додано підтримку стиснення з використанням алгоритму zstd та можливість верифікації підписаних образів ФС;
    • У ФС Ceph додано підтримку міток безпеки SELinux для файлів;
    • Для NFSv4 реалізована нова опція монтування «nconnect=», визначальна кількість встановлених із сервером з'єднань. Трафік між цими з'єднаннями буде розподілятися за допомогою балансування навантаження. Крім того, сервер NFSv4 тепер створює каталог /proc/fs/nfsd/clients з інформацією про поточних клієнтів, включаючи відомості про відкриті ними файли;
  • Віртуалізація та безпека
    • До складу ядра включено гіпервізор для вбудованих пристроїв ACRN, який написаний з огляду на готовність до виконання завдань реального часу та придатність до використання у критично важливих системах. ACRN забезпечує мінімальні накладні витрати, гарантує низькі затримки (low latency) та адекватну чуйність при взаємодії з обладнанням. Підтримується віртуалізація ресурсів CPU, введення/виводу, мережної підсистеми, операцій із графікою та звуком. ACRN може застосовуватися для запуску декількох ізольованих віртуальних машин в електронних блоках управління, приладових панелях, автомобільних інформаційних системах, споживчих IoT-пристроїв та іншої техніки, що вбудовується;
    • У User-mode Linux доданий режим "подорожі в часі", що дозволяє сповільнити або прискорити час у віртуальному оточенні UML для спрощення налагодження пов'язаного з часом коду. Крім того доданий параметр
      time-travel-start, що дозволяє стартувати системний годинник із зазначеного моменту в epoch-форматі;

    • Додано нові опції командного рядка ядра «init_on_alloc» та «init_on_free», при вказівці яких включається обнулення виділених і звільняються областей пам'яті (заповнення нулями при malloc і free), що дозволяє посилити безпеку за рахунок додаткових витрат на ініціалізацію;
    • Додано новий драйвер virtio-iommu з реалізацією паравірталізованого пристрою, що дозволяє відправляти IOMMU-запити, такі як ATTACH, DETACH, MAP та UNMAP, поверх транспорту virtio без емуляції таблиць сторінок пам'яті;
    • Додано новий драйвер virtio-pmem, що представляє доступ до пристроїв зберігання, відображених у фізичному адресному просторі, таким як NVDIMM;
    • Реалізовано можливість прикріплення криптографічних ключів до користувача або мережного простору імен (ключі стають недоступними за межами обраного простору імен), а також захисту ключів за допомогою ACL;
    • У криптопідсистему додано підтримка дуже швидкого алгоритму некриптографічного хешування xxhashшвидкість якого впирається в продуктивність пам'яті;
  • Мережева підсистема
    • Забезпечена обробка адрес IPv4 в діапазоні 0.0.0.0/8, який раніше був недоступний для використання. Введення цієї підмережі дозволить розподілити ще 16 млн. адрес IPv4;
    • У Netfilter для nftables додано підтримка механізмів апаратного прискорення фільтрації пакетів за рахунок застосування доданого до драйверів Flow Block API. На бік мережних адаптерів можуть виноситися цілі таблиці правил із усіма ланцюжками. Увімкнення здійснюється через прив'язку прапора NFT_TABLE_F_HW до таблиці. Підтримуються прості метадані протоколів 3 та 4 рівнів, дії прийняти/відкинути, зіставлення по IP та мережевих портах відправника/одержувача та типу протоколу;
    • Додана вбудована підтримка відстеження з'єднань для мережних мостів, що не вимагає застосування емулюючого прошарку br_netfilter;
    • У nf_tables додано підтримка модуля SYNPROXY, що повторює аналогічну функціональність з iptables, а також реалізована можливість перевірки в правилах окремих опцій в заголовку IPv4;
    • Додано можливість прикріплення BPF-програм до системних викликів setsockopt() та getsockopt(), що, наприклад, дозволяє прикріпити свої обробники доступу до цих викликів. Крім того, додано нову точку виклику (hook), за допомогою якої можна організувати виклик BPF-програми один раз за кожен інтервал RTT (round-trip-time, час пінгу);
    • Для IPv4 та IPv6 доданий Новий механізм зберігання даних маршрутизації nexthop, орієнтований на збільшення масштабованості таблиць маршрутизації. Проведені тести показали, що при використанні нової системи набір у 743 тисячі маршрутів був завантажений в ядро ​​всього за 4.3 секунди;
    • Для Bluetooth реалізована функціональність, необхідна підтримки LE ping;
  • Обладнання
    • Додана підтримка x86-сумісних процесорів компанії Жаоксин, що розвиваються в результаті спільного проекту VIA Technologies та муніципалітету Шанхаю. Сімейство CPU ZX побудовано на базі архітектури x86-64 Isaiah, що продовжує розвиток технологій. VIA Centaur;
    • У підсистему DRM (Direct Rendering Manager), а також у графічні драйвери amdgpu та i915, додано підтримку розбору, обробки та відправлення через HDMI-порт метаданих HDR (розширений динамічний діапазон), що дозволяє використовувати HDR-панелі та екрани, здатні відображати додаткові діапазони яскравості ;
    • До драйвера amdgpu додано початкову підтримку GPU AMD NAVI (RX5700), яка включає базовий драйвер, код для взаємодії з екранами (DCN2), підтримку GFX та обчислень (GFX10),
      SDMA 5 (System DMA0), засоби керування живленням та мультимедійні кодувальники/декодувальники (VCN2). В amdgpu також покращено підтримку карт на базі GPU Vega12 і Vega20, для яких додані додаткові можливості управління пам'яттю та енергоспоживанням;

    • У драйвер amdkfd (для дискретних GPU, такі як Fiji, Tonga, Polaris) додано підтримку карт на базі GPU VegaM;
    • У DRM-драйвері для відеокарт Intel для чипів Icelake реалізований новий мультисегментний режим гамма-корекції. Додано можливість виводу через DisplayPort у форматі YCbCr4:2:0. Додані нові прошивки GuC для SKL, BXT, KBL, GLK та ICL. Реалізовано можливість вимкнення живлення екрана в асинхронному режимі. Додана підтримка збереження та відновлення контексту рендерингу для чіпів Ironlake (gen5) та gen4 (Broadwater - Cantiga), що дозволяє з простору користувача відновлювати стан GPU при переході від виконання одних пакетних операцій до інших;
    • У драйвері Nouveau забезпечено визначення чіпсету NVIDIA Turing TU116;
    • Розширено можливості DRM/KMS-драйвера для прискорювачів екранних операцій ARM Komeda (Mali D71), додано підтримку масштабування, поділу/злиття шарів, повороту, відкладеного запису, AFBC, SMMU та форматів кодування кольору Y0L2, P010, YUV420_8/10B;
    • У драйвер MSM додано підтримку серії A540 GPU Adreno, що застосовується в процесорах Qualcomm, а також підтримка DSI-контролера MSM8998 для Snapdragon 835;
    • Додано драйвери для LCD-панелей Samsung S6E63M0, Armadeus ST0700, EDT ETM0430G0DH6, OSD101T2045-53TS,
      Evervision VGG804821, FriendlyELEC HD702E, KOE tx14d24vm1bpa, TFC S9700RTWV43TR-01B, EDT ET035012DM6 та VXT VL050-8048NT-C01;

    • доданий драйвер для залучення засобів прискорення декодування
      відео, доступних у SoC Amlogic Meson;

    • У драйвері v3d (для GPU Broadcom Video Core V, який використовується в Raspberry Pi) з'явилася підтримка диспетчеризації обчислювальних шейдерів;
    • доданий драйвер для SPI-клавіатур та трекпадів, які застосовуються в сучасних моделях ноутбуків Apple MacBook та MacBookPro;
    • Додана додатковий захист ioctl-дзвінків, пов'язаних з драйвером floppy, а сам драйвер позначений як залишений без супроводу
      («orphaned»), що передбачає припинення його тестування. Драйвер поки що зберігається в ядрі, але його коректна робота не гарантується. Драйвер розглядається як застарілий, тому що для його тестування важко знайти працююче обладнання - всі актуальні зовнішні накопичувачі зазвичай використовують інтерфейс USB.

    • доданий cpufreq-драйвер для плат Raspberry Pi, що дозволяє динамічно керувати зміною частоти процесора;
    • Додана підтримка нових ARM SoC Mediatek mt8183 (4x Cortex-A73 + 4x Cortex-A53), TI J721E (2x Cortex-A72 + 3x Cortex-R5F + 3 DSPs + MMA) та Amlogic G12B (4x Cortex-A73 + 2 ), а також плат:
      • 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.

Одночасно Латиноамериканський Фонд вільного ПЗ сформував
варіант повністю вільного ядра 5.3 - Linux-libre 5.3-gnu, очищеного від елементів прошивок та драйверів, що містять невільні компоненти або ділянки коду, сфера застосування яких обмежена виробником. У новому випуску відключено завантаження блобів у драйверах qcom, hdcp drm, allegro-dvt та meson-vdec.
Оновлено код чищення блобів у драйверах та підсистемах amdgpu, i915, netx, r8169, brcmfmac, rtl8188eu, adreno, si2157, pvrusb2, touchscreen_dmi, звуковому драйвері для skylake, а також у документ.

Джерело: opennet.ru

Додати коментар або відгук