Релиз ядра 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
© OpenNet
