Релиз ядра Linux 7.2

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 7.2. Среди наиболее заметных изменений: механизм потоковой передачи данных USB4STREAM, планировщик распределения ресурсов GPU, оптимизации производительности btrfs, xfs и ext4, продолжение удаления кода для поддержки CPU i486, возможность создания вложенных планировщиков SCHED_EXT, снижено потребление памяти в подсистеме подкачки, ускорены неименованные каналы, поддержка расширений Intel MBEC и AMD GMET в KVM, удаление протокола AppleTalk, начальная поддержка HDMI 2.1 FRL в драйвере AMDGPU.

Основные новшества в ядре 7.2 (1, 2, 3):

  • Дисковая подсистема, ввод/вывод и файловые системы
    • В механизме iomap убран лишний вызов функции memset для уже завершённых итераций в функции iomap_iter(), что при высокой интенсивности ввод/вывода на быстрых накопителях NVMe повысило в проведённых тестах число операций ввод/вывода в секунду (IOPS) на 5% при использовании ФС ext4 и xfs.
    • В XFS объявлена стабильной поддержка зонированных устройств хранения (разделение на зоны групп блоков или секторов, в которые допускается лишь последовательное добавление данных с обновлением целиком всей группы блоков).
    • В Btrfs включена по умолчанию поддержка больших фолиантов страниц памяти (large folios), позволяющая снизить накладные расходы и повысить производительность при интенсивном последовательном вводе/выводе. Добавлена экспериментальная поддержка огромных фолиантов («huge folios»), размером до 2 МБ. Добавлен новый ioctl GET_CSUMS для получения информации о контрольных суммах в пользовательском пространстве, например, для утилиты mkfs и оптимизации дедупликации. Повышена производительность последовательной записи данных на 15% и прямого ввода/вывода на 59%.
    • В ФС Ext4 значительно переработана реализация механизма «fast commit» для исключения возникновения конкурирующих и взаимных блокировок. Добавлен экспорт статистики о снапшотах inode через
      /proc/fs/ext4/*/fc_info. Оптимизирована производительность вычисления хэшей директорий (для имён размером 255 символов ускорение почти в два раза, 64 символа 27%, 32 символа — 11%).

    • В F2FS добавлена поддержка возвращения ошибок fserror, позволяющих из пользовательского пространства отслеживать проблемы с ФС. Сокращено время проводимое в контексте обработки прерываний.
    • В Device Mapper (DM) добавлен новый обработчик dm-inlinecrypt для организации прозрачного шифрования и расшифровки блочных устройств, используя аппаратные устройства с функцией inline-шифрования.
    • Предложена документация по добавлению в ядро новых файловых систем.
    • В NFS размер блока по умолчанию увеличен до 4 МБ на системах, имеющих как минимум 16 ГБ ОЗУ (для ручного изменения размера блока можно использовать /proc/fs/nfsd/max_block_size). Добавлена поддержка делегирования управления директорией клиенту (directory delegation), что позволяет определённое время выполнять операции с данной директорией без проверки изменения состояния на сервере.
    • В сервере SMB добавлена поддержка файлов, хранимых в сжатом виде, а также сжатия данных при их передаче по сети.
    • В новой реализации NTFS (ntfsplus) добавлена поддержка символических ссылок Windows и обеспечена корректная обработка многих видов повреждений метаданных.
    • Удалён бэкенд fscache для кэширования данных ФС EROFS (Enhanced Read-Only File System), который был объявлен устаревшим два года назад.
    • В ФС Ceph добавлена поддержка ручного сброса клиентских сеансов.
    • В файловую систему 9P внесены оптимизации, ускорившие работу в таких сценариях, как сборка проектов.
    • В системный вызов file_getattr() добавлены флаги для получения информации об учёте регистра символов в файловой системе. Флаг FS_XFLAG_CASEFOLD свидетельствует, что проверка имён файлов осуществляется без учёта регистра символов, а флаг FS_XFLAG_CASENONPRESERVING о том, что при создании новых имён файлов не сохраняется информация регистре символов. Указанные флаги могут применяться в NFS-клиентах, работающих без учёта регистра символов.
    • В системный вызов openat2() добавлен флаг O_EMPTYPATH, допускающий передачу пустого файлового пути. В этом случае путь к открываемому файлу определяется на основании переданного файлового дескриптора.
    • В системный вызов openat2() добавлен флаг OPENAT2_REGULAR, допускающий открытие только обычных файлов (при попытке открытия специального файла, например, сокета, канала или устройства, будет возвращена ошибка EFTYPE).
  • Память и системные сервисы
    • Реализован механизм USB4STREAM для потоковой передачи данных между компьютерами, соединёнными кабелем через порты USB4. Добавлено устройство /dev/tbstreamX, при помощи которого можно читать и записывать данные, используя штатные функции read() и write() по аналогии с чтением и записью в файлы. Например, на одном хосте можно отправить информацию командой «echo hello › /dev/tbstream0», а на другом прочитать командой «cat /dev/tbstream0». Механизм USB4STREAM может совмещаться с возможностью установки сетевого соединения по кабелю USB4 (thunderbolt_net) или использоваться отдельно при необходимости передачи данных между приложениями, не поддерживающими сетевые сокеты.
    • Включена вторая серия изменений для прекращения поддержки процессоров i486. Удалено более 13 строк кода, связанных с эмуляцией блока для вычислений с плавающей запятой для процессоров без FPU.
      Удалена поддержка процессоров i486 без аппаратных операций CX8 (сравнить и обменять 8 байт) и TSC (счётчик циклов CPU, используемый в планировщике задач), код для эмуляции которых удалён.

    • Объявлена оставшейся без сопровождения (orphaned) поддержка процессоров AMD Geode, применяемых в компьютере OLPC XO-1.
    • Добавлена поддержка обновления реализации механизма Intel TDX (Trusted Domain Extensions), применяемого для шифрования оперативной памяти гостевых систем. TDX реализован в форме специального программного runtime-модуля, который во время начальной загрузки переносится BIOS из Flash-памяти в оперативную память. В ядро добавлены возможности для управления этим модулем и замены на более новую версию на работающей системе без необходимости выполнения перезагрузки.
    • Добавлен новый планировщик распределения ресурсов GPU (Fair GPU scheduler), применяемый для определения порядка выполнения на GPU работ, отправляемых процессами, использующими GPU. Вместо применения традиционной FIDO-очереди запросов к GPU в новом планировщике задействованы механизмы справедливого распределения ресурсов, реализованные с оглядкой на планировщик задач CFS (Completely Fair Scheduler) применяющий план запуска с временем перехода к выполнению очередного процесса. Наиболее заметный эффект от использования нового планировщика наблюдается при параллельном выполнении интерактивных задач, активно работающих с GPU.
    • Изменения в подсистеме eBPF: Добавлена возможность прикрепления одной BPF-программы нескольким точкам трассировки (tracepoint). В BPF-программы, привязанные к точкам трассировки, добавлена возможность доступа к памяти компонентов, работающих в пользовательском пространстве, с корректной обработкой обращения к невыделенным страницам памяти (page fault). В системный вызов bpf() добавлена поддержка типовых атрибутов (log_buf, log_size, log_level и log_true_size), которая позволяет унифицировать передачу метаданных во всех командах BPF, не ограничиваясь командами BPF_PROG_LOAD, BPF_BTF_LOAD и BPF_MAP_CREATE. Убрано ограничение на передачу не более 5 параметров в функции BPF. Добавлена возможность безопасного доступа к разделяемой памяти bpf_arena без опасения обращения к невыделенным страницам памяти (page fault). Реализован новый вариант структуры BPF hash map, допускающий динамическое изменение размера.
    • Оптимизировано формирование вывода «/proc/interrupts» со статистикой прерываний, а также модернизированы структуры для хранения счётчиков прерываний и добавлено кэширование.
    • Ускорена генерация файла «/proc/filesystems», используемого в libselinux.
    • В планировщике задач реализована поддержка балансировки нагрузки между ядрами CPU, учитывающей состояния внутреннего кэша процессора. Планировщик теперь пытается группировать процессы, использующие общие ресурсы, например, потоки одного процесса, для их использования в контексте одного и того же кэша верхнего уровня, что повышает эффективность обращения к данным за счёт повышения вероятности нахождения в кэше необходимых данных.
    • В механизме SCHED_EXT, позволяющем использовать BPF для создания планировщиков CPU, продолжена реализация возможности для создания вложенных планировщиков (sub-scheduler), при помощи которых для каждого cgroup можно задействовать собственный планировщик задач.
    • Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Возможность использования Rust в ядре реализована для архитектуры s390. В состав включён пакет «zerocopy» с быстрыми примитивами работы с памятью для кода в режиме «unsafe».
    • Минимальная версия инструментария LLVM, необходимая для сборки ядра, повышена до 17.0.1.
    • В минималистичной Си-библиотеке nolibc, поставляемой в составе исходных текстов ядра Linux и предоставляющей обвязку над базовыми системными вызовами, реализована поддержка архитектур OpenRISC и 32-bit PA-RISC.
    • В подсистему подкачки (swap) внесены оптимизации, повышающие производительность и снижающие потребление памяти в самой подсистеме за счёт исключения накладных расходов при хранении статических метаданных и унификации работы с анонимной и разделяемой памятью при использовании фолиантов. Снижение потребления памяти достаточно существенно, например, при монтировании раздела подкачки размером 1 ТБ наблюдается снижение потребления памяти примерно на 512 МБ.
    • Повышена эффективность механизма вытеснения памяти, удаляющего или переносящего в раздел подкачки области памяти для высвобождения памяти при её нехватке в системе. В некоторых видах нагрузки, например, при тестировании MongoDB при помощи YCSB (Yahoo! Cloud Serving Benchmark), наблюдается прирост производительности до 30%.
    • В сборочную систему добавлена команда «make sbom» для генерации списков SBOM (Software Bill Of Materials), отражающих задействованные в текущей сборке ядра компоненты, библиотеки и зависимости, а также информацию об их лицензиях, полученную из заголовков SPDX в файлах с кодом.
    • В реализации неименованных каналов (pipe) проведена оптимизация работы с блокировками (операции выделения памяти вынесены за область действия блокировки), что на 21-48% повысило пропускную способность неименованных каналов и на 17-33% снизило задержки.
  • Виртуализация и безопасность
    • В механизм распределения памяти slab (slab allocator) добавлена возможность использования токенов выделения памяти (Allocation Token), реализованных в компиляторе Clang 22. Токены позволяют маркировать уникальными идентификаторами операции выделения памяти и организовать раздельное размещение различных типов объектов для усложнения эксплуатации уязвимостей, вызванных переполнением буфера (при разделении переполнение буфера в одном типе объектов не так просто использовать для повреждения других типов объектов).
    • Механизм AF_ALG, эксплуатируемый в уязвимости Copy Fail для модификации данных в страничном кэше, объявлен устаревшим и намечен для удаления в одном из будущих выпусков. AF_ALG позволяет задействовать аппаратные ускорители для криптографических вычислений в Crypto API ядра, но применяется в достаточно специфичных ситуациях. В ядре 7.2 в AF_ALG удалена поддержка асинхронного ввода/вывода, старых драйверов и механизма zero-copy в реализации skcipher и aead. Оставлены только программные реализации криптоалгоритмов, а поддержка аппаратных криптоускорителей в crypto API ядра удалена, так как AF_ALG существенно расширяет поверхность атаки, но не даёт выигрыша в производительности, по сравнению в реализацией криптографии в пользовательском пространстве.
      AF_ALG использовался в инструментарии Cryptsetup, но его поддержка была удалена в недавнем выпуске 2.8.7.

    • В механизм IMA (Integrity Measurement Architecture), позволяющий внешнему сервису верифицировать состояние подсистем ядра для того чтобы убедиться в их подлинности, добавлена поддержка экспорта внутренних таблиц с результатами измерений в пользовательское пространство с удалением из буферов ядра для экономии памяти.
    • В модуль Landlock, предоставляющий непривилегированным программам средства для ограничения использования объектов ядра Linux (иерархии файлов, сетевые сокеты, ioctl и т.п), добавлена поддержка управления доступом к UDP-сокетам, а также возможность выборочного отключения вывода в лог сведений о блокировке объектов для предотвращения захламления лога несущественной информацией.
    • Ядро избавлено от использования функции
      strncpy(), копирующей заданное число байт из входящей строки. Применение strncpy() создавало опасность возникновения ошибок из-за пропуска нулевого символа в конце строки или добавочного заполнения нулями. Вместо strncpy() рекомендовано использовать функции strscpy() и strscpy_pad() для копирования строк, завершающихся нулевым символом, а также strtomem_pad(), memcpy_and_pad() и memcpy() для копирования строк известного фиксированного размера. Работа по избавлению ядра от использования strncpy() была начата в 2020 году и потребовала принятия
      362 изменений от 70 разработчиков.

    • В гипервизор KVM добавлена поддержка расширений Intel MBEC (Mode-Based Execution Control) и AMD GMET (Guest-Mode Execution Trap), позволяющих в таблицах трансляции памяти раздельно обрабатывать права на выполнение кода для ядра и пространства пользователя в гостевых системах. Ранее расширения аппаратной виртуализации Intel и AMD позволяли пометить страницы памяти доступными для исполнения только одним битом с программным разделением прав для ядра и пространства пользователя на уровне гипервизора. Использование MBEC и GMET даёт возможность исключить проверки полномочий на стороне гипервизора и значительно сократить интенсивность ресурсоёмкой передачи управления от гостевой системы к гипервизору VMexit.
  • Сетевая подсистема
    • Реализация расширения TCP-AO (TCP Authentication Option, RFC 5925) переведена на использование новой криптографической библиотеки libcrypto, что позволило упростить код и повысить эффективность работы. TCP-AO даёт возможность верифицировать TCP-заголовки по MAC-кодам (Message Authentication Code), используя более современные алгоритмы HMAC-SHA-1-96 и AES-128-CMAC-96 вместо ранее доступной опции TCP-MD5 на базе устаревшего алгоритма MD5.
    • Число субпотоков, поддерживаемых для соединений Multipath TCP (MPTCP), увеличено с 8 до 64.
    • Продолжена работа по сокращению использования в сетевом стеке ядра глобальной блокировки rtnl_lock.
    • Из ядра удалена реализация стека протоколов AppleTalk, который использовался в компьютерах Apple с 1985 года и в 1990-е годы был заменён на TCP/IP.
      Помимо этого удалены компоненты технологии передач данных ATM, не связанные с PPPoATM, а также cетевые интерфейсы ARCnet на базе шин ISA и PCMCIA, Bluetooth-адаптеры с интерфейсом PCMCIA, TLS-ускорители Chelsea,
      код для интеграции TLS с sockmap и поддержка диапазонов частот 5/10 MHz в беспроводном стеке cfg80211/mac80211. Из-за наличия нерешаемых проблем с блокировками и отсутствия сопровождающих удалена специфичная реализация ускорения обработки TLS на базе TCP Offload Engine (более распространённая реализация TLS offload сохранена). Отключён и запланирован для удаления код совместимости с 32-разрядными x_tables на 64-разрядных системах.

    • В драйвер pppoe добавлена поддержка механизмов GRO (Generic Receive Offload) и GSO (Generic Segmentation Offload) для аппаратного ускорения пересборки и сегментации пакетов. Использование GRO и GSO позволяет существенно повысить пропускную способность для входящего трафика, например, на устройствах MediaTek MT7621 в конфигурации с транслятором адресов максимальная пропускная способность повысилась с 130 Mbit/s до 630 Mbit/s.
  • Оборудование
    • В драйвере AMDGPU появилась начальная поддержка технологии HDMI 2.1 FRL (Fixed Rate Link), позволяющей передавать несжатые видео с качеством 4K/120Hz и 8K/60Hz.
      Ранее поддержку HDMI 2.1 долгое время не удавалась реализовать в открытых драйверах из-за лицензионных требований HDMI Forum, но сейчас компании AMD удалось согласовать подобную реализацию.

    • В драйвер i915 добавлена поддержка настройки отображения дисплейным контроллером фонового цвета. Реализован параметр pin_params.needs_low_address.
    • Продолжена работа над drm-драйвером (Direct Rendering Manager) Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake. Добавлена начальная поддержка платформы CRI (Crescent Island). Для dGPU-платформ Xe3p реализован системный контроллер.
    • В драйвере Nouveau решены проблемы с
      GPU NVIDIA GA100.

    • В драйвер v3d добавлена возможность управления энергопотреблением v3D GPU на платах Raspberry Pi.
    • Продолжена интеграция компонентов драйвера Nova для GPU NVIDIA, оснащённых GSP-прошивками, используемыми начиная с серии NVIDIA GeForce RTX 2000 на базе микроархитектуры Turing. Драйвер написан на языке Rust. Добавлена поддержка GPU NVIDIA GA100 и серий Hopper и Blackwell.
    • Добавлена поддержка ARM-плат, SoC и устройств: Apple t8122 (M3), Motorola Edge 30, Nothing Phone 3a, Google Pixel 3a XL, Qualcomm Dragonwing IPQ9650, Huawei Hawi, ZTE zx297520v3, Renesas R-Car M3Le, ASPEED AST27xx, Cortina Gemini, NXP i.MX6/8/9, NXP LX2160A, TI K3 AM62x.

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