После двух месяцев разработки Линус Торвальдс представил релиз ядра 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[]”) обрабатывается как гибкий массив, а размер “[0]” (например, “int b[0]”) – нет.
- В коде ядра разрешено применение макроса __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 (управляемый режим).
- Дисковая подсистема, ввод/вывод и файловые системы
- Файловая система Overlayfs переведена на использование нового API для монтирования. Внесены изменения, необходимые для организации работы файловой системы Composefs в виде надстройки над ФС OverlayFS и EROFS, вместо сопровождения обособленной реализации. В ядре 6.5 для Composefs добавлена поддержка слоёв “data-only”, используемых только для данных (отдельно от метаданных). В следующей версии ядра планируется добавить в OverlayFS поддержку сохранения хэшей fs-verity в расширенном атрибуте (xattr) overlay.metacopy, что завершит интеграцию в ядро всех возможностей, необходимых проекту Composefs.
- В файловой системе F2FS реализована поддержка опции монтирования “errors=”, через которую можно настроить поведение в случае возникновения ошибок при чтении или записи данных на накопитель. В качестве значений могут быть указаны режимы remount-ro (перемонтировать в режиме только для чтения), continue (продолжить работу) и panic (аварийная остановка).
- Добавлена возможность монтирования другой ФС слоем ниже в существующую точку монтирования, что может применяться для организации бесшовного обновления совместно используемого раздела /usr в контейнерах, без оставления временного окна, в котором раздел находится в отмонтированном состоянии. Например, к точке монтирования /mnt (mount -t ext4 /dev/sda /mnt) можно примонтировать другой раздел (mount –beneath -t xfs /dev/sdb /mnt), который не будет использоваться пока старый раздел остаётся примонтирован. Если затем выполнить команду отмонтирования (umount /mnt), то старый раздел будет отмонтирован, а новый сразу займёт его место без задержки между отмонтирвоанием старого и примонтированием нового раздела.
- В файловой системе Btrfs предложены новые оптимизации. Реализована передача данных в синхронном режиме для быстрых алгоритмов вычисления контрольных сумм crc32c и xxhash). Удалён избыточный код для отслеживания буферов перемещений экстентов.
- В XFS снят признак экспериментальной разработки с кода подсчёта крупных экстентов. Задействован режим FMODE_CAN_ODIRECT.
- В Ext4 проведена чистка кода, связанного с деревом состояний экстентов, журналированием и выделением блоков. Повышена производительность параллельной перезаписи в режиме DIO (Direct I/O).
- Виртуализация и безопасность
- Включена по умолчанию функциональность “secretmem”, работа которой обеспечивается системным вызовом memfd_secret(). Memfd_secret позволяет создать приватную область памяти в изолированном пространстве адресов, видимую только процессу-владельцу, неотражаемую в другие процессы и напрямую недоступную ядру. Подсистема включена так как проведённые тесты опровергли мнение, что “secretmem” снижает производительность.
- В минимальной стандартной Си-библиотеке Nolibc реализована поддержка механизма выявления переполнений стека Stack Protector. Добавлена возможность использования разных определений errno на разных платформах. Добавлена функция syscall().
- В UML (User Mode Linux) добавлена поддержка механизма Landlock, позволяющего ограничить взаимодействие группы процессов с внешним окружением.
- Сетевая подсистема
- Реализован новый тип сообщений SCM_PIDFD, позволяющий использовать сокеты и вызовы sendmsg()/recvmsg() для передачи сведений о pidfd-идентификаторе процесса, по аналогии с тем как при помощи сообщения
SCM_CREDENTIALS передаются данные о PID, UID и GID. Кроме того, в вызов getsockopt() добавлен флаг SO_PEERPIDFD для получения pidfd-идентификатора процесса на другой стороне сокета. Pidfd отличается от PID тем, что связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID. - Переписана реализация системных вызовов sendpage и splice, в которых вместо передачи данных в сокет страница за страницей, в обработчиках sendmsg реализована передача ссылок на данные.
- При сборке ядра для работы в режиме реального времени (CONFIG_RT) включена поддержка активного полинга сокетов (busy polling).
- Для беспроводных устройств IEEE 802.15.4 реализована поддержка режима активного сканирования сети.
- В беспроводном стеке продолжена работа над реализацией режима MLO (Multi-Link Operation), представленного в спецификации WiFi 7.
- Реализован новый тип сообщений SCM_PIDFD, позволяющий использовать сокеты и вызовы sendmsg()/recvmsg() для передачи сведений о pidfd-идентификаторе процесса, по аналогии с тем как при помощи сообщения
- Оборудование
- В драйвере AMDGPU включена по умолчанию технология адаптивной синхронизации FreeSync для видео, которая позволяет корректировать частоту обновления информации на экране, обеспечивая плавность и отсутствие разрывов изображения во время просмотра видео.
Добавлена поддержка разгона (OverDrive) частоты видеокарт Radeon RX 7000.
Внесены оптимизации, нацеленные на повышение производительности и эффективности энергопотребления. - В драйвере i915 реализована начальная поддержка чипов Intel Meteor Lake и добавлена возможность использования переменной частоты обновления экрана (VRR, Variable Rate Refresh) на ноутбуках с экранами на базе интерфейса eDP (Embedded Display Port). Для framebuffer реализована поддержка мапинга памяти (mmap). Переработан код, связанный с горячим подключением устройств и передачей данных на дисплей.
- В драйвере EDAC (Error Detection And Correction) реализована возможность выявления и корректирования ошибок в памяти на системах с процессорами AMD Zen 4 (EPYC 9004). Также добавлена поддержка EDAC для контроллеров памяти Nuvoton NPCM.
- Значительно расширена поддержка контроллеров USB4, в том числе добавлена начальная поддержка контроллеров Intel Barlow Ridge, поддерживающих USB4 v2 (80 Gbps через USB Type-C).
- В звуковую подсистему ALSA добавлена поддержка устройств с интерфейсом MIDI 2.0. Добавлена поддержка звуковых кодеков Realtek RT722 SDCA и Google Chameleon, усилителей Qualcomm WSA8840/WSA8845/WSA8845H, Analog Devices SSM3515 и MAX98388, звуковых карт Loongson.
- Добавлен драйвер для мультимедийных пультов NVIDIA SHIELD (поддерживается модель Thunderstrike, выпускаемая с 2017 года).
- Добавлена поддержка ARM-чипов Nuvoton MA35D1, Amlogic C3 и STMicroelectronics STM32MP2 на базе ARM Cortex-A35, Samsung Exynos 4212, Qualcomm MSM8939 (Snapdragon 615), Qualcomm SC8180x (Snapdragon 8cx), Qualcomm SDX75 и Alibaba T-Head TH1520.
- Добавлена поддержка ARM-плат Marantec Maveo, Endian 4i Edge 200, Epson Moverio BT-200, PHYTEC STM32MP1-3, ICnova ADB4006, Emtop SoM & Baseboard, NXP i.MX8MM EVKB, Gateworks Venice gw7905-2x, NVIDIA IGX Orin, Fxtec Pro1X, NVIDIA Jetson Orin Nano (tegra234), Rockchip Indiedroid Nova (rk3588), Edgeble Neural Compute Module 6B (rk3588), FriendlyARM NanoPi R2C Plus (rk3328), Anbernic RG353PS (rk3566), Lunzn Fastrhino R66S/R68S (rk3568), PHYTEC phyBOARD-Lyra-AM625, Toradex Verdin, а также плат, используемых в устройствах Sony Xperia M4 Aqua и Acer Aspire 1.
- Добавлена поддержка Ethernet-коммутаторов и адаптеров: Synopsys EMAC4 IP, Marvell 88E6361, Marvell 88E6250, Microchip LAN8650/1 Rev.B0 PHYs и MediaTek MT7981/MT7988.
- Добавлена поддержка беспроводных чипов Realtek RTL8192FU, Realtek RTL8723DS и Realtek RTL8851BE.
- В драйвере AMDGPU включена по умолчанию технология адаптивной синхронизации FreeSync для видео, которая позволяет корректировать частоту обновления информации на экране, обеспечивая плавность и отсутствие разрывов изображения во время просмотра видео.
Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 6.5 – Linux-libre 6.5-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.5 переработан код чистки блобов в драйвере iwlwifi для беспроводных карт Intel. Проведена чистка имён блобов в dts-файлах для архитектуры Aarch64. Обновлён код чистки блобов в различных драйверах и подсистемах, например, в драйверах amdgpu, adreno, rtl8xxxu, коде поддержки сенсорных экранов и документации к atomisp. Удалены блобы в новых драйверах rtw8851b и tas2781.