Релиз ядра Linux 6.8

После двух месяцев разработки Линус Торвальдс представил релиз ядра 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.



Источник: http://www.opennet.ru/opennews/art.shtml? num=60768

© OpenNet