Реліз ядра Linux 5.16

Після двох місяців розробки Лінус Торвальдс презентував реліз ядра Linux 5.16. Серед найбільш помітних змін: системний виклик futex_waitv для підвищення продуктивності Windows-ігор у Wine, відстеження помилок у ФС через fanotify, концепція фоліантів у системі керування пам'яттю, підтримка процесорних інструкцій AMX, можливість резервування пам'яті за мережними сокетами, підтримка у netfilter класифікації пакетів «egress», задіяння підсистеми DAMON для запобігання витіснення незатребуваних областей пам'яті, поліпшення обробки перевантажень при великому обсязі операцій запису, підтримка багатопривідних жорстких дисків.

У нову версію прийнято 15415 виправлень від 2105 розробників, розмір патчу - 45 МБ (зміни торкнулися 12023 файлів, додано 685198 рядків коду, видалено 263867 рядків). Близько 44% всіх представлених у 5.16 змін пов'язані з драйверами пристроїв, приблизно 16% змін стосуються оновлення коду, специфічного для апаратних архітектур, 16% пов'язано з мережевим стеком, 4% — з файловими системами і 4% з внутрішніми підсистемами ядра.

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

  • Дискова підсистема, введення/виведення та файлові системи
    • У механізм fanotify додані засоби для моніторингу за станом файлової системи та відстеження виникнення помилок. Інформація про помилки передається за допомогою нового типу подій — FAN_FS_ERROR, які можуть перехоплюватися в системах моніторингу, що виконуються в просторі користувача, для оперативного інформування адміністратора або запуску процесів відновлення. При каскадному виникненні серії помилок fanotify забезпечує доставку повідомлення про першу помилку разом із загальним лічильником проблем для спрощення подальшого розбору причин збою. Підтримка відстеження помилок поки що реалізована лише для ФС Ext4.
    • Поліпшено обробку перевантажень при виконанні операцій запису (write congestion), що виникають коли обсяг операцій запису перевищує пропускну здатність накопичувача і система змушена блокувати запити процесу на запис до завершення виконання вже переданих запитів. У новій версії повністю перероблений механізм ядра, що використовується для отримання інформації про виникнення перевантаження і блокування завдань, так як у старій реалізації спостерігалися проблеми з поєднанням обробки перевантаження запису з витіснення сторінок пам'яті в розділ підкачки при нестачі пам'яті в системі.
    • В Btrfs реалізована підтримка технології зонування пристроїв (Zoned Namespace), що застосовується в жорстких дисках або NVMe SSD для поділу простору для зберігання на зони, що становлять групи блоків або секторів, які допускається лише послідовне додавання даних з оновленням цілої групи блоків. Крім того, внесені невеликі оптимізації логування inode, що дозволили досягти підвищення пропускної спроможності в тесті dbench на 3% і скоротити затримки на 11%. Перероблено механізм логування каталогів, у якому для підвищення ефективності скорочено кількість операцій пошуку та блокувань у дереві. Прискорено вставку елементів у структуру btree у пакетному режимі (час масової вставки елементів скоротився на 4%, а видалення на 12%). Додано обмежену підтримку використання стиснення під час запису неповних сторінок, а також можливість дефрагментації підсторінок (subpage). Проведено підготовку для включення підтримки другої версії протоколу для команди «send».
    • У файловій системі XFS скорочено споживання пам'яті за рахунок використання окремих кешів slab для часто використовуваних елементів та скорочення деяких структур даних.
    • У файловій системі Ext4 відзначено лише виправлення помилок та точніше обчислення параметрів відкладеної ініціалізації таблиці Inode.
    • На рівні блокових пристроїв реалізовані оптимізації, що дозволяють суттєво підвищити ефективність прив'язки операцій до ядра CPU.
    • Додана початкова підтримка жорстких дисків з кількома незалежними приводами (multi-actuator), що дають можливість одночасно звертатися до кількох секторів у різних зонах магнітної пластини.
    • Додано нову ioctl-команда CDROM_TIMED_MEDIA_CHANGE для визначення подій зміни носія у приводі оптичних дисків.
    • У файлову систему EROFS (Enhanced Read-Only File System) додано можливість роботи поверх кількох пристроїв зберігання. Різні пристрої можуть бути відображені в один 32-розрядний адресний простір блоків. Також додано підтримку стиснення з використанням алгоритму LZMA.
    • У ФС F2FS додані опції монтування для керування фрагментуванням файлів при розміщенні у сховищі (наприклад, для налагодження оптимізації роботи з фрагментованими сховищами).
    • У CEPH включені за замовчуванням операції створення та видалення каталогів в асинхронному режимі (для повернення старої поведінки слід при монтуванні використовувати прапор '-o wsync'). Додано ведення метрик, що відстежують операції копіювання зовнішніх об'єктів.
    • У CIFS доданий параметр монтування tcpnodelay, при якому для мережного сокету виставляється режим tcp_sock_set_nodelay, що відключає очікування заповнення черги TCP-стеку. Додано підтримку вкладених DFS Link (Distributed File System) при перемонтуванні.
    • Додано підтримку завершення запитів до блокового пристрою в пакетному режимі. Тестування зміни показало збільшення інтенсивності виконання операцій випадкового читання з накопичувачів Optane з 6.1 до 6.6 млн IOPS на одному ядрі CPU.
  • Пам'ять та системні сервіси
    • Додано новий системний виклик futex_waitv, що дозволяє відстежувати стан одразу кількох ф'ютексів за допомогою одного системного виклику. Зазначена можливість нагадує доступну в Windows функціональність WaitForMultipleObjects, емуляція якої через futex_waitv може бути корисною підвищення продуктивності Windows-ігор, що запускаються під керуванням Wine або Proton. Крім того, одночасне очікування ф'ютексів може застосовуватися і для оптимізації продуктивності рідних збірок ігор для Linux.
    • Реалізовано концепцію фоліантів сторінок пам'яті (page folios), використання якої у деяких підсистемах ядра дозволить прискорити керування пам'яттю при типових навантаженнях. В даний час на фоліанти вже переведено основну підсистему управління пам'яттю в ядрі та реалізацію сторінкового кешу, а в майбутньому намічено переклад файлових систем. Надалі в ядрі також планується додати підтримку багатосторінкових фоліантів.

      Фоліанти нагадують об'єднані сторінки пам'яті (compound pages), але відрізняються покращеною семантикою та більш зрозумілою організацією роботи. Для керування системною пам'яттю доступне ОЗП поділяється на сторінки пам'яті, розмір яких залежить від архітектури, але на системах x86 обчислюється кілобайтами (зазвичай 4096 байт). Сучасні системи комплектуються десятками гігабайт ОЗУ, що призводить до ускладнення управління пам'яттю через необхідність обробки величезної кількості сторінок пам'яті. Для скорочення числа сторінок раніше в ядрі було реалізовано концепцію об'єднаних сторінок (compound pages) зі структурами, що охоплюють більш ніж одну фізичну сторінку пам'яті. Але API для маніпуляції об'єднаних сторінками пам'яті залишав бажати кращого і призводив до додаткових витрат.

    • У планувальник завдань додано обробник, що враховує кластеризацію кешу в CPU. У деяких процесорах, таких як Kunpeng 920 (ARM) та Intel Jacobsville (x86), певна кількість ядер CPU, зазвичай 4, може поєднувати L3 або L2 кеш. Облік подібних топологій може значно підвищити ефективність розподілу завдань по ядрам CPU у планувальнику завдань, оскільки переміщення завдань у межах одного кластера CPU дозволяє підвищити пропускну здатність звернення до пам'яті та знизити конкуренцію у кеші.
    • Додано підтримку інструкцій AMX (Advanced Matrix Extensions), реалізованих у майбутніх серверних процесорах Intel Xeon Scalable, що розвиваються під кодовим ім'ям Sapphire Rapids. AMX пропонує нові регістри TMM «TILE», що настроюються, і інструкції для маніпуляції з даними в цих регістрах, такі як TMUL (Tile matrix MULtiply) для множення матриць.
    • Реалізовано кілька нових можливостей, заснованих на доданій у минулому випуску підсистемі DAMON (Data Access MONitor), що дозволяє відстежувати доступ до даних в оперативній пам'яті, у прив'язці до обраного процесу, що працює у просторі користувача. Наприклад, підсистема дає можливість проаналізувати до яких саме областей пам'яті звертався процес за весь час своєї роботи, а які області пам'яті залишилися незатребуваними.
      • DAMON_RECLAIM для виявлення та витіснення областей пам'яті, до яких не було звернень. Механізм можна використовувати для запобігання м'якому витіснення сторінок пам'яті в умовах наближення до вичерпання вільної пам'яті.
      • DAMOS (Data Access Monitoring-based Operation Schemes) для застосування заданих операцій madvise(), таких як вивільнення додаткової вільної пам'яті до областей пам'яті процесу, для яких фіксується певна частота звернення до пам'яті. Налаштування параметрів DAMOS здійснюється через debugfs.
      • Можливість моніторингу за фізичним адресним простором пам'яті (раніше можна було відстежувати лише віртуальні адреси).
    • Реалізація алгоритму стиснення zstd оновлена ​​до версії 1.4.10, що дозволило помітно підняти продуктивність різних підсистем ядра, в яких застосовується стиснення (наприклад, розпакування образу ядра прискорена на 35%, продуктивність розпакування стиснутих даних у Btrfs і SquashFS підвищилася на ZRAM – на 15%). Спочатку в ядрі була використана окрема реалізація zstd, заснована на версії 30, випущеної більше трьох років тому і не містить багато важливих оптимізації. Крім переходу на актуальну версію, доданий патч також спрощує синхронізацію з upstream-гілкою zstd, дозволяючи генерувати код для включення в ядро ​​безпосередньо з основного репозиторію zstd. У майбутньому код zstd в ядрі планують оновлювати з виходом нових версій бібліотеки zstd.
    • Внесено велику порцію поліпшень у підсистему eBPF. Додано можливість виклику з BPF-програм функцій модулів ядра. Реалізовано функцію bpf_trace_vprintk(), на відміну від bpf_trace_printk(), що дозволяє виводити разом більше трьох аргументів. Додано нову структуру зберігання даних (BPF map) bloom filter, що дозволяє використовувати однойменну ймовірну структуру даних для визначення наявності елемента в наборі. Додано новий атрибут BTF_KIND_TAG, який може застосовуватися в BPF-програмах для прив'язки тегів до параметрів функцій, наприклад, для спрощення виявлення помилок у програмах користувача. У libbpf дозволено створення власних секцій .rodata.*/.data.*, реалізовано підтримку подій трасування uprobe і kprobe, додано API для копіювання всіх типів BTF з одного об'єкта на інший. Підтримка AF_XDP винесена з libbpf до окремої бібліотеки libxdp. Для архітектури MIPS реалізовано JIT-компілятор для віртуальної машини BPF.
    • Для архітектури ARM64 реалізовано підтримку розширень ARMv8.6 для таймера, у тому числі що дозволяють забезпечити самосинхронізацію представлення системних регістрів без застосування інструкцій ISB.
    • Для архітектури PA-RISC реалізовано можливість застосування механізму KFENCE для виявлення помилок при роботі з пам'яттю, а також додано підтримку детектора станів гонки KCSAN.
    • Надано можливість налаштування прав доступу до tracefs на рівні окремих користувачів та груп, наприклад, тепер можна дозволити доступ до засобів трасування лише учасникам певної групи.
  • Віртуалізація та безпека
    • У підсистемах io_uring та device-mapper реалізовано підтримку генерації подій аудиту. У io_uring надано можливість керування доступом через модулі LSM. Додано можливість аудиту системного виклику openat2().
    • Код ядра повністю позбавлений безперервних виразів case в switch (без return або break після кожного блоку case). При складанні ядра тепер можна буде застосовувати режим "-Wimplicit-fallthrough".
    • Увімкнені зміни для посилення перевірок кордонів під час виконання функції memcpy().
    • В інтерфейсі асинхронного введення/виведення io_uring реалізована можливість застосування до операцій введення/виведення політик безпеки, що визначаються модулями SELinux та Smack.
    • У підсистемі IMA (Integrity Measurement Architecture), що дозволяє зовнішньому сервісу верифікувати стан підсистем ядра для того щоб переконатися в їхній справжності, реалізована можливість застосування правил на основі ідентифікатора групи (GID) до якої належить файл або в яку користувач входить до файлу.
    • Відключено за замовчуванням деякі розширені механізми захисту потоків seccomp() від атак класу Spectre, які були розцінені як зайві та помітно не підвищують безпеку, але негативно впливають на продуктивність. Переглянуто застосування захисту Retpoline.
    • Видалено реалізацію механізму cryptoloop, на зміну якому в 2004 році прийшов dm-crypt і при необхідності підтримує ті ж алгоритми.
    • За промовчанням заборонено непривілейований доступ до підсистеми eBPF. Зміна внесена для запобігання використанню BPF-програм для обходу захисту від атак сторонніми каналами. За потреби адміністратор може повернути можливість використання eBPF непривілейованими користувачами.
    • В гіпервізор ACRN, розрахований на виконання завдань реального часу та використання в критично важливих системах, додано підтримку створення/видалення віртуальних пристроїв та прокидання пристроїв MMIO.
    • У криптодвижок додано підтримку визначень KPP (Key-agreement Protocol Primitives), які спрощують логіку розробки драйверів для криптосистем.
    • Для гіпервізора Hyper-V реалізовано підтримку режиму ізоляції віртуальних машин, що передбачає шифрування вмісту пам'яті.
    • У гіпервізорі KVM додано підтримку архітектури RISC-V. Реалізовано можливість міграції всередині хост-оточення віртуальних машин, що виконуються з використанням розширень AMD SEV та SEV-ES. Додано API для live-міграції гостьових систем, що шифруються за допомогою AMD SEV (Secure Encrypted Virtualization).
    • Для архітектури PowerPC за замовчуванням включено режим STRICT_KERNEL_RWX, який блокує використання сторінок пам'яті, одночасно доступних на запис та виконання.
    • На 32-розрядних системах x86 припинено підтримку гарячого підключення пам'яті (Memory hotplug), яка більше року перебувала в неробочому стані.
    • З ядра виключена бібліотека liblockdep, яка тепер супроводжуватиметься окремо від ядра.
  • Мережева підсистема
    • Для сокетів реалізовано нову опцію SO_RESERVE_MEM, за допомогою якої можна зарезервувати для сокету певний обсяг пам'яті, який завжди залишиться доступним для сокету і не буде вилучено. Використання даної опції дозволяє домогтися збільшення продуктивності рахунок скорочення в мережевому стеку операцій виділення і повернення пам'яті, особливо у разі нестачі пам'яті у системі.
    • Додана підтримка протоколу автоматичного тунелювання multicast-трафіку (Automatic Multicast Tunneling, RFC 7450), що дозволяє доставляти multicast-трафік із мереж, що підтримують Multicast, одержувачам у мережах без Multicast. Протокол працює через інкапсуляцію у пакети UDP.
    • Поліпшено інкапсуляцію даних IOAM (In-situ Operations, Administration, and Maintenance) у транзитні пакети.
    • У ethtool netlink API додано можливість керування режимами енергоспоживання приймачів.
    • У підсистемі netfilter реалізовано можливість класифікації пакетів лише на рівні egress, тобто. на стадії, коли драйвер отримує пакет від мережевого стека ядра. У nftables підтримка відповідних фільтрів з'явилася у версії 1.0.1. У netfilter додано можливість зіставлення та зміни внутрішніх заголовків та даних для UDP та TCP (inner header/payload), що йдуть після транспортного заголовка (transport header).
    • Додані нові sysctl-параметри arp_evict_nocarrier та ndisc_evict_nocarrier при установці яких кеш ARP та таблиця ndisc (neighbor discovery) будуть очищатися у разі обриву зв'язку (NOCARRIER).
    • У механізм керування мережними чергами fq_codel (Сontrolled Delay) додані режими Low Latency, Low Loss та Scalable Throughput (L4S).
  • Обладнання
    • У драйвері amdgpu реалізована початкова підтримка специфікації DP 2.0 (DisplayPort 2.0) та можливості тунелювання DisplayPort через USB4. Для APU Cyan Skillfish (оснащені GPU Navi 1x) додано підтримку контролерів дисплея. Розширено підтримку APU Yellow Carp (мобільні процесори Ryzen 6000 «Rembrandt»).
    • У драйвері i915 стабілізовано підтримку чіпів Intel Alderlake S та реалізовано підтримку технології Intel PXP (Protected Xe Path), що дозволяє організувати роботу апаратно захищеного графічного сеансу на системах з чіпами Intel Xe.
    • У драйвері nouveau проведено роботу з виправлення помилок та поліпшення стилю оформлення коду.
    • Додана підтримка x86-сумісних CPU Vortex (Vortex86MX). Linux на подібних процесорах працював і раніше, але явна ідентифікація зазначених CPU була потрібна для відключення захисту від атак Spectre/Meltdown, які не застосовні до зазначених чіпів.
    • Додана початкова підтримка x86-платформ Surface Pro 8 та Surface Laptop Studio.
    • Доданий драйвер для підтримки звукових чіпів, що використовуються в APU AMD Yellow Carp, Van Gogh, також додано підтримку звукових систем та кодеків Cirrus CS35L41, Maxim MAX98520/MAX98360A, Mediatek MT8195, Nuvoton NAU8821, NVIDIA Teo210. ALC8I-VS, RT5682S, RT5682, Rockchip RV9120 та RK1126.
    • Доданий драйвер ishtp_eclite для доступу до вбудованих контролерів Intel PSE (Programmable Service Engine) за допомогою протоколу ISHTP (Integratd Sensor Hub Transport Protocol), наприклад, для отримання даних про акумулятор, температуру та інформацію, пов'язану з UCSI (USB Type-C Connector System Software) Interface).
    • Доданий драйвер для ігрових контролерів Nintendo Switch, що підтримує пристрої Switch Pro та Joy-Cons. Додана підтримка планшетів Wacom Intuos BT (CTL-4100WL/CTL-6100WL) та клавіатури Apple 2021 Magic Keyboard. Поліпшено підтримку контролерів Sony PlayStation DualSense. Додано підтримку бічних кнопок миші Xiaomi Mi.
    • Додано драйвер RT89 з підтримкою бездротових чіпів Realtek 802.11ax, а також драйвери для Ethernet-адаптерів Asix AX88796C-SPI та комутаторів Realtek RTL8365MB-VC.
    • Для чіпів Apple M1 додані драйвери для PCI та PASemi i2c.
    • Додана підтримка ARM SoС, пристроїв та плат Raspberry Pi Compute Module 4, Fairphone 4, Snapdragon 690, LG G Watch R, Sony Xperia 10 III, Samsung Galaxy S4 Mini Value Edition, Xiaomi MSM8996 (Mi 5, Mi Note 2, Mi 5 Mi Mix, Mi 5s Plus і Xiaomi Mi 5), Sony Yoshino (Sony Xperia XZ1, Sony Xperia XZ Premium), F(x)tec Pro1 QX1000, Microchip LAN966, CalAmp LMU5000, Exegin Q5xR5, sama7g5, Samsung ExynosAuto , RK9 Rock Pi 3566A+, RK3399 Rock Pi 4B+, Firefly ROC-RK3399-PC, Firefly ROC-RK4-PC-PLUS, ASUS Chromebook Tablet CT3328, Pine3399 Quartz100-A, Netgear GR 64G64, Renesas R110A7040M* , Xilinx Kria, Radxa Zero, JetHub D32/H2, Netronix E8K779.

Джерело: opennet.ru

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