Релиз ядра Linux 6.19. Следующему ядру будет присвоен номер 7.0
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.19. Среди наиболее заметных изменений: подсистема Live Update Orchestrator, поддержка PCIe Link Encryption, системный вызов listns, режим Zero-Copy Receive в io_uring, поддержка ARM-расширения MPAM, klp-build для генерации live-патчей, поддержка архитектуры LoongArch32, QoS для s2idle, оптимизация подсистемы аудита, Intel LASS для защиты от Spectre, поддержка хэшей SHA-3 и BLAKE2b, механизм Confidential VMBus, TX-оптимизации в сетевой подсистеме, протокол CAN XL, API для аппаратного ускорения HDR-вывода.
В анонсе новой версии Линус сообщил, что следующему выпуску ядра будет присвоен номер 7.0, так как в ветке 6.x накопилось достаточного выпусков для смены первого числа в номере версии (в своё время выпуск 6.0 был сформирован следом за 5.19). Смена нумерации осуществляется из эстетических соображений и является формальным шагом, снимающим дискомфорт из-за накопления большого числа выпусков в серии. Линус пошутил, что его сбивают с толку большие числа для которых не хватает пальцев на руках и ногах.
В новую версию принято 15657 исправлений от 2237 разработчиков, размер патча — 52 МБ (изменения затронули 13682 файлов, добавлено 794649 строк кода, удалено 335498 строк). В прошлом выпуске было 15035 исправлений от 2217 разработчиков, размер патча — 45 МБ. Около 40% всех представленных в 6.19 изменений связаны с драйверами устройств, примерно 13% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 5% — с файловыми системами и 3% c внутренними подсистемами ядра.
Основные новшества в ядре 6.19 (1, 2, 3):
- Дисковая подсистема, ввод/вывод и файловые системы
В Btrfs процессы проверки ФС (scrub) и замены устройств больше не блокируют переход системы в спящий режим (перед засыпанием сохраняется состояние scrub-проверки; после выхода из сна scrub-проверка продолжается, а операция замены устройств запускается заново). В реализацию RAID56 добавлена поддержка блоков, размер которых превышает размер страницы памяти. Проведена подготовка к поддержке fscrypt. Повышена производительность работы с блокировками при выполнении операций, связанных с резервированием места. Добавлена поддержка ioctl-операции «shutdown», позволяющей перевести ФС в состояние, при котором предпринимается попытка завершения выполнения уже запущенных операций, но блокируются все новые операции.
В файловой системе Ext4 реализована поддержка блоков, размер которых превышает размер страницы памяти (›4KB на системах x86). Использование крупных блоков позволяет повысить производительность буферизированных операций записи в среднем на 50%, но снижает производительность прямого ввода/вывода из-за увеличения времени расчёта контрольных сумм. В новой версии также добавлены оптимизации, повысившие пропускную способность при выполнении online-дефрагментации.
В подсистеме FUSE улучшена поддержка буферизированного чтения при использовании больших фолиантов страниц памяти (large folios). Через iomap реализована возможность отслеживания частично актуальных фолиантов для загрузки только данных, отсутствующих в буфере.
В VFS добавлена поддержка отзываемого делегирования управления директорией (recallable directory delegation), позволяющего реализовать в NFS передачу управления директорией от сервера клиенту, чтобы NFS-клиент без обращений к NFS-серверу самостоятельно отслеживал состояние директории на основе локального кэша. Если другой NFS-клиент произведёт изменения, связанные с этой директорией, делегирование управления будет отозвано у первого клиента.
Для NFS добавлена поддержка чтения в режиме прямого ввода/вывода (direct I/O). Реализованы настройки /sys/kernel/debug/nfsd/io_cache_read и /sys/kernel/debug/nfsd/io_cache_write для управления включением кэширования и операций прямого ввода/вывода, манипуляции с данными настройками позволяют снизить накладные расходы на стороне NFS-клиента при выполнении крупных операций ввода/вывода.
- В NTFS реализована поддержка ioctl-операции shutdown, включены по умолчанию опции монтирования «acl» и «prealloc», добавлена поддержка времени до 1 января 1970 года.
Для блочных устройств и ФС включено по умолчанию раздельное для каждого CPU кэширование объектов «bio» (Block I/O), определяющих активные операции ввода-вывода.
- Память и системные сервисы
В ядро включена подсистема Live Update Orchestrator (LUO), позволяющая полноценно перезагрузить и обновить ядро без остановки работы и не теряя состояние системы, устройств и процессов. Подсистема LUO базируется на ранее добавленном в ядро механизме KHO (Kexec HandOver) и в дополнение к возможности запуска нового ядра из старого без потери состояния системы решает такие задачи, как сохранение состояния устройств и оперативной памяти, а также обеспечение непрерывности операций, связанных с DMA и обработкой прерываний. Состояние сохраняется до переключения на новое ядро и восстанавливается после задействования нового ядра без нарушения непрерывных операций с устройствами, осуществляемых системой и приложениями в пространстве пользователя.
Добавлен системный вызов listns () для вывода списка существующих в системе пространств имён без необходимости перебирать /proc/ В систему асинхронного ввода/вывода io_uring добавлена поддержка размещения элементов разного размера в очереди отправки (SQE, Submission Queue Entry), по аналогии с тем как в прошлом выпуске было разрешено смешивание размера содержимого очереди результатов (CQE, Completion Queue Event). До этого все элементы в очереди должны были иметь один размер, что приводило к излишнему потреблению памяти из-за необходимости использования максимального размера для всех элементов в очереди.
В io_uring также добавлена поддержка механизма zcrx (Zero-Copy Receive) для получения данных без копирования между ядром и пространством пользователя. Добавлена поддержка запросов раскладки памяти для очередей SQ (Submission Queue) и CQ (Completion Queue), позволяющих получить информацию о размере кольцевого буфера, необходимую при пользовательском выделении памяти при помощи флагов IORING_SETUP_NO_MMAP и IORING_MEM_REGION_TYPE_USER.
Для быстрой трассировки стека при помощи утилит, таких как perf, добавлена поддержка формата SFrame с информацией о раскрутке стека вызовов (unwind). SFrame уже поддерживается в GCC и binutils, не приводит к снижению производительности и, в отличие от формата DWARF, содержит лишь минимальный набор информации, необходимой для трассировки стека.
В утилиту perf добавлена поддержка унифицированного описаний метрик и событий в формате JSON, а также отложенной раскрутки (deferred unwinding) стека вызовов в пространстве пользователя.
Для процессоров AMD реализован механизм подстановки данных в кэш, позволяющий устройствам ввода/вывода напрямую подставлять данные в L3-кэш CPU без их предварительного помещения в ОЗУ.
Добавлена поддержка MPAM (Memory System Resource Partitioning and Monitoring), расширения архитектуры набора команд ARMv8-A для пометки каждого обращения к памяти идентификатором секции (PARTID, Partition ID) и идентификатором группы мониторинга (PMG, Monitoring Group ID). В привязке к PARTID можно ограничить потребление ресурсов, таких как пропускная способность памяти или размер кэша, что бы какая-то группа задач не заняла все ресурсы. В контексте мониторинга сочетание PMG и PARTID можно использовать для отслеживание потребления ресурсов памяти при определённых видах нагрузки.
В случае аварийного завершения процесса после получения сигнала, другой процесс, имеющий pidfd завершившегося процесса, теперь может определить номер сигнала, приведшего к завершению процесса.
Переработана реализация перезапускаемых последовательностей (restartable sequences), позволяющих приложениям организовать псевдо-атомарное не прерываемое выполнение группы инструкций (в случае прерывания другим потоком, предпринимается повторная попытка выполнения последовательности). Новая реализация отличается более высокой производительностью.
Для BPF-программ реализованы инструкции BPF_JMP, BPF_X и BPF_JA для совершения косвенных переходов на определённую позицию из таблицы переходов. Добавлена концепция динамических указателей (dynptr), позволяющих читать данные из структурированных файлов. Добавлена возможность прикрепления к сетевым пакетам нескольких байтов с метаданными.
Модули на языке Python, используемые для обработки документации к ядру, перемещены в отдельных каталог tools/lib/python.
Добавлена функция mempool_alloc_bulk () для безопасного выделения элементов из пула памяти сразу под несколько объектов.
Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). В новой версии в состав ядра встроена библиотека «syn» с парсером Rust-кода, упрощающим написание сложных макросов. Расширены возможности библиотек kernel, pin-init и rbtree. Добавлена библиотека 'num' с типажом Integer для манипуляции целыми числами. В макрос «module!» добавлена поддержка целочисленных параметров. Реализована возможность указания параметров при загрузке модулей ядра, написанных на Rust. Реализованы абстракции для подсистем I2C и PWM (Pulse Width Modulation).
Добавлен макрос «at_least» (например, «param[at_least 7]», информирующий о минимально допустимом размере массива, передаваемого в функцию. Если в функцию будет передан массив с меньшим числом элементов, то компилятор выведет предупреждение.
В состав включён скрипт klp-build для генерации модулей ядра, вносящих изменения в работающее ядро (livepatch), на основе файла с патчем. В утилиту objtool внесены изменения, необходимые для создания live-патчей.
В User-mode Linux (запуск ядра как пользовательского процесса) добавлена ограниченная поддержка многопроцессорности, но потоки внутри одного процесса пока не могут выполняться одновременно. Началось портирование User-mode Linux на библиотеку nolibc.
Добавлена поддержка архитектуры LoongArch32 (LA32R, LA32S) в дополнение к LoongArch64.
Добавлена возможность выставления QoS-лимитов на интенсивность пробуждения процессора в режиме экономии энергии s2idle (Suspend-To-Idle), замораживающего выполнение процессов в пространстве пользователя, но оставляющего активными некоторые обработчики в ядре.
Добавлена поддержка управления таблицами страниц памяти для контроллеров IOMMU (Input-Output Memory Management Unit), выполняющих трансляцию виртуальных адресов, видимых аппаратным устройством, в физические адреса, с возможностью фильтровать операции DMA по виртуальным адресам, а также ограничивать и изолировать операции ввода-вывода.
В событиях трассировки системных вызовов реализована возможность чтения буферов из пространства пользователя и включения их содержимого (например, имён файлов) в результат трассировки.
Сторожевые страницы памяти (guard page), обращение к которым вызывает исключение и аварийное завершение процесса (SIGSEGV), теперь помечаются особой меткой в файле /proc/PID/smaps.
Добавлена возможность управления крупными страницами памяти (transparent huge page) в приватной памяти зонированных устройств.
В устройстве zram, применяемом для сжатого хранения раздела подкачки в памяти, реализована поддержка вытеснения нескольких структур «bio» (Block I/O) в пакетном режиме (writeback batching).
В состав включён шрифт «Terminus 10×18», улучшающий читаемость информации с консоли на экранах ноутбуков со средним разрешением (1440×900).
Значительно оптимизирована работа подсистемы аудита — отмечается снижение накладных расходов в два раза.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.19 — Linux-libre 6.19-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.19 из звуковой подсистемы SDCA удалён код для загрузки бинарных прошивок. Обновлён код чистки blob-ов в драйверах Intel XE, Nova-Core, Qualcomm Iris, Venus and Q6V5, TI PRUeth, Intel iwlwifi, Marvell mwifiex, FourSemi fs210x, Realtek rt1320 и звуковых кодеках TI tas2783. Выполнена чистка имён blob-ов в dts-файлах (devicetree) для ARM-чипов. Прекращена чистка драйвера STM C8SECTPFE DVB, удалённого из ядра.
Источник: http://www.opennet.ru/opennews/art.shtml? num=64757
© OpenNet
