После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.5. Среди наиболее заметных изменений: поддержка механизма управления питанием Intel TPMI, системный вызов cachestat, продолжение интеграции поддержки языка Rust, поддержка протокола Unaccepted Memory, поддержка векторных инструкций RISC-V, механизм "fprobe-events", перевод в разряд устаревших механизма распределения памяти SLAB, режим "data-only" в Overlayfs, режим монтирования "beneath".
В новую версию принято 14674 исправлений от 2016 разработчиков, размер патча - 78 МБ (изменения затронули 17646 файлов, добавлено 1294205 строк кода, удалено 930515 строк). Около 32% всех представленных в 6.5 изменений связаны с драйверами устройств, примерно 26% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 8% связано с сетевым стеком, 2% - с файловыми системами и 2% c внутренними подсистемами ядра.
Основные новшества в ядре 6.5:
Память и системные сервисы
В интерфейс RAPL (Running Average Power Limit) добавлена поддержка механизма TPMI (Topology Aware Register and PM Capsule Interface), применяемого в процессорах Intel для активации возможностей, связанных с управлением питанием. RAPL TPMI дополняет ранее доступный интерфейс RAPL MSR/MMIO и отличается более гибкими возможностями настройки ограничения потребления питания.
Добавлен системный вызов cachestat() для запроса состояния страничного кэша для файлов и каталогов. Новый системный вызов позволяет программам из пространства пользователя определить, какие из страниц файла прокэшированы в оперативной памяти. В отличие от ранее доступного системного вызова "mincore()", вызов "cachestat()" позволяет запрашивать более подробную статистику, например, сообщает такие сведения, как количество прокэшированных страниц, грязных (dirty) страниц, вытесненных страниц, недавно вытесненных страниц и страниц, отмеченных для отложенной записи (writeback).
За счёт параллельной активации нескольких CPU значительно (до 10 раз) ускорена процедура перевода процессоров в состояние online.
Из ветки Rust-for-Linux продолжен перенос дополнительной функциональности, связанной с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Осуществлён переход на использование выпуска Rust 1.68.2, в котором стабилизированы некоторые возможности, задействованные в ядре. Улучшен API pin-init. Расширены возможности модулей 'error', 'sync', 'str', 'task' и 'types'.
Добавлена поддержка протокола Unaccepted Memory, дающего возможность принимать выделенную хост-системой память в гостевых системах, защищённых при помощи технологии AMD SEV-SNP (Secure Nested Paging) или Intel TDX (Trusted Domain Extensions).
Для систем на базе архитектуры ARM64 реализована поддержка расширения PIE (ARMv8.9 Permission Indirection Extension), предоставляющего функциональность для настройки прав доступа к памяти. Вместо кодирования информации о полномочиях в таблице страниц памяти, PIE использует индекс массива полномочий, указанный в регистре.
На системах с процессорами ARM, поддерживающими расширения Armv8.8, предоставлена возможность использования процессорных инструкций memcpy/memset в пространстве пользователя.
В интерфейсе асинхронного ввода/вывода io_uring реализована возможность хранения кольцевых буферов и очередей отправляемых данных в памяти, выделенной в пространстве пользователя. Приложение теперь может самостоятельно выделить область памяти и передать её в io_uring, чтобы реализовать возможность использования больших страниц памяти (huge page) для размещения очередей и кольцевых буферов. Для больших очередей и кольцевых буферов изменение позволяет добиться повышения производительности за счёт сокращения нагрузки на буферы ассоциативной трансляции (TLB).
В подсистему BPF добавлена поддержка прикрепления фильтров к kfunc (функции ядра, доступные для использования в программах BPF) для ограничения контекста, в котором допускается вызов kfunc. Например, новая возможность позволяет ограничить вызов функции bpf_sock_destroy() и разрешить её только в BPF-программах с типом BPF_TRACE_ITER.
Реализована возможность прикрепления объектов BPF, используя файловые дескрипторы O_PATH вместо указания имени целевого каталога.
Включена сборка ядра с опцией компилятора "-fstrict-flex-arrays=3", включающей третий уровень проверки гибкого элемента-массива в структурах (Flexible Array Members, массив неопределённого размера в конце структуры). На третьем уровне только размер "" (например, "int b") обрабатывается как гибкий массив, а размер "" (например, "int b") - нет.
В коде ядра разрешено применение макроса __counted_by() для документирования полей в структурах, содержащих элементы, хранимые с использованием гибких массивов. Макрос может применяться для проверки выхода за границу массива.
Добавлена, но пока не задействована в ядре, инфраструктура для применения в коде атрибута "cleanup" (Scope-based Resource Management), который может использоваться для дополнительной защиты от ошибок, приводящих к утечкам памяти и проблемам с освобождением блокировок.
В рабочих очередях ядра (workqueue) реализовано автоматическое выявление и пометка работ, интенсивно расходующих ресурсы CPU (выполняемых более 10 мс). Метки могут исользоваться для защиты от блокировки ресурсоёмкими работами других элементов в очереди. Также добавлена отладочная опция для отражения в логе подобных элементов.
Для архитектуры Loongarch реализована поддержка одновременной многопоточности (SMT, Simultaneous Multi-Threading). Также обеспечена возможность сборки ядра для Loongarch компилятором Clang.
Для архитектуры RISC-V добавлена поддержка ACPI и расширения "V" (Vector, векторные инструкции). Для управления расширением в prctl() предложен параметр "/proc/sys/abi/riscv_v_default_allow" и серия флагов "PR_RISCV_V_*".
В механизм трассировки вызова функций добавлена возможность отслеживания значений оператора return, используемых в при выходе из функций.
Предоставлен интерфейс (/sys/kernel/tracing/osnoise/per_cpu/cpu%ld/timerlat_fd) для управления трассировкой задержек при выполнении real-time потоков (timer-latency) из пространства пользователя.
Добавлен новый механизм "fprobe-events" для трассировки вхождения в функции и выхода из них, использующий подсистему fprobe вместо kprobe, что позволяет применять его на архитектурах, не поддерживаемых в kprobe.
Объявлен устаревший и будет удалён в одном из следующих выпусков механизм распределения памяти SLAB, вместо которого в ядре будет использоваться только SLUB. В качестве причины называются проблемы с сопровождением, наличие проблем в коде и дублирование функциональности с более совершенным аллокатором SLUB.
В планировщике задач улучшена балансировка нагрузки между ядрами CPU за счёт исключения лишней миграции между областями SMT (Simultaneous Multi-Threading) на гибридных системах, в которых сочетаются SMT-ядра, работающие на высокой частоте, и не SMT-ядра, работающие на низкой частоте.
В балансировщик EAS (Energy Aware Scheduling) добавлен режим 'runnable boosting', учитывающий параметры загруженности CPU, изменение частоты и пиковые нагрузки.
На системах с Zen 2 и более новыми процессорами AMD для управления энергопотреблением вместо драйвера CPUFreq по умолчанию задействован драйвер P-State. Добавлен параметр X86_AMD_PSTATE_DEFAULT_MODE для выбора режима P-State по умолчанию: 1 (отключено), 2 (пассивный режим управления энергопотреблением), 3 (активный режим, EPP), 4 (управляемый режим).
https://opennet.ru/59670-kernel