Реліз ядра Linux 5.9

Після двох місяців розробки Лінус Торвальдс представив реліз ядра Linux 5.9. Серед найбільш помітних змін: обмеження імпорту символів з пропрієтарних модулів у GPL-модулі, прискорення операцій перемикання контексту за допомогою процесорної інструкції FSGSBASE, підтримка стиснення образу ядра за допомогою Zstd, переробка розстановки пріоритетів потоків в ядрі, підтримка протоколу PRP (Parallel Red) , планування з урахуванням пропускної спроможності в планувальнику deadline, попереджувальна упаковка сторінок пам'яті, capability-прапор CAP_CHECKPOINT_RESTOR, системний виклик close_range(), підвищення продуктивності dm-crypt, видалення коду для 32-розрядних гостьових систем Xen PV «rescue» у Btrfs, підтримка inline-шифрування в ext4 та F2FS.

У нову версію прийнято 16074 виправлення від 2011 розробників,
розмір патча - 62 МБ (зміни торкнулися 14548 файлів, додано 782155 рядків коду, видалено 314792 рядки). Близько 45% всіх представлених у 5.9
змін пов'язані з драйверами пристроїв, приблизно 15% змін мають
ставлення до оновлення коду, специфічного для апаратних архітектур, 13%
пов'язано з мережевим стеком, 3% - з файловими системами та 3% з внутрішніми
підсистемами ядра.

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

  • Пам'ять та системні сервіси
    • Посилена захист від використання GPL-прошарків для зв'язування пропрієтарних драйверів з компонентами ядра, які експортуються тільки для модулів під ліцензією GPL. Прапор TAINT_PROPRIETARY_MODULE тепер успадковуються у всіх модулях, що імпортують символи з модулів з цим прапором. Якщо GPL-модуль спробує імпортувати символи з не-GPL модуля, цей GPL-модуль успадкує мітку TAINT_PROPRIETARY_MODULE і не зможе звертатися до компонентів ядра, доступних тільки для модулів під ліцензією GPL, навіть якщо модуль раніше імпортував символи з категорії «gplonly». Зворотне блокування (експорт тільки EXPORT_SYMBOL_GPL у модулях, що імпортували EXPORT_SYMBOL_GPL), яке могло порушити роботу пропрієтарних драйверів, не реалізовано (успадковується лише прапор пропрієтарного модуля, але не GPL-прив'язки).
    • Додана підтримка механізму kcompactd для попереджувальної упаковки сторінок пам'яті у фоновому режимі, що дозволяє збільшити кількість великих сторінок пам'яті, доступних ядру. За попередньою оцінкою, фонова упаковка ціною мінімальних накладних витрат дозволяє в 70-80 разів знизити затримки при виділенні великих сторінок пам'яті (huge-page) в порівнянні з механізмом упаковки, що раніше застосовувався, запускається при виникненні необхідності (on-demand). Для завдання меж зовнішньої фрагментації, яку буде забезпечувати kcompactd, доданий sysctl vm.compaction_proactiveness.
    • Додана підтримка стиснення образу ядра з використанням алгоритму Зстандарт (ZSTD).
    • Для систем x86 реалізовано підтримку процесорної інструкції FSGSBASE, що дозволяє читати та змінювати вміст регістрів FS/GS з простору користувача. У ядрі FSGSBASE використовується для прискорення операцій перемикання контексту за рахунок виключення зайвих операцій запису MSR для GSBASE, а в просторі користувача дозволяє обійтися без зайвих системних викликів для зміни FS/GS.
    • доданий параметр «allow_writes», що дозволяє заборонити зміни MSR-регістрів процесора з простору користувача та обмежити доступ до вмісту даних регістрів операціями читання, оскільки зміна MSR може призвести до проблем. За промовчанням запис поки не заборонено, а зміна MSR відображається в лозі, але в майбутньому планується перевести доступ за замовчуванням в режим читання.
    • В інтерфейс асинхронного введення/виводу io_uring додано повну підтримку асинхронних операцій буферизованого читання, що не вимагають залучення потоків ядра. Підтримка запису очікується у наступному випуску.
    • У планувальнику вводу/виводу deadline реалізовано планування з урахуванням пропускної спроможності, що дозволяє приймати коректні рішення на асиметричних системах, таких як системи ARM на базі архітектур DynamIQ і big.LITTLE, що комбінують в одному чіпі потужні і менш продуктивні енергоефективні ядра CPU. Зокрема, новий режим дозволяє уникнути неузгодженостей під час планування, коли повільне ядро ​​CPU не має належних ресурсів для виконання завдання у визначений термін.
    • Модель споживання енергії в ядрі (фреймворк Energy Model) описує як поведінка енергоспоживання CPU, а й охоплює периферійні устройства.
    • Реалізовано системний виклик close_range(), що дозволяє процесу разом закрити цілий діапазон відкритих файлових дескрипторів.
    • З реалізації текстової консолі та драйвера fbcon видалений код, що забезпечує можливість програмного прокручування тексту назад (CONFIG_VGACON_SOFT_SCROLLBACK) більш ніж обсяг відеопам'яті текстового режиму VGA.
    • Перероблено алгоритм призначення пріоритетів для потоків усередині ядра. Новий варіант забезпечує кращу узгодженість у всіх підсистемах ядра для призначення пріоритетів для завдань реального часу.
    • Доданий sysctl sched_uclamp_util_min_rt_default для керування параметрами форсування частоти CPU для задач реального часу (наприклад, можна на льоту змінювати поведінку при виконанні задач реального часу для економії енергії після переходу на живлення від акумулятора або мобільних систем).
    • Проведено підготовку до реалізації підтримки технології Transparent Huge Pages у сторінковому кеші.
    • У механізмі fanotify реалізовані нові прапори FAN_REPORT_NAME та FAN_REPORT_DIR_FID для передачі відомостей про батьківське ім'я та унікальний ідентифікатор FID при настанні подій створення, видалення або переміщення елементів каталогу та не пов'язаних з каталогами об'єктів.
    • Для cgroups реалізований новий контролер розподілу пам'яті slab (slab memory controller), який примітний перенесенням обліку slab з рівня сторінок пам'яті на рівень об'єктів ядра, що дає можливість спільно використовувати slab-сторінки в різних cgroup замість виділення окремих кешів slab для кожної cgroup. Запропонований підхід дозволяє підвищити ефективність використання slab, на 30-45% скоротити розмір пам'яті, що використовується для slab, значно зменшити загальне споживання пам'яті ядром і знизити фрагментацію пам'яті.
    • У звуковій підсистемі ALSA и USB-стеку, відповідно до нещодавно прийнятими рекомендаціями щодо використання інклюзивної термінології в ядрі Linux, проведено чищення неполіткоректних термінів. Код очищений від використання слів "slave", "master", "blacklist" та "whitelist".
  • Віртуалізація та безпека
    • При складанні ядра з використанням компілятора Clang з'явилася можливість налаштування (CONFIG_INIT_STACK_ALL_ZERO) автоматичної ініціалізації нульовим значенням всіх змінних, що зберігаються в стеку (при складанні вказується "-ftrivial-auto-var-init=zero") .
    • У підсистему seccomp, при використанні режиму контролю процесу у просторі користувача, додано можливість підстановки у відстежуваний процес файлових дескрипторів для повної емуляції системних викликів, що призводять до створення файлових дескрипторів. Функціональність затребувана в системах ізольованих контейнерів та реалізації sandbox для Chrome.
    • Для архітектур xtensa і csky додано підтримку обмеження системних викликів за допомогою підсистеми seccomp. Для xtensa додатково реалізовано підтримку механізму аудиту.
    • доданий новий capability-прапор CAP_CHECKPOINT_RESTORE, що дозволяє без передачі додаткових привілеїв надати доступ до можливостей, пов'язаних із заморожуванням та відновленням стану процесів.
    • У GCC 11 реалізовані всі можливості, необхідні для
      налагоджувального інструменту KCSAN (Kernel Concurrency Sanitizer), призначеного для динамічного виявлення станів гонки всередині ядра. Таким чином KCSAN тепер може використовуватися з ядрами, зібраними в GCC.

    • Для AMD Zen та нових моделей CPU додано підтримка технології P2PDMA, що дозволяє використовувати DMA для прямої передачі між пам'яттю двох пристроїв, підключених до шини PCI.
    • У dm-crypt доданий режим, що дозволяє скоротити затримки рахунок виконання криптографічної обробки даних без використання робочих черг. Вказаний режим також необхідний для коректної роботи з зонованими блоковими пристроями (пристрої з областями, які повинні записуватися послідовно з оновленням цілої групи блоків). Проведено роботу з підвищення пропускної спроможності та зменшення затримок у dm-crypt.
    • Видалено код для підтримки 32-розрядних гостьових систем, що працюють у режимі паравіртуалізації під керуванням гіпервізора Xen. Користувачам таких систем слід перейти на використання 64-розрядних ядер у гостьових оточеннях або використовувати для запуску оточень замість паравіртуалізації (PV) режими повної (HVM) або комбінованої (PVH) віртуалізації.
  • Дискова підсистема, введення/виведення та файлові системи
    • У файловій системі Btrfs реалізована опція монтування «rescue», що уніфікує доступ до всіх інших опцій відновлення. Видалено підтримку опцій «alloc_start» і «subvolrootid», оголошено застарілою опцію «inode_cache». Проведено оптимізацію продуктивності, особливо помітно прискорено виконання операцій fsync(). Додана можливість використання альтернативних типів контрольних сум, відмінних від CRC32c.
    • Додана можливість використання inline-шифрування (Inline Encryption) у файлових системах ext4 та F2FS, для включення якого передбачено опцію монтування «inlinecrypt». Режим inline-шифрування дозволяє використовувати вбудовані в контролер накопичувача механізми шифрування, які здійснюють прозоре шифрування і розшифровку вводу/виводу.
    • У XFS забезпечений скидання inode (flush) у повністю асинхронному режимі, який не блокує процеси при виконанні операції чищення пам'яті. Вирішено давню проблему з квотами, через яку некоректно відслідковувалися попередження про перевищення м'якого ліміту та обмежень на число inode. Уніфіковано реалізацію підтримки DAX для ext4 та xfs.
    • У Ext4 реалізована попереджувальне завантаження бітових карток розподілу блоків. У поєднанні з обмеженням сканування неініціалізованих груп оптимізація дозволила скоротити час монтування дуже великих розділів.
    • У F2FS доданий ioctl F2FS_IOC_SEC_TRIM_FILE, що дозволяє використовувати команди TRIM/discard для фізичного обнулення зазначених даних у файлі, наприклад, для видалення ключів доступу без осідання на накопичувачі залишкових даних.
      У F2FS також доданий новий режим складання сміття GC_URGENT_LOW, що працює агресивніше за рахунок виключення деяких перевірок знаходження у стані простою (idle) перед запуском збирача сміття.

    • У bcache розмір bucket_size для екстентів збільшений з 16 до 32 біт у рамках підготовки до забезпечення можливості застосування для кешу зонованих пристроїв.
    • У підсистему SCSI додано можливість використання inline-шифрування на базі вбудованих засобів апаратного шифрування, що надаються UFS-контролерами (Універсальна флеш-пам'ять).
    • Додано новий параметр командного рядка ядра "debugfs", що дозволяє керувати доступністю однойменної псевдо-ФС.
    • У клієнті NFSv4.2 забезпечено підтримку розширених атрибутів файлів (xattr).
    • У dm-dust доданий інтерфейс для виведення разом списку всіх виявлених bad-блоків на диску («dmsetup message dust1 0 listbadblocks»).
    • Для md/raid5 додано параметр /sys/block/md1/md/stripe_size для налаштування розміру блоку STRIPE.
    • Для пристроїв зберігання NVMe додано підтримка команд для зонування накопичувача (ZNS, NVM Express Zoned Namespace), що дозволяє розбити простір для зберігання на зони, що становлять групи блоків, для повнішого управління розміщенням даних на накопичувачі.
  • Мережева підсистема
    • У Netfilter додано можливість відхилення пакетів на стадії до перевірки маршрутизації (вираз REJECT тепер може використовуватися не тільки в ланцюжках INPUT, FORWARD та OUTPUT, а й на стадії PREROUTING для icmp та tcp).
    • У nftables додано можливість аудиту подій, пов'язаних із зміною конфігурації.
    • У nftables в API netlink додано підтримка анонімних ланцюжків, ім'я яким призначається динамічно ядром. При видаленні пов'язаного з анонімним ланцюжком правила автоматично видаляється і сам ланцюжок.
    • В BPF додано підтримку ітераторів для обходу, фільтрації та зміни елементів асоціативних масивів (map) без копіювання даних у простір користувача. Ітератори можна використовувати для сокетів TCP та UDP, що дозволяє BPF-програмам перебирати списки відкритих сокетів та витягувати з них необхідні відомості.
    • Додано новий тип BPF-програм BPF_PROG_TYPE_SK_LOOKUP, що запускаються в момент, коли ядро ​​шукає відповідний слухаючий сокет для вхідного з'єднання. За допомогою подібної BPF-програми можна створювати обробники, які приймають рішення про те, з яким сокетом слід асоціювати з'єднання, які не обмежені рамками системного виклику bind(). Наприклад, можна організувати зв'язування одного сокету з діапазоном адрес або портів. Крім того, bpf_setsockopt() додана підтримка прапора SO_KEEPALIVE і реалізована можливість установки обробників BPF_CGROUP_INET_SOCK_RELEASE, що викликаються при звільненні сокету.
    • Реалізовано підтримку протоколу PRP (Parallel Redundancy Protocol), що дозволяє на базі Ethernet реалізувати прозоре для програм перемикання на запасний канал у разі збою будь-яких компонентів мережі.
    • У стек mac80211 додано підтримка чотириетапного узгодження WPA/WPA2-PSK у режимі точки доступу.
    • Додано можливість перемикання планувальника qdisc (queuing discipline) на використання за умовчанням алгоритму управління мережними чергами FQ-PIE (Flow Queue PIE), націленого на зниження негативного впливу проміжної буферизації пакетів на граничному мережевому устаткуванні (bufferbloat) у мережах з кабель.
    • Додано нові можливості в MPTCP (MultiPath TCP), розширення протоколу TCP для організації роботи TCP-з'єднання з доставкою пакетів одночасно по кількох маршрутах через різні мережеві інтерфейси, прив'язані до різних IP-адрес. Додана підтримка syn cookie, DATA_FIN, автоналаштування буферів, діагностики сокетів та використання прапорів REUSEADDR, REUSEPORT та V6ONLY у setsockopt.
    • Для віртуальних таблиць маршрутизації VRF (Virtual Routing and Forwarding), що дозволяють організувати роботу кількох доменів маршрутизації однією системі, реалізований режим «strict». У цьому режимі віртуальна таблиця може бути асоційована лише з таблицею маршрутизації, яка використовується інших віртуальних таблицях.
    • У бездротовий драйвер ath11k додано підтримка частоти 6GHz та спектрального сканування.
  • Обладнання
    • Видалено код для підтримки архітектури UniCore, розробленої в мікропроцесорному центрі Пекінського університету та включеної до складу ядра Linux у 2011 році. Дана архітектура з 2014 року знаходиться без супроводу та не має підтримки у GCC.
    • Для архітектури RISC-V реалізовано підтримку kcov (debugfs-інтерфейс для аналізу покриття коду ядра), kmemleak (система виявлення витоків пам'яті), захисту стека, міток переходу та tickless-операцій (незалежна від сигналів таймера багатозадачність).
    • Для архітектури PowerPC реалізовано підтримку черг для spinlock, що дозволило значно підняти продуктивність у ситуаціях конфлікту блокувань.
    • Для архітектур ARM та ARM64 задіяний за умовчанням механізм регулювання частоти процесора розклад (cpufreq governor), який для ухвалення рішення про зміну частоти безпосередньо використовує інформацію від планувальника завдань і може відразу звертатися до драйверів cpufreq для оперативної зміни частоти, миттєво підганяючи параметри роботи CPU до поточного навантаження.
    • У DRM-драйвері i915 для відеокарт Intel включено підтримку чіпів на базі мікроархітектури Ракетне озеро та додана початкова підтримка дискретних карток Intel Xe DG1.
    • До драйвера amdgpu додано початкову підтримку GPU AMD Navi 21 (Navy Flounder) та Navi 22 (Sienna Cichlid). Додано підтримку двигунів прискорення кодування та декодування відео UVD/VCE для GPU Southern Islands (Radeon HD 7000).
      Додано властивість для повороту відображення на 90, 180 чи 270 градусів.

      Цікаво, що драйвер для GPU AMD є найбільшим драйвером в ядрі — він налічує близько 2.71 млн. рядків коду, що приблизно 10% від загального розміру ядра (27.81 млн. рядків). При цьому 1.79 млн. рядків припадає на згенеровані автоматично заголовні файли з даними для регістрів GPU, а Сі-код складає 366 тисяч рядків (для порівняння драйвер Intel i915 включає 209 тисяч рядків, а Nouveau - 149 тисяч).

    • У драйвер Nouveau додано підтримка покадрової перевірки цілісності за допомогою CRC (Cyclic Redundancy Checks) у дисплейних двигунах GPU NVIDIA. Реалізація ґрунтується на документації, наданій компанією NVIDIA.
    • Додані драйвери для LCD-панелей: Frida FRD350H54004, KOE TX26D202VM0BWA, CDTech S070PWS19HP-FC21, CDTech S070SWV29HG-DC44, Tianma TM070JVHG33 та Xing.
    • У звуковій підсистемі ALSA реалізовано підтримку Intel Silent Stream (режим постійної підтримки живлення для зовнішніх HDMI-пристроїв для виключення затримки при початку відтворення) та нового пристрою для керування підсвічуванням кнопок активації мікрофона та відключення звуку, а також додано підтримку нового обладнання, включаючи контролер Loongson 7A1000.
    • Додана підтримка ARM-плат, пристроїв та платформ: Pine64 PinePhone v1.2, Lenovo IdeaPad Duet 10.1, ASUS Google Nexus 7, Acer Iconia Tab A500, Qualcomm Snapdragon SDM630 (використовується в Sony Xperia 10, 10 Plus, XA Ultra), Jetson Xavier NX, Amlogic WeTek Core2, Aspeed EthanolX, п'ять нових плат на базі NXP i.MX2, MikroTik RouterBoard 2, Xiaomi Libra, Microsoft Lumia 2, Sony Xperia Z6, MStar, Microchip Sparx3011 v950, Renesas RZ/G5H.

Одночасно латиноамериканський Фонд вільного ПЗ сформував
варіант повністю вільного ядра 5.9 - Linux-libre 5.9-gnu, очищеного від елементів прошивок та драйверів, що містять невільні компоненти або ділянки коду, сфера застосування яких обмежена виробником. У новому випуску відключено завантаження блобів у драйверах для WiFi rtw8821c та SoC MediaTek mt8183. Оновлено код чищення блобів у драйверах та підсистемах Habanalabs, Wilc1000, amdgpu, mt7615, i915 CSR, Mellanox mlxsw (Spectrum3), r8169 (rtl8125b-2) та x86 touchscreen.

Джерело: opennet.ru

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