Релиз ядра Linux 6.12 с поддержкой Realtime-режима

После двух месяцев разработки Линус Торвальдс представил релиз ядра 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% c внутренними подсистемами ядра.

Основные новшества в ядре 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/kernel/tracing/instances/boot_map.
- Продолжен перенос изменений из ветки 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", оценивающего число операций, которые могут быть выполнены в одном потоке.


- Дисковая подсистема, ввод/вывод и файловые системы

- В подсистему VFS добавлена возможность работы c устройствами хранения, размер блоков в которых больше, чем размер страницы памяти в системе. В файловых системах данная возможность пока поддерживается только в 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 (защита от уязвимости MMIO Stale Data), MITIGATE_L1TF (защита от уязвимости L1 Terminal Fault), MITIGATE_RETBLEED (защита от уязвимости Retbleed), MITIGATE_SPECTRE_V1, MITIGATE_SPECTRE_V2 (защита от уязвимостей Spectre), MITIGATE_SRBDS (защита от уязвимости Special Register Buffer Data Sampling), MITIGATE_SSB (защита от уязвимости Speculative Store Bypass).
- Добавлен параметр командной строки 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-области.


- Сетевая подсистема

- Добавлен механизм 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 A6000/A6010, Surface Laptop 7, Anbernic RG35XXSP, Firefly Core-PX30-JD4, Lunzn Fastrhino R68S, Aspeed Riser, AGX Orin, Rockchip Qnap-TS433, Huashan Pi, Meta Catalina, BeagleY-AI, NanoPi R2S Plus, ExynosAuto v920, SOPHGO SG2002, Qualcomm IPQ5332, LG G4 (h815), Cool Pi CM5 GenBook, Anbernic RG35XXSP, GameForce Ace, IBM P11, Kontron i.MX93 OSM-S, NanoPC-T6
- Добавлена поддержка экранных панелей Anbernic RG28XX, On Tat Industrial Company KD50G21-40NT-A1, Innolux G070ACE-LH3, Melfas lmfbx101117480, Densitron DMT028VGHMCMI-1D, Microchip AC40T08A, AOU B116XTN02.3, AUO B116XAN06.1, AOU B116XAT04.1, BOE TV101WUM-LL2, BOE NV140WUM-N41, BOE NV133WUM-N63, BOE NV116WHM-A4D, BOE NE140WUM-N6G, CMN N116BCA-EA2, CMN N116BCP-EA2, CSW MNB601LS1-4, Starry er88577.
- В звуковой подсистеме добавлена поддержка чипов и кодеков RME Digiface USB, AMD ACP 7.1, Mediatek MT6367, MT8365, Realtek RTL1320, C-Media CM9825. Объявлены устаревшими старые звуковые драйверы для ASoC Intel, вместо которых рекомендовано использовать драйверы AVS. Внесено много улучшений в драйвер SoundWire.



Источник: https://www.opennet.ru/opennews/art.shtml?num=62243