dovidnyk.in.ua

Представлений реліз ядра Linux 5.16



Понеділок 10 Січ 2022

Представлений реліз ядра 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 – на 30%). Спочатку в ядрі була використана окрема реалізація zstd, заснована на версії 1.3.1, випущеної більше трьох років тому і не включає багато важливих оптимізації. Крім переходу на актуальну версію, доданий патч також спрощує синхронізацію з 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 Tep2 ALC5682I-VS, RT5682S, RT9120, Rockchip RV1126 та RK3568. Доданий драйвер 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 5s 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 , RK3399 ROCK Pi 4A+, RK3399 ROCK Pi 4B+, Firefly ROC-RK3328-PC, Firefly ROC-RK3399-PC-PLUS, ASUS ChromeBook Tablet CT100 , Xilinx Kria, Radxa Zero, JetHub D1/H1, Netronix E70K02.

 

Джерело: OpenNet

Переглядів: 476

Схожі статті