После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.8. Среди наиболее заметных изменений: драйвер Xe для GPU Intel, режим защиты блочных устройств с примонтированными ФС, механизм планировщика задач Deadline server, автоматическая оптимизация слияния идентичных страниц памяти, первый драйвер на языке Rust, системные вызовы listmount и statmount, удаление bpfilter и SLAB, механизм guest_memfd в KVM, профилирование обращения к данным.
В новую версию принято 15641 исправлений от 2018 разработчиков,
размер патча – 44 МБ (изменения затронули 12212 файлов, добавлено 663864 строк кода, удалено 339094 строк). В прошлом выпуске было 18405 исправлений от 2066 разработчиков, размер патча – 72 МБ. Около 42% всех представленных в 6.8 изменений связаны с драйверами устройств, примерно 15% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 14% связано с сетевым стеком, 6% – с файловыми системами и 3% c внутренними подсистемами ядра.
Основные новшества в ядре 6.8:
- Дисковая подсистема, ввод/вывод и файловые системы
- Добавлен режим блокирования прямой записи на блочные устройства, на которых имеются примонтированные файловые системы (после включения режима, пользователь root не сможет внести изменения в ФС через манипуляции на уровне блочного устройства). По умолчанию режим отключён и требует указания параметра BLK_DEV_WRITE_MOUNTED при сборке. Для разделов с Btrfs блокировка пока не работает, так как в код Btrfs ещё не приняты необходимые изменения.
- Добавлены системные вызовы listmount() и statmount(), позволяющие из пространства пользователя получить детальную информацию о примонтированных файловых системах.
- В файловой системе XFS продолжена работа над реализацией возможности применения утилиты fsck для проверки и исправления выявленных проблем в online-режиме, без отмонтирования файловой системы.
- В Ext4 для блоков размером меньше страницы памяти задействован вызов dioread_nolock, позволяющий повысить производительность, благодаря избавлению от лишних блокировок. Некоторые функции переведены на использование фолиантов страниц памяти (page folios).
- В Btrfs добавлена поддержка флага монтирования “nospace_cache” для отключения кэша свободных блоков.
- Для ФС SMB реализована возможность создания блочных и символьных файлов устройств.
- В Bcachefs добавлена частичная поддержка проверки и восстановления целостности примонтированных ФС.
- В подсистеме device-mapper прекращена поддержка обработчиков MD_LINEAR, MD_MULTIPATH и MD_FAULTY, объявленных устаревшими в 2021 году.
- Память и системные сервисы
- В подсистему Zswap добавлена активируемая при нехватке оперативной памяти возможность принудительной выгрузки в реальный раздел подкачки “холодных” страниц памяти, к которым не было обращения и которые скорее всего останутся невостребованными. Zswap выполняет кэширование вытесняемых в раздел подкачки страниц, храня их в оперативной памяти в сжатом виде по возможности без сброса в реальный несжатый раздел подкачки на диске. Внесённые изменения при нехватке памяти позволяют уменьшить размер хранимого в ОЗУ пула Zswap и высвободить память системе.
- В Zswap предложен новый режим, который полностью отключает отложенную запись (writeback) в реальный раздел подкачки, если попытка записи не увенчалась успехом, и не сбрасывает уже имеющиеся в пуле zswap страницы в раздел подкачки.
- В планировщик задач добавлен механизм SCHED_DEADLINE server, решающий проблему с недополучением ресурсов CPU обычными задачами в условиях монополизации CPU высокоприоритетными (realtime) задачами. Для предотвращения монополизации CPU в ядре ранее использовался механизм Realtime throttling, который пытался резервировать 5% для низкоприоритетных задач, оставляя 95% времени realtime-задачам. Данный механизм оставлял желать лучшего так как обычные задачи во многих ситуациях недополучали процессорное время. SCHED_DEADLINE server реализует более эффективный механизм резервирования ресурсов.
- В подсистему DAMON (Data Access MONitor), позволяющую отслеживать доступ процесса к данным в оперативной памяти (например, можно узнать к каким областям памяти обращался процесс, а какие области памяти остались невостребованными), добавлен механизм автоматической настройки агрессивности потребления памяти на основе заданных квот.
- Добавлена поддержка многоразмерных больших страниц памяти (mTHP – multi-size Transparent Huge Pages), позволяющая выделать память в блоках, размером больше базовой страницы, но меньше традиционной THP-страницы.
- Добавлена поддержка крупных фолиантов (page folios, объединённые страницы памяти) для анонимной памяти (не привязанной к ФС, например, выделенной через malloc). Изменение нацелено на повышение производительности за счёт выделения больших кусков памяти во время обращения к невыделенным страницам памяти (page faults). Например, использование крупных фолиантов позволило на 5% сократить время пересборки ядра (при сокращении времени проводимого на уровне ядра на 40%).
- В файл конфигурации ядра добавлен параметр TRANSPARENT_HUGEPAGE_NEVER, дающий возможность отключить использование больших страниц памяти (Transparent Huge Pages).
- В системный вызов userfaultfd(), дающий возможность создавать обработчики обращений к невыделенным страницам памяти (page faults) в пространстве пользователя, добавлена операция UFFDIO_MOVE, позволяющая при упаковке кучи (heap compaction) перемещать страницы памяти в виртуальном адресном пространстве без выполнения операции выделения страницы памяти. В проведённых тестах применение UFFDIO_MOVE позволило на 40% снизить время упаковки по сравнению с использованием операции UFFDIO_COPY.
- Добавлен механизм “KSM advisor“, позволяющий автоматически оптимизировать параметры подсистемы слияния идентичных страниц памяти (KSM – Kernel Samepage Merging).
- Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). В новой версии включены изменения, добавляющие Rust-обвязку над уровнем абстракции phylib и использующий данную обвязку драйвер ax88796b_rust, обеспечивающий поддержку PHY-интерфейса Ethernet-контроллера Asix AX88772A (100MBit). По функциональности драйвер на Rust полностью эквивалентен старому драйверу ax88796b, написанному на языке Си, и может быть использован с сетевыми картами X-Surf 100, оснащёнными чипом AX88796B. Для архитектуры LoongArch предоставлена возможность написания модулей на языке Rust. Осуществлён переход на использование выпуска Rust 1.74.1.
- Добавлен механизм BPF token, позволяющий выборочно делегировать обработку отдельных возможностей BPF, таких как загрузка программы BPF или создание BPF map, непривилегированным процессам в пространстве пользователя, достоверность которых подтверждена специальным токеном.
- Расширена функциональность верификатора BPF-программ.
- В утилиту perf добавлена поддержка профилирования данных, позволяющая отслеживать чтение и запись в структуры данных, например, с целью выявления наиболее активно модифицируемых полей в структурах. На системах с процессорами, поддерживающими сбор информации об операциях с памятью (Intel, AMD, ARM), для накопления статистики следует использовать команду “perf mem record”, а для вывода отчёта об обращениях к структурам данных – “perf annotate –data-type”.
- Предоставлена возможность изменения размера буферов трассировки, применяемых для буферизации информации о событиях трассировки, передаваемых в пространство пользователя.
- Удалён ранее объявленный устаревшим механизм распределения памяти SLAB, вместо которого в ядре теперь используется только SLUB. В качестве причины называются проблемы с сопровождением, наличие проблем в коде и дублирование функциональности с более совершенным аллокатором SLUB.
- При сборке ядра включён флаг “-Wmissing-prototypes“, генерирующий предупреждения для вызовов глобальных функций, которые не имеют определения прототипа.
- Для архитектуры RISC-V на системах с поддержкой расширения SUSP SBI реализована поддержка перехода в ждущий режим с сохранением состояния в ОЗУ. Предоставлена возможность использования системного вызова riscv_hwprobe() для получения информации о поддерживаемых расширениях архитектуры набора команд RISC-V.
- Виртуализация и безопасность
- Добавлены новые системные вызовы lsm_list_modules(), lsm_get_self_attr() и lsm_set_self_attr() для вывода списка загруженных LSM-модулей (Linux Security Modules) и получения/выставления атрибутов LSM-модуля. Добавлена новая структура lsm_ctx для коммуникации в контексте LSM между пространством пользователя и ядром.
- Подсистема AppArmor переведена на использование для верификации правил алгоритма SHA-256, вместо хэшей SHA-1.
- Из ядра удалена реализация функции strlcpy(), которая летом была включена в состав Си-библиотеки Glibc 3.38. Strlcpy является альтернативой функции strncpy(), содержащей защиту от переполнения буфера и обязательно выставляющей замыкающий строку нулевой байт.
- В гипервизор KVM добавлена поддержка подсистемы guest_memfd (guest-first memory), предоставляющая функции управления памятью, позволяющие реализовать возможности и оптимизации, недостижимые при использование общей подсистемы управления памятью. Например, guest_memfd даёт возможность выделить и отразить на гостевую систему область память, недостижимую для хост-окружения, что может использоваться для организации конфиденциальных вычислений.
- В гипервизор KVM для систем на базе архитектуры ARM64 добавлена поддержка 52-разрядных (LPA2) физических адресов. Для систем с архитектурой x86 предоставлена возможность сборки без эмуляции гипервызовов Hyper-V, позволяющая сократить размер ядра.
- На стороне хост-окружения реализована поддержка механизма Intel TDX (Trusted Domain Extensions), позволяющего при использовании гипервизора KVM создавать защищённые гостевые окружения, в которых используется шифрование памяти виртуальных машин.
- В SELinux добавлен SID-идентификатор “init”, позволяющий выделить запускаемые на начальном этапе загрузки процессы, запущенные до применения политик SELinux. Усовершенствован интерфейс /sys/fs/selinux для управления SELinux.
- Сетевая подсистема
- Проведена низкоуровневая реорганизация базовых сетевых структур данных, выполненная для повышения эффективности кэширования. Ранее поля в структурах сетевого стека socks, netdev, netns и mibs располагались по мере добавления, что ограничивало использование процессорного кэша. Пересмотр размещения переменных в структурах привёл к заметному увеличению скорости работы TCP, благодаря минимизации использование строк кэша на стадии передачи данных и оптимизации доступа к переменным. В случаях обработки множества параллельных TCP-соединений ускорение может достигать 40%.
- Удалена подсистема bpfilter, использующая BPF для фильтрации пакетов. Bpfilter поставлялся начиная с выпуска 4.18, но так и не был доведён до уровня, пригодного для широкого использования. В последние годы код bpfilter в ядре не развивался, а разработка продолжалась компанией Facebook в отельном репозитории.
- Оборудование
- В состав включён новый drm-драйвер (Direct Rendering Manager)Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake. Драйвер Xe позиционируется как основа для обеспечения работы новых чипов, не привязанная к коду для поддержки старых платформ. Драйвер построен с использованием новой архитектуры, в которой более активно используются уже существующие компоненты подсистемы DRM, а также типовые компоненты драйвера i915, не привязанные к конкретным GPU, например, код для взаимодействия с экранами, модель памяти и реализация execbuf. В Mesa работа OpenGL и Vulkan поверх драйвера Xe реализована на уровне изменений, внесённых в существующие Mesa-драйверы Iris и ANV.
- В драйвере i915 продолжена работа по реализации поддержки чипов Intel LunarLake (Xe 2). Улучшена поддержка чипов Intel Meteor Lake.
- В драйвере Nouveau реализована настройка для использования по умолчанию функций прошивки GSP для работы с GPU NVIDIA на базе микроархитектур Turing и Ampere, в которых операции инициализации и управления GPU выполняются отдельным микроконтроллером GSP (GPU System Processor). При включении настройки драйвер будет работать через обращение к прошивке, вместо прямого программирования операций взаимодействия с оборудованием.
- В драйвере AMDGPU реализована поддержка ACPI WBRF и VPE DPM, изменена обработка скорости канала PCIe, в применяемых для синхронизации очередях задействованы 64-разрядные порядковые номера, добавлена поддержка специфичных для AMD механизмов управления цветом, решена проблемы с переходом в спящий режим.
- Добавлена начальная реализация драйвера для GPU Broadcom VideoCore 7.1, используемого в платах Raspberry Pi 5.
- Добавлен драйвер для GPU серии PowerVR 6 на базе микроархитектуры Rogue от компании Imagination Technologies.
- Добавлены драйверы для камер на базе чипов Starfive, GalaxyCore GC2145/GC0308, Chips&Media Wave и THine THP7312.
Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 6.8 – Linux-libre 6.8-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.8 обновлён код чистки блобов в различных драйверах и подсистемах. Проведена чистка драйверов Intel qat_420xx, Imagination PowerVR, Intel Xe, Chips&Media Wave5, Intel VSC, Aquantia PHY и Realtek rtw8922a. В связи с удалением из ядра прекращена чистка драйверов atmel, hermes, orinoco_usb, libertas_cs и zd1201. Проведена чистка имён блобов в dts-файлах (devicetree) для архитектур ARM и Aarch64. Устранены проблемы с чисткой драйвера i915.