После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.19. Среди наиболее заметных изменений: поддержка процессорной архитектуры LoongArch, интеграция патчей “BIG TCP”, режим “on-demand” в fscache, удаление кода для поддержки формата a.out, возможность применения ZSTD для сжатия прошивок, интерфейс для управления вытеснением памяти из пространства пользователя, повышение надёжности и производительности генератора псевдослучайных чисел, поддержка расширений Intel IFS (In-Field Scan), AMD SEV-SNP (Secure Nested Paging), Intel TDX (Trusted Domain Extensions) и ARM SME (Scalable Matrix Extension).
В анонсе Линус сообщил, что скорее всего следующему выпуску ядра будет присвоен номер 6.0, так как в ветке 5.x накопилось достаточного выпусков для смены первого числа в номере версии. Смена нумерации осуществляется из эстетических соображений и является формальным шагом, снимающим дискомфорт из-за накопления большого числа выпусков в серии.
Также Линус упомянул, что использовал для формирования релиза ноутбук Apple на базе архитектуры ARM64 (Apple Silicon) с Linux-окружением на базе дистрибутива Asahi Linux. Это не основная рабочая станция Линуса, но он использовал данную платформу, чтобы проверить её пригодность для работы над ядром и быть уверенным в том, что сможет формировать выпуски ядра в поездке, имея под рукой лёгкий ноутбук. До этого много лет назад Линус имел опыт использования оборудования Apple для разработки – когда-то он пользовался компьютером на базе CPU ppc970 и ноутбуком Macbook Air.
Основные новшества в ядре 5.19:
- Дисковая подсистема, ввод/вывод и файловые системы
- Файловая система EROFS (Enhanced Read-Only File System), предназначенная для использования на разделах, доступных в режиме только для чтения, переведена на использование подсистемы fscache, обеспечивающей кэширование данных. Изменение позволило заметно поднять производительность систем, в которых из образа на базе EROFS запускается большое число контейнеров.
- В подсистему fscache добавлен режим чтения по требованию (“on-demand”), который задействован для оптимизации EROFS. Новый режим позволяет организовать кэширование чтения из образов ФС, находящихся в локальной системе. В отличие от изначально доступного режима работы, ориентированного на кэширования в локальной файловой системе данных, передаваемых через сетевые файловые системы, режим “on-demand” делегирует функции извлечения данных и их записи в кэш отдельному фоновому процессу, выполняемому в пространстве пользователя.
- В XFS обеспечена возможность хранения миллиардов расширенных атрибутов в i-node. Максимальное количество экстентов для одного файла увеличено с 4 миллиардов до 247. Реализован режим для атомарного обновления сразу нескольких расширенных атрибутов файла.
- В NFS-сервер добавлен режим продления сохранения состояния блокировки, выставленной клиентом, который перестал отвечать на запросы. Новый режим позволяет задержать очистку блокировки вплоть до суток, если другой клиент не запросит конкурирующую блокировку. В штатном режиме блокировка очищается через 90 секунд после того как клиент перестал отвечать.
- В подсистеме отслеживания событий в ФС fanotify реализован флаг FAN_MARK_EVICTABLE, при помощи которого можно отключить закрепление целевых i-node в кэше, например, для игнорирования подветок без закрепления их частей в кэше.
- Для OverlayFS реализована возможность маппинга идентификаторов пользователей примонтированных файловых систем, применяемого для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
- Память и системные сервисы
- Добавлена начальная поддержка архитектуры набора команд LoongArch, применяемой в процессорах Loongson 3 5000 и реализующей новый RISC ISA, похожий на MIPS и RISC-V. Архитектура LoongArch доступна в трёх вариантах: урезанный 32-разрядный (LA32R), обычный 32-разрядный (LA32S) и 64-разрядный (LA64).
- Удалён код для поддержки формата исполняемых файлов a.out, который был переведён в разряд устаревших в выпуске 5.1. Формат a.out давно не применяется на системах с Linux, а генерация файлов a.out не поддерживается современными инструментальными средствами в конфигурациях для Linux по умолчанию. Загрузчик для a.out файлов может быть реализован целиком в пространстве пользователя.
- Прекращена поддержка загрузочных опций, специфичных для архитектуры x86: nosep, nosmap, nosmep, noexec и noclflush).
- Расширены возможности, связанные с реагированием на выявление расщеплённых блокировок (“split lock”), возникающих при доступе к невыровненным данным в памяти из-за того, что при выполнении атомарной инструкции данные пересекают две линии кеша CPU. Подобные блокировки приводят к значительному падению производительности. Если ранее по умолчанию ядро выдавало предупреждение с информацией о вызвавшем блокировку процессе, то теперь проблемный процесс дополнительно будет замедлен, чтобы сохранить производительность остальной системы.
- Добавлена поддержка реализованного в процессорах Intel механизма
IFS (In-Field Scan), позволяющего запускать низкоуровневые диагностические тесты CPU, способные выявлять проблемы, не определяемые штатными средствами на основе кодов коррекции ошибок (ECC) или битов чётности. Выполняемые тесты оформляются в форме загружаемой прошивки, оформленной по аналогии с обновлениями микрокода. Результаты тестирования доступны через sysfs. - Добавлена возможность встраивания в ядро файла bootconfig, позволяющего помимо опций командной строки определять параметры работы ядра через файл с настройками. Встраивание осуществляется при помощи сборочной опции ‘CONFIG_BOOT_CONFIG_EMBED_FILE=”/PATH/TO/BOOTCONFIG/FILE”‘. Ранее bootconfig определялся через прикрепление к образу initrd. Встраивание в ядре позволяет использовать bootconfig в конфигурациях без initrd.
- Реализована возможность загрузки прошивок, сжатых использованием алгоритма Zstandard. В sysfs добавлен набор управляющих файлов /sys/class/firmware/*, позволяющий инициировать загрузку прошивок из пространства пользователя.
- В интерфейсе асинхронного ввода/вывода io_uring предложен новый флаг IORING_RECVSEND_POLL_FIRST, при выставлении которого сетевая операция вначале будет передана для обработки с использованием полинга (polling), что может сэкономить ресурсы в ситуациях, когда допустима обработка операции с некоторой задержкой. В io_uring также добавлена поддержка системного вызова socket(), предложены новый флаги для упрощения управления файловыми дескрипторами, добавлен режим “multi-shot” для приёма в вызове accept() разом нескольких соединений, добавлены операции для проброса команд NVMe напрямую в устройство.
- Для архитектуры Xtensa обеспечена поддержка отладочного инструмента KCSAN (Kernel Concurrency Sanitizer), предназначенного для динамического выявления состояний гонки внутри ядра. Также добавлена поддержка спящего режима и сопроцессоров.
- Для архитектуры m68k (Motorola 68000) реализована виртуальная машина (симулятор платформы), основанная на эмуляторе Android Goldfish.
- Для архитектуры AArch64 реализована поддержка расширений Armv9-A SME (Scalable Matrix Extension).
- В подсистеме eBPF разрешено хранения типизированных указателей в map-структурах, а также добавлена поддержка динамических указателей.
- Предложен новый упреждающий механизм вытеснения памяти, поддерживающий управление из пространства пользователя при помощи файла memory.reclaim. Запись числа в указанный файл приведёт к попытке вытеснения соответствующего числа байт из набора, связанного с cgroup.
- Повышена точность учёта использования памяти при сжатии данных в разделе подкачки при помощи механизма zswap.
- Для архитектуры RISC-V обеспечена поддержка запуска 32-разрядных исполняемых файлов на 64-разрядных системах, добавлен режим для привязки ограничивающих атрибутов к страницам памяти (например, для запрета кэширования) и реализована функция kexec_file_load().
- Виртуализация и безопасность
- В подсистеме EFI реализована возможность конфиденциальной передачи гостевым системам секретной информации без её раскрытия хост-системе. Данные предоставляются через каталог security/coco в securityfs.
- В режиме защиты Lockdown, который ограничивает доступ пользователя root к ядру и блокирует пути обхода UEFI Secure Boot, устранена лазейка, позволявшая обходить защиту через манипуляции с отладчиком ядра.
- Включены патчи, нацеленные на повышение надёжности и производительности генератора псевдослучайных чисел.
- При сборке при помощи Clang 15 реализована поддержка механизма рандомизации структур ядра.
- В механизм Landlock, позволяющий ограничить взаимодействие группы процессов с внешним окружением, предоставлена поддержка правил, позволяющих контролировать выполнение операций переименования файлов.
- Подсистема IMA (Integrity Measurement Architecture), предназначенная для проверки целостности компонентов операционной системы по цифровым подписям и хэшам, переведена на использование
модуля fs-verity для верификации файлов. - Изменена логика действий при отключении непривилегированного доступа к подсистеме eBPF – ранее отключались все команды, связанные с системным вызовом bpf(), а начиная с версии 5.19 оставлен доступ к командам, которые не приводят к созданию объектов. При подобном поведении для загрузки BPF-программы требуется привилегированный процесс, но затем непривилегированные процессы могут взаимодействовать с этой программой.
- Добавлена поддержка расширения AMD SEV-SNP (Secure Nested Paging), обеспечивающего безопасную работу с вложенными таблицами страниц памяти и защищающего от атак “undeSErVed” и “SEVerity” на процессоры AMD EPYC, позволяющих обойти механизм защиты AMD SEV (Secure Encrypted Virtualization).
- Добавлена поддержка механизма Intel TDX (Trusted Domain Extensions), позволяющий блокировать попытки стороннего доступа к зашифрованной памяти виртуальных машин.
- В драйвер virtio-blk, используемый для эмуляции блочных устройств, добавлена поддержка ввода/вывода с использованием полинга (polling), что по проведённым тестам позволило сократить задержки примерно на 10%.
- Сетевая подсистема
- В состав включена серия патчей BIG TCP позволяющих увеличить максимальный размер пакета TCP-пакета до 4ГБ для оптимизации работы высокоскоростных внутренних сетей дата-центров. Подобное увеличение размера пакета при 16-битном размере поля в заголовке достигается через реализацию “jumbo”-пакетов, размер в IP-заголовке которых выставляется в 0, а фактический размер передаётся в отдельном 32-разрядном поле в отдельном прикреплённом заголовке. При тестировании производительности выставление размера пакета в 185 КБ позволило увеличить пропускную способность на 50% и значительно сократить задержки передачи данных.
- Продолжена работа по интеграции в сетевой стек средств для отслеживания причин отбрасывания пакетов (коды reason). Код причины передаётся во время освобождения памяти, связанной с пакетом, и позволяет учитывать такие ситуации, как отбрасывание пакета из-за ошибок заполнения полей в заголовке, выявление спуфинга фильтром rp_filter, неверная контрольная сумма, нехватка памяти, срабатывание правил IPSec XFRM, неверный номер последовательности TCP и т.п.
- Добавлена поддержка отката соединений MPTCP (MultiPath TCP) на использование обычного TCP, в ситуациях, когда определённые возможности MPTCP не могут быть использованы. MPTCP представляет собой расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам. Добавлен API для управления потоками MPTCP из пространства пользователя.
- Оборудование
- Добавлено более 420 тысяч строк кода, связанных с драйвером amdgpu, из которых около 400 тысяч строк приходится на автоматически сгенерированные заголовочные файлы с данными для регистров ASIC в драйвере для GPU AMD, а ещё 22.5 тысяч строк обеспечивают начальную реализацию поддержки AMD SoC21. Общий размер драйвера для GPU AMD превысил 4 млн строк кода. Кроме SoC21 в драйвере AMD включена поддержка SMU 13.x (System Management Unit), обновлена поддержка USB-C и GPUVM, проведена подготовка к поддержке следующих поколений платформ RDNA3 (RX 7000) и CDNA (AMD Instinct).
- В драйвере i915 (Intel) расширены возможности, связанные с управлением энергопотреблением. Добавлены идентификаторы GPU Intel DG2 (Arc Alchemist), используемых на ноутбуках, обеспечена начальная поддержка платформы Intel Raptor Lake-P (RPL-P), добавлена информация о графических картах Arctic Sound-M), реализован ABI для вычислительных движков, для карт DG2 добавлена поддержка формата Tile4, для систем на базе микроархитектуры Haswell реализована поддержка DisplayPort HDR.
- В драйвере Nouveau осуществлён переход на использование обработчика drm_gem_plane_helper_prepare_fb, для некоторых структур и переменных применено статическое выделение памяти. Что касается использования в Nouveau открытых компанией NVIDIA исходных текстов модулей ядра, то работа пока сводится к выявлению и устранению ошибок. В дальнейшем опубликованную прошивку планируется использовать для повышения производительности драйвера.
Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 5.19 – Linux-libre 5.19-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске проведена чистка драйверов для pureLiFi X/XL/XC и TI AMx3 Wkup-M3 IPC. Обновлён код чистки блобов в драйверах и подсистемах Silicon Labs WFX, AMD amdgpu, Qualcomm WCNSS Peripheral Image Loader, Realtek Bluetooth, Mellanox Spectrum, Marvell WiFi-Ex, Intel AVS, IFS, pu3-imgu drivers. Реализована обработка devicetree-файлов Qualcomm AArch64. Добавлена поддержка новой схемы наименования компонентов Sound Open Firmware. Прекращена чистка драйвера ATM Ambassador, удалённого из ядра. Управление чисткой блобов в HDCP и Mellanox Core перенесено в отдельные теги kconfig.