Після двох місяців розробки Лінус Торвальдс представив реліз ядра Linux 6.12. Серед найбільш помітних змін: можливість включення Realtime-режиму, sched_ext для створення планувальників CPU через eBPF, виведення QR-коду при аварійних станах, механізм Device Memory TCP, механізм резервування ресурсів SCHED_DEADLINE server, покращення планувальника задач EEVDF, модуль IPE для завдання політик забезпечення цілісності.
У нову версію прийнято 14607 виправлень від 2167 розробників, розмір патчу - 37 МБ (зміни торкнулися 13087 файлів, додано 507913 рядків коду, видалено 234083 рядків). У минулому випуску було 15130 виправлень від 2078 розробників, розмір патчу - 85 МБ (в ядрі 6.10 патч був розміром 41 МБ). Близько 45% всіх представлених у 6.12 змін пов'язані з драйверами пристроїв, приблизно 12% змін стосуються оновлення коду, специфічного для апаратних архітектур, 13% пов'язано з мережевим стеком, 6% — з файловими системами і 3% з внутрішніми підсистемами ядра.
Основні нововведення в ядрі 6.12:
- Пам'ять та системні сервіси
- Надано можливість збирання ядра з опцією PREEMPT_RT без додаткових патчів для роботи в режимі реального часу. Останньою відсутньою в ядрі можливістю, що не дозволяла активувати режим PREEMPT_RT, була підтримка атомарного виводу, що не блокує, через функцію printk, яка також прийнята до складу ядра. Підтримка PREEMPT_RT доступна для архітектур x86, x86_64, ARM64 та RISC-V. Досі реалізація режиму PREEMPT_RT поставлялася у формі зовнішніх патчів, на основі яких деякі дистрибутиви, такі як RHEL, SUSE та Ubuntu, створювали окремі Realtime-редакції своїх продуктів, затребувані в таких галузях, як фінансові системи, пристрої обробки звуку та відео, авіація, медицина, робототехніка, телекомунікаційні та промислові системи, в яких необхідно забезпечити передбачуваний час обробки подій.
- Додано механізм sched_ext (SCX), що дозволяє використовувати eBPF для створення планувальників CPU, що охоплюють практично всі аспекти планування виконання завдань і розподілу ресурсів CPU. Подібні планувальники можуть завантажуватися динамічно і виконуватись усередині ядра Linux в віртуальній машині eBPF. Механізм sched_ext спрощує створення специфічних для певних завдань планувальників, дає можливість експериментувати з різними техніками та стратегіями планування, а також дозволяє швидко створювати робочі прототипи та замінювати планувальники на льоту у робочих інфраструктурах. Наприклад, за допомогою sched_ext можна створити планувальник, який враховує специфіку певної програми та динамічно змінює стратегію планування його виконання залежно від стану системи та якихось додаткових факторів.
- До складу включена частина патчів, необхідних для роботи механізму SCHED_DEADLINE server, що вирішує проблему з недоотриманням ресурсів CPU звичайними завданнями в умовах монополізації CPU високопріоритетними (realtime) завданнями. Для запобігання монополізації CPU в ядрі раніше використовувався механізм Realtime throttling, який намагався резервувати 5% для низькопріоритетних завдань, залишаючи 95% часу realtime-завданням. Цей механізм залишав бажати кращого, оскільки звичайні завдання у багатьох ситуаціях недоотримували процесорний час. SCHED_DEADLINE server реалізує ефективніший механізм резервування ресурсів.
- Завершено інтеграцію планувальника завдань EEVDF (Earliest Eligible Virtual Deadline First), який прийшов на зміну планувальнику CFS (Completely Fair Scheduler), що поставлявся з ядра 2.6.23. Новий планувальник при виборі наступного процесу передачі виконання враховує процеси, які недоотримали процесорних ресурсів чи отримали незаслужено багато процесорного часу. У першому випадку форсується передача управління процесом, а в другому, навпаки, відкладається. Старий планувальник CFS використовував для визначення процесів, що вимагають окремої уваги, евристику та тонкі налаштування, в той час як новий планувальник відстежує їх явніше і не потребує тонкого налаштування. Передбачається, що EEVDF дозволить знизити затримки під час виконання завдань, з якими CFS виникали проблеми з плануванням.
- Обробник аварійних ситуацій в ядрі — DRM Panic, який використовує підсистему DRM (Direct Rendering Manager) для відображення наочного звіту в стилі «синього екрану смерті», додано можливість показу на екрані логотипу та QR-коду зі звітом kmsg при виникненні аварійного стану. Так як QR-код вміщується лише 2953 байт, передбачена опція DRM_PANIC_SCREEN_QR_CODE_URL, при якій звіт kmsg стискується за допомогою zlib і прикріплюється як параметр до URL, що дозволяє передати через QR-код V40 близько 7500 байтів. При збиранні пакетів з ядром дистрибутиви можуть задати базове посилання для URL, що дозволить організувати перехід на сторінку для надсилання повідомлення про проблему. Для вибору формату QR-коду передбачено налаштування DRM_PANIC_SCREEN_QR_VERSION.
- Додано підтримку розширення ARM POE (Permission Overlay Extension), що дозволяє задавати права доступу до областей пам'яті. За допомогою цього розширення на системах з процесорами ARM64 може бути реалізований механізм Memory Protection Keys, який використовується для обмеження доступу до сторінок пам'яті без зміни таблиці сторінок пам'яті.
- Для архітектур Loongarch, ARM64, PowerPC і s390 перенесена реалізація системного виклику getrandom(), оптимізована за допомогою механізму vDSO (virtual dynamic shared object), що дозволяє перенести обробник системного виклику з ядра в простір користувача і уникнути перемикань контексту. Оптимізація дозволяє до 15 разів прискорити отримання випадкових чисел.
- У підсистему асинхронного введення/виводу io_uring додано можливість використання абсолютних таймаутів, які спрацьовують при досягненні певного часу на системному годиннику (раніше могли виставлятися тільки відносні таймаути, в яких вказувалася тривалість з початку операції).
- Додані файли для генерації біндингу для бібліотеки libcpupower за допомогою інструментарію SWIG, що дозволяє формувати біндинги з коду C/C++ для різних мов програмування. Біндинги дозволяють створювати скрипти на Python та інших мовах і використовувати їх для розширення функціональності бібліотеки libcpupower, що надає API для керування cpufreq та драйверами з простору користувача.
- В утиліті cpuidle реалізовано відображення значення стану простою «residency», що застосовується для realtime-систем і враховує мінімальний час, який процесор повинен перебувати в стані простою, щоб виправдати витрати енергії на перехід у цей стан та вихід з нього.
- Додано можливість використання компілятора Clang для збирання стандартної Сі-бібліотеки nolibc, що входить до складу вихідних текстів ядра. Linux та надає обв'язку над базовими системними викликами. При складанні nolibc Clang допускається використання оптимізації на етапі зв'язування (LTO).
- Оголошено застарілими деякі інтерфейси cgroup1, такі як обліковий запис TCP, перша версія м'яких обмежень (soft limit) та керування вичерпанням вільної пам'яті. Підтримка вказаних функцій поки що зберігається в повному обсязі, а попередження зроблено для вивчення кількості користувачів, які продовжують використовувати ці можливості.
- Додано можливість налаштування кільцевого буфера трасування для збереження накопичених даних після перезавантаження, що дозволить не втрачати накопичену налагоджувальну інформацію у разі аварійного завершення роботи ядра. Дані зберігаються у пам'яті. Увімкнення здійснюється через параметр командного рядка ядра trace_instance, наприклад, виставлення "trace_instance=boot_map@0x285400000:12M" зарезервує 12 МБ пам'яті за адресою 0x285400000 для буфера "boot_map", який буде доступний через файл /sys.
- Продовжено перенесення змін з гілки Rust-for-Linux, пов'язаних з використанням мови Rust як другої мови для розробки драйверів та модулів ядра (підтримка Rust не активна за замовчуванням, і не призводить до включення Rust до обов'язкових складальних залежностей до ядра). Додані модулі 'list' та 'rbtree' для роботи з двонаправленими зв'язковими списками та червоно-чорними деревами пошуку (red-black tree). Розширено можливості модулів 'init', 'sync', 'types' та 'error'. Надано можливість використання коду на Rust при складанні ядра із захистом від атак Spectre (опції MITIGATION_{RETHUNK,RETPOLINE,SLS}), використання системи налагодження KASAN, механізмів захисту kCFI (kernel Control Flow Integrity) та Shadow Call, а також при використанні додаткових плагінів GCC. Додано драйвер для Ethernet-контролера Applied Micro QT2025 PHY, написаний на Rust. Підготовлено окремий сайт із документацією — rust.docs.kernel.org.
- До складу вихідних текстів ядра додано утиліту xdrgen для перетворення XDR-специфікацій (eXternal Data Representation) у функції кодування та декодування XDR, написані з використанням Си-стилю, прийнятого в ядрі Linux.
- У ядро прийнято зміну з реалізацією механізму маскування покажчиків зниження кількості повільних викликів barrier_nospec() в 64-битной функції copy_from_user(), застосовуваної для копіювання даних у ядро з простору користувача. Застосування маскування прискорює на 2.6% проходження тесту "per_thread_ops", що оцінює кількість операцій, які можуть бути виконані в одному потоці.
- Додано новий USB-драйвер, що дозволяє використовувати протокол 9pfs як транспорт для передачі та прийому даних з USB-пристрою, при монтуванні ФС 9p поверх USB (наприклад, "mount -t 9p -o trans=usbg,aname=/path/to/ fs /mnt/9»). Як приклад застосування нового драйвера називається використання замість NFS для організації завантаження кореневого розділу при розробці вбудованих пристроїв.
- Дискова підсистема, введення/виведення та файлові системи
- У підсистему VFS додано можливість роботи з пристроями зберігання, розмір блоків у яких більший, ніж розмір сторінки пам'яті в системі. У файлових системах ця можливість поки що підтримується тільки в XFS.
- У підсистему FUSE, що дозволяє створювати реалізації файлових систем, що працюють у просторі користувача, додано підтримку картки ідентифікаторів користувачів примонтованих файлових систем, що застосовується для зіставлення файлів певного користувача на чужому розділі з іншим користувачем в поточній системі.
- Реалізована нова fcntl-операція F_CREATED_QUERY, що дає додатку можливість визначити, чи був створений файл, відкритий з використанням прапора O_CREAT, чи він уже існував до цього.
- До системного виклику name_to_handle_at() додано можливість використання унікальних 64-розрядних ідентифікаторів точок монтування для виключення стану гонки при розборі /proc/mountinfo.
- Розмір структури "file" в ядрі скорочено з 232 до 184 байт, що дозволяє скоротити споживання пам'яті на системах, що активно працюють з файлами.
- Заборонено монтування файлових систем до точок монтування всередині ієрархії /proc, наприклад, /proc/PID/fd, що створювало потенційні проблеми з безпекою.
- У псевдо-ФС NSFS (NameSpace FS), що використовується для роботи з просторами імен, реалізовано надання додаткової інформації про простори імен точок монтування.
- У файловій системі EROFS (Extendable Read-Only File System), призначеної для використання на розділах, доступних у режимі лише для читання, з'явилася підтримка монтування файлових систем безпосередньо з дискових образів, збережених у вигляді файлів.
- У XFS додані нові команди ioctl XFS_IOC_START_COMMIT і XFS_IOC_COMMIT_RANGE для обміну вмістом між двома файлами.
- У NFS додано підтримку протоколу «LOCALIO», що дозволяє визначити чи знаходяться клієнт і сервер NFS на тому самому хості, для залучення відповідних оптимізації.
- У файловій системі Btrfs запропоновано оптимізацію продуктивності, проведено рефакторинг коду, скорочено область блокування екстентів при операціях читання, продовжено роботу з перекладу на використання фоліантів сторінок пам'яті (page folios), реалізовано автоматичне звільнення пам'яті для структури btrfs_path.
- У файловій системі Ext4 усунуто помилки, пов'язані з виділенням блоків, керуванням екстентами, механізмом "fast commit" та журналюванням.
- Віртуалізація та безпека
- Додано LSM-модуль IPE (Integrity Policy Enforcement), розроблений компанією Microsoft для розширення існуючої системи мандатного керування доступом. Модуль дозволяє визначити загальну політику забезпечення цілісності для всієї системи, яка вказує на які операції допустимі і яким способом слід верифікувати справжність компонентів. Наприклад, за допомогою IPE можна вказати які файли, що виконуються, дозволено запускати з урахуванням перевірки їх відповідності еталонної версії за допомогою криптографічних хешей, що надаються системою dm-verity.
- На етапі компіляції ядра надано можливість роздільного включення доступних методів захисту від різних уразливостей класу Spectre у CPU. У Kconfig запропоновані нові параметри: MITIGATE_MDS (захист від уразливості Microarchitectural Data Sampling), MITIGATE_TAA (захист від вразливості TSX Asynchronous Abort), MITIGATE_MMIO_STALE_DATA (захист від уразливості LM Fault), MITIGATE_RETBLEED (захист від вразливості Retbleed), MITIGATE_SPECTRE_V1, MITIGATE_SPECTRE_V1 (захист від уразливостей Spectre), MITIGATE_SRBDS (захист від уразливості Special Register Buffer Data Sampling), MITIGATE_SSB (захист від уразливості).
- Доданий параметр командного рядка proc_mem.force_override та набір складальних налаштувань у Kconfig (PROC_MEM_FORCE_ALWAYS, PROC_MEM_FORCE_PTRACE та PROC_MEM_FORCE_NEVER), що дозволяють заборонити зміну пам'яті через /proc/pid/mem.
- Підсистема LSM (Linux security module) переведено на використання статичних викликів, що дозволило посилити безпеку та підвищити продуктивність.
- Забезпечено можливість використання штатних ядер для архітектури ARM64 у гостьових оточеннях, що виконуються на Android-системи з модифікованим гіпервізором KVM (protected KVM)
- У LSM-модулі Landlock, що дозволяє обмежити взаємодію групи процесів із зовнішнім оточенням, реалізована концепція IPC scoping для вибіркового обмеження взаємодії з sandbox-оточеннями, використовуючи Unix-сокети та сигнали. Наприклад, можна заборонити встановлення з'єднань з використанням Unix-сокетів із sandbox-оточення до процесів, у яких не застосовується ізоляція, але дозволити з'єднання з процесами у тій же scope-області.
- У гіпервізорі KVM в CPUID для гостьових систем додано прапор, що сигналізує про підтримку розширень AVX10.1.
- Мережева підсистема
- Додано механізм Device Memory TCP, що дозволяє використовувати мережеві сокети для прямого відправлення вмісту пам'яті периферійних пристроїв по мережі (режим zero-copy) та прямого розміщення вмісту мережних пакетів в області пам'яті пристрою на стороні одержувача. Дані, що передаються в пакетах, передаються від мережевої карти в пам'ять периферійного пристрою або з пам'яті пристрою в мережеву карту безпосередньо, минаючи CPU, а заголовки пакетів потрапляють у звичайні буфери ядра.
- Розширено можливості багатьох Ethernet та бездротових драйверів. Например, в драйвере Intel iwlwifi добавлена поддержка выноса операций RLC/SMPS на сторону прошивки, в драйвере RealTek rtw89 повышена производительность и добавлена поддержка чипов RTL8852BT/8852BE-VT (WiFi 6), в Ethernet-драйвере microchip добавлена поддержка спецификаций IEEE 802.3bw (100BASE -T1) та IEEE 802.3bp, покращені реалізації віртуальних Ethernet Microsoft vNIC та IBM veth. Додані нові драйвери для Ethernet-чіпів Realtek RTL9054, RTL9068, RTL9072, RTL9075, RTL9068, RTL9071 та Microchip LAN8650/1 10BASE-T1S MAC-PHY.
- У MPTCP (MultiPath TCP), розширення протоколу TCP для організації доставки TCP-пакетів одночасно по кількох маршрутах через різні мережеві інтерфейси, розмір використовуваних при маршрутизації вагових коефіцієнтів збільшений з 8 до 16 біт. Реалізовано визначення трафіку, що втрачається (blackhole) і призупинення на деякий час спроб встановлення з'єднань з системами, що призводять до втрати трафіку.
- Для IPv6 реалізована підтримка прапора «p» в PIO (Prefix Information Option), що застосовується в анонсах RA (IPv6 Router Advertisements) для вибору моделі розгортання клієнтів через DHCPv6-PD (DHCPv6 Prefix Delegation, RFC9663) замість присвоєння окремих адрес на базі SLAAC (Stateless Address Autoconfiguration). У IPv6 IOAM6 додано підтримку нового режиму інкапсуляції tunsrc, що дозволяє досягти більш високої продуктивності.
- Підвищено продуктивність обробки пакетів керуючих IPsec.
- Підвищено продуктивність скидання (flush) великих наборів правил nftables. У nfnetlink_queue покращено підтримку протоколу SCTP.
- В API ethtool додано підтримку прив'язки кількох мережних карт до одного мережного інтерфейсу.
- Обладнання
- У драйвері AMDGPU продовжено роботу з реалізації підтримки GPU AMD RDNA4 («GFX12»). Додано можливість скидання окремих черг завдань без скидання стану всього GPU.
- Продовжено роботу над drm-драйвером (Direct Rendering Manager) Xe для GPU на базі архітектури Intel Xe, яка використовується у відеокартах Intel сімейства Arc та інтегрованої графіки, починаючи з процесорів Tiger Lake. У новій версії включено підтримку GPU на базі мікроархітектур Battlemage і Lunar Lake. Представлена підтримка CCS-модифікаторів (Color Control Surface) Xe2 для керування параметрами вбудованих та дискретних GPU.
- У драйвері i915 реалізовано можливість виведення через інтерфейс HWMON або sysfs (атрибут "fan1_input") інформації про швидкість обертання кулера. Оголошено застарілим параметр i915.modeset, замість i915.modeset=0 слід використовувати параметр i915.nomodeset.
- У DRM-драйвер msm (GPU Qualcomm Adreno) додано підтримку GPU A615, A306 та A621.
- У драйвері Nouveau проведено переробку та чищення внутрішніх структур.
- У драйвер intel_pstate, керуючий параметрами енергоспоживання (P-state) на системах з процесорами Intel, додана підтримка гібридних систем з асиметричними (що відрізняються за характеристиками) CPU, а також підтримка управління живленням процесорів на базі мікроархітектури Granite Rapids і Sierra Forest. У драйвер intel_idle додано підтримку CPU Xeon Granite Rapids. У драйвері intel_rapl забезпечено розпізнавання процесів AMD сімейства 1Ah та процесорів Intel ArrowLake-U.
- Продовжено включення змін для підтримки ARM SoC Snapdragon X Elite, в якому використовується власний 12-ядерний CPU Qualcomm Oryon та GPU Qualcomm Adreno. Чіп націлений на використання в ноутбуках та ПК, і випереджає у багатьох тестах продуктивності чіпи Apple M3 та Intel Core Ultra 155H.
- Додано підтримку ARM-плат, SoC та пристроїв: Broadcom bcm2712 (Raspberry Pi 5), Renesas R9A09G057 (RZ/V2H), Qualcomm Snapdragon 414 (MSM8929), Lenovo ThinkPad T14s Gen 6, Lenovo 6000 XSP , Firefly Core-PX6010-JD7, Lunzn Fastrhino R35S, Aspeed Riser, AGX Orin, Rockchip Qnap-TS30, Huashan Pi, Meta Catalina, BeagleY-AI, NanoPi R4S Plus, ExynosAuto v68, SOPHGO SG433 ), Cool Pi CM2 GenBook, Anbernic RG920XXSP, GameForce Ace, IBM P2002, Kontron i.MX5332 OSM-S, NanoPC-T4
- Додано підтримку екранних панелей Anbernic RG28XX, On Tat Industrial Company KD50G21-40NT-A1, Innolux G070ACE-LH3, Melfas lmfbx101117480, Densitron DMT028VGHMCMI-1D, Microchip AC40 08, AOU B116XAT02.3, BOE TV116WUM -LL06.1, BOE NV116WUM-N04.1, BOE NV101WUM-N2, BOE NV140WHM-A41D, BOE NE133WUM-N63G, CMN N116BCA-EA4, CMN N140BCP-EA6, CSW MNB116
- У звуковій підсистемі додано підтримку чіпів та кодеків RME Digiface USB, AMD ACP 7.1, Mediatek MT6367, MT8365, Realtek RTL1320, C-Media CM9825. Оголошено застарілими старі звукові драйвери для ASoC Intel, замість яких рекомендовано використовувати драйвери AVS. Внесено багато покращень у драйвер SoundWire.
Джерело: opennet.ru
