Релиз ядра Linux 6.1

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.1. Среди наиболее заметных изменений: поддержка разработки драйверов и модулей на языке Rust, модернизация механизма определения используемых страниц памяти, специальный менеджер памяти для BPF-программ, система диагностики проблем с памятью KMSAN, механизм защиты KCFI (Kernelk Control-Flow Integrity), внедрение структуры Maple tree.

В новую версию принято 15115 исправлений от 2139 разработчиков,
размер патча – 51 МБ, что примерно в 2 раза меньше размера патчей от ядер 6.0 и 5.19. Изменения затронули 13165 файлов, добавлено 716247 строк кода, удалено 304560 строк. Около 45% всех представленных в 6.1
изменений связаны с драйверами устройств, примерно 14% изменений имеют
отношение к обновлению кода, специфичного для аппаратных архитектур, 14%
связано с сетевым стеком, 3% – с файловыми системами и 3% c внутренними
подсистемами ядра.

Основные новшества в ядре 6.0:

  • Память и системные сервисы
    • Добавлена возможность использования языка Rust в качестве второго языка для разработки драйверов и модулей ядра. Основным мотивом поддержки Rust является упрощение написания безопасных и качественных драйверов устройств за счёт снижения вероятности совершения ошибок при работе с памятью. Поддержка Rust неактивна по умолчанию и не приводит к включению Rust в число обязательных сборочных зависимостей к ядру. В ядро пока принят минимальный урезанный вариант патчей, который сокращён с 40 до 13 тысяч строк кода и обеспечивает только необходимый минимум, достаточный для сборки простого модуля ядра, написанного на языке Rust. В дальнейшем планируется постепенно наращивать имеющуюся функциональность, перенося и другие изменения из ветки Rust-for-Linux. Параллельно развиваются проекты по использованию предложенной инфраструктуры для разработки на языке Rust драйверов накопителей NVMe, сетевого протокола 9p и GPU Apple M1.
    • Для систем на базе архитектур AArch64, RISC-V и LoongArch с EFI реализована возможность прямой загрузки сжатых образов ядра. Добавлены обработчики для загрузки, запуска и выгрузки образов ядра, вызываемые напрямую из EFI zboot. Также добавлены обработчики установки и удаления протоколов из БД протоколов EFI. Ранее распаковка осуществлялась отдельным загрузчиком, а теперь это может делать обработчик в самом ядре – образ ядра формируется в виде EFI-приложения.
    • В состав принята часть патчей с реализацией многоуровневневой модели управления памятью, позволяющей разделять банки памяти с разными характеристиками производительности. Например, наиболее интенсивно используемые страницы могут размещаться в наиболее быстрой памяти, а редко используемые страницы могут хранится в относительно медленной памяти.
      В ядро 6.1 принят механизм для определения нахождения интенсивно используемых страниц в медленной памяти для их продвижения в быструю память, а также реализована общая концепция уровней памяти и их относительной производительности.
    • В состав включён механизм MGLRU (Multi-Generational LRU), который заменил собой старую реализацию LRU (Least Recently Used) на основе двух очередей на многоступенчатую структуру, лучше определяющую какие страницы памяти по настоящему используются, а какие можно вытеснить в раздел подкачки.
    • Добавлена поддержка предложенной инженерами Oracle структуры данных “maple tree“, которая позиционируется как более эффективная замена структуре “red-black tree”. Maple tree представляет собой вариант B-tree, поддерживающий индексацию по диапазонам значений и спроектированный для эффективного использования кэша современных процессоров. На maple tree уже переведены некоторые подсистемы управления памятью, что положительно отразилось на их производительности. В будущем maple tree может использоваться для реализации блокировок по диапазонам (range locking).
    • В подсистему BPF добавлена возможность создания “деструктивных” BPF-программ, специально рассчитанных на инициирование аварийного завершения работы через вызов crash_kexec(). Подобные BPF-программы могут потребоваться в отладочных целях для инициирования создания crash-дампа в определённый момент времени. Для доступа к деструктивным операциям при загрузке BPF-программы требуется указание флага BPF_F_DESTRUCTIVE, активация sysctl kernel.destructive_bpf_enabled и наличие прав CAP_SYS_BOOT.
    • Для BPF-программ предоставлена возможность перебора элементов cgroup, а также перебора ресурсов (файлы, vma, процессы и т.п.) определённого потока или задачи. Реализован новый map-тип для создания пользовательских кольцевых буферов (user ring buffer).
    • Добавлен специальный вызов для выделения памяти в BPF-программах (memory allocator), который обеспечивает более безопасное распределение памяти в контексте BPF, чем штатный kmalloc().
    • Интегрирована первая часть изменений, обеспечивающих возможность создания драйверов для устройств ввода с интерфейсом HID (Human Interface Device), реализуемых в форме BPF-программ.
    • Из ядра полностью удалён код для поддержки формата исполняемых файлов a.out, который был переведён в разряд устаревших в выпуске 5.1, а начиная с версиях 5.18 и 5.19 был отключён для основных архитектур. Формат a.out давно не применяется на системах с Linux, а генерация файлов a.out не поддерживается современными инструментальными средствами в конфигурациях для Linux по умолчанию. Загрузчик для a.out файлов может быть реализован целиком в пространстве пользователя.
    • Для систем на базе архитектуры набора команд LoongArch, применяемой в процессорах Loongson 3 5000 и реализующей новый RISC ISA, похожий на MIPS и RISC-V, реализована поддержка событий измерения производительности (perf event), kexec, kdump и JIT-компиляции BPF.
    • В интерфейсе асинхронного ввода/вывода io_uring предложен новый режим IORING_SETUP_DEFER_TASKRUN, позволяющий временно отложить выполнение связанных с кольцевым буфером работ до момента, пока не поступит запрос от приложения, что может использоваться для организации выполнения работ в пакетном режиме и предотвращения проблем с задержками из-за вытеснения приложения в неподходящий момент.
    • Процессам в пространстве пользователя предоставлена возможность инициирования преобразования диапазона обычных страниц памяти в набор больших страниц памяти (Transparent Huge-Pages).
    • Добавлена реализация устройства /dev/userfaultfd, позволяющего организовать доступ к функциональности системного вызова userfaultfd() с использованием прав доступа в ФС. Функциональность userfaultfd позволяет создавать обработчики обращений к невыделенным страницам памяти (page faults) в пространстве пользователя.
    • Повышены требования к версии утилиты GNU Make – для сборки ядра теперь требуется как минимум версия 3.82.
  • Дисковая подсистема, ввод/вывод и файловые системы
    • В файловую систему Btrfs внесены существенные оптимизации производительности, среди прочего на порядки увеличена производительность ioctl-вызова FIEMAP. Добавлена поддержка асинхронной буферизированной записи для приложений, использующих io_uring. В операцию “send” добавлена поддержка файлов, защищённых при помощи fs-verity.
    • В ФС ext4 добавлены оптимизации производительности, связанные с поддержанием журнала и работой в режиме только для чтения.
    • В файловой системе EROFS (Enhanced Read-Only File System), предназначенной для использования на разделах, доступных в режиме только для чтения, реализована возможность совместного хранения данных, дублирующихся в разных ФС.
    • В системный вызов statx() добавлена возможность вывода сведений о возможности применения к файлу прямого ввода/вывода.
    • В подсистему FUSE (Filesystems in User Space) добавлена поддержка создания временных файлов с флагом O_TMPFILE.
  • Виртуализация и безопасность
    • Заменена реализация механизма защиты CFI (Control Flow Integrity), добавляющего перед каждым косвенным вызовом функции проверки для выявления некоторых форм неопределённого поведения, которые потенциально могут привести к нарушению нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции. Штатная реализация CFI от проекта LLVM заменена на вариант, также основанный на использовании Clang, но специально адаптированный для защиты низкоуровневых подсистем и ядер операционных систем. В LLVM новая реализация будет предложена в выпуске Clang 16 и будет включаться опцией “-fsanitize=kcfi”. Ключевым отличием новой реализации является то, что она не привязана к оптимизациям на этапе связывания (LTO) и не приводит к замене указателей функций на ссылки в таблице переходов.
    • Для LSM-модулей (Linux Security Module) предоставлена возможность создания обработчиков, перехватывающих операции по созданию пространств имён.
    • Предоставлены средства для верификации цифровых подписей PKCS#7 в BPF-программах.
    • В /dev/random возвращена возможность открытия в неблокирующем режиме (O_NONBLOCK), которая была по недосмотру удалена в ядре 5.6.
    • На системах с архитектурой x86 добавлен вывод предупреждения в случае маппинга подсистемами ядра страниц памяти, одновременно допускающими исполнение и запись. В дальнейшем рассматривается возможность полностью запретить подобный маппинг памяти.
    • Добавлен отладочный механизм KMSAN (Kernel Memory Sanitizer) для выявления использования неинициализированной памяти в ядре, а также утечек неинициализированной памяти между пространством пользователя и устройствами.
    • Внесены улучшения в криптонадёжный генератор псевдослучайных чисел CRNG, используемый в вызове getrandom. Изменения подготовлены Джейсоном Доненфилдом (Jason A. Donenfeld), автором VPN WireGuard и нацелены на повышение безопасность извлечения псевдослучайных целых чисел.
  • Сетевая подсистема
    • В TCP-стеке реализована возможность (отключена по умолчанию) раздельного использования хэш-таблиц сокетов для каждого пространства имён, что позволяет повысить производительность систем с большим числом пространств имён.
    • Удалён код для поддержки устаревшего протокола DECnet. Для пространства пользователя оставлены заглушки API, позволяющие компилировать приложения, использующие DECnet, но данные приложения не смогут подключиться к сети.
    • Документирован протокол netlink.
  • Оборудование
    • В драйвере amdgpu добавлена поддержка проброса DSC (Display Stream Compression) для сжатия данных без потерь при обмене информацией с экранами, поддерживающими очень большое разрешение. Продолжена работа по обеспечению поддержки платформ AMD RDNA3 (RX 7000) и CDNA (Instinct). Добавлена поддержка IP-компонентов DCN 3.2, SMU 13.x, NBIO 7.7, GC 11.x, PSP 13.x, SDMA 6.x и GMC 11.x. В драйвере amdkfd (для дискретных GPU AMD, таких как Polaris) реализована поддержка GFX 11.0.3.
    • В драйвере i915 (Intel) включена поддержка GPU Meteor Lake. Для Meteor Lake и более новых GPU обеспечена поддержка интерфейса DP 2.0 (DisplayPort). Добавлены идентификаторы для видеокарт на базе микроархитектуры Alder Lake S.
    • Добавлена поддержка звуковых подсистем, реализованных в процессорах Apple Silicon, Intel SkyLake и Intel KabyLake. В звуковом драйвере CS35L41 HDA обеспечена поддержка перехода в спящий режим.
      Добавлена поддержка ASoC (ALSA System on Chip) для встроенных звуковых чипов Apple Silicon, AMD Rembrant DSPs, AMD Pink Sardine ACP 6.2, Everest ES8326, Intel Sky Lake и Kaby Lake, Mediatek MT8186, NXP i.MX8ULP DSPs, Qualcomm SC8280XP, SM8250, SM8450 и Texas Instruments SRC4392
    • Добавлена поддержка LCD-панелей Samsung LTL101AL01, B120XAN01.0,
      R140NWF5 RH, Densitron DMT028VGHMCMI-1A TFT, AUO B133UAN02.1, IVO M133NW4J-R3, Innolux N120ACA-EA1, AUO B116XAK01.6, BOE NT116WHM-N21, INX N116BCA-EA2, INX N116BCN-EA1, Multi-Inno Technology MI0800FT-9.
    • Добавлена поддержка AHCI SATA-контроллеров, используемых в SoC Baikal-T1.
    • Добавлена поддержка Bluetooth-чипов MediaTek MT7921, Intel Magnetor (CNVi, Integrated Connectivity), Realtek RTL8852C, RTW8852AE и RTL8761BUV (Edimax BT-8500).
    • В драйвер ath11k для беспроводных модулей Qualcomm добавлена поддержка спектрального сканирования в диапазоне 160 MHz, реализован многопоточный NAPI, улучшена поддержка Wi-Fi чипов Qualcomm WCN6750.
    • Добавлены драйверы для клавиатуры к PinePhone, тачпадов InterTouch (ThinkPad P1 G3), X-Box Adaptive Controller, PhoenixRC Flight Controller, VRC-2 Car Controller, DualSense Edge Controller, управляющих панелей IBM (IBM Operation Panel), пультов XBOX One Elite, планшетов XP-PEN Deco Pro S и Intuos Pro Small (PTH-460).
    • Добавлен драйвер для криптографических ускорителей Aspeed HACE (Hash and Crypto Engine).
    • Добавлена поддержка интегрированных Thunderbolt/USB4 контроллеров Intel Meteor Lake.
    • Добавлена поддержка смартфонов Sony Xperia 1 IV, Samsung Galaxy E5, E7 и Grand Max, Pine64 Pinephone Pro.
    • Добавлена поддержка ARM SoC и плат: AMD DaytonaX, Mediatek MT8186, Rockchips RK3399 и RK3566, TI AM62A, NXP i.MX8DXL, Renesas R-Car H3Ne-1.7G, Qualcomm IPQ8064-v2.0, IPQ8062, IPQ8065, Kontron SL/BL i.MX8MM OSM-S, MT8195 (Acer Tomato), Radxa ROCK 4C+, NanoPi R4S Enterprise Edition, JetHome JetHub D1p. Обновлены драйверы для SoC Samsung, Mediatek, Renesas, Tegra, Qualcomm, Broadcom и NXP.

Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 6.1Linux-libre 6.1-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске проведена чистка нового драйвера rtw8852b и DTS-файлов для разных SoC Qualcomm и MediaTek с процессорами на базе архитектуры AArch64. Обновлён код чистки блобов в драйверах и подсистемах amdgpu, i915, brcmfmac, r8188eu, rtw8852c, Intel ACPI. Откорректирована чистка устаревших драйверов tm6000 TV cards, cpia2 v4l, sp8870, av7110.

Release. Ссылка here.