После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.16. Среди наиболее заметных изменений: системный вызов futex_waitv для повышения производительности Windows-игр в Wine, отслеживание ошибок в ФС через fanotify, концепция фолиантов в системе управления памятью, поддержка процессорных инструкций AMX, возможность резервирования памяти за сетевыми сокетами, поддержка в netfilter классификации пакетов на стадии “egress”, задействование подсистемы DAMON для упреждающего вытеснения невостребованных областей памяти, улучшение обработки перегрузок при большом объёме операций записи, поддержка многоприводных жёстких дисков.
В новую версию принято 15415 исправлений от 2105 разработчиков,
размер патча – 45 МБ (изменения затронули 12023 файлов, добавлено 685198 строк кода, удалено 263867 строк). Около 44% всех представленных в 5.16 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 16% связано с сетевым стеком, 4% – с файловыми системами и 4% c внутренними подсистемами ядра.
Основные новшества в ядре 5.16:
- Дисковая подсистема, ввод/вывод и файловые системы
- В механизм fanotify добавлены средства для мониторинга за состоянием файловой системы и отслеживания возникновения ошибок. Информация об ошибках передаётся при помощи нового типа событий – FAN_FS_ERROR, которые могут перехватываться в выполняемых пространстве пользователя системах мониторинга для оперативного информирования администратора или запуска процессов восстановления. При каскадном возникновении серии ошибок fanotify обеспечивает доставку сообщения о первой ошибке вместе с общим счётчиком проблем, для упрощения последующего разбора причин сбоя. Поддержка отслеживания ошибок пока реализована только для ФС Ext4.
- Улучшена обработка перегрузок при выполнении операций записи (write congestion), возникающих когда объём операций записи превышает пропускную способность накопителя и система вынуждена блокировать запросы процесса на запись до завершения выполнения уже переданных запросов. В новой версии полностью переделан механизм ядра, используемый для получения информации о возникновении перегрузки и блокирования задач, так как в старой реализации наблюдались проблемы с сопряжением обработки перегрузки записи c вытеснением страниц памяти в раздел подкачки при нехватке памяти в системе.
- В Btrfs реализована поддержка технологии зонирования устройств (Zoned Namespace), применяемой в жёстких дисках или NVMe SSD для разделения пространства для хранения на зоны, составляющие группы блоков или секторов, в которые допускается лишь последовательное добавление данных с обновлением целиком всей группы блоков. Кроме того, внесены небольшие оптимизации логгирования inode, позволившие добиться повышения пропускной способности в тесте dbench на 3% и сократить задержки на 11%. Переработан механизм логгирования каталогов, в котором для повышения эффективности сокращено число операций поиска и блокировок в дереве. Ускорена вставка элементов в структуру btree в пакетном режиме (время массовой вставки элементов сократилось на 4%, а удаления на 12%). Добавлена ограниченная поддержка использования сжатия при записи не полных страниц, а также возможность дефрагментации подстраниц (subpage). Проведена подготовка для включения поддержки второй версии протокола для команды “send”.
- В файловой системе XFS сокращено потребление памяти за счёт использования отдельных кэшей slab для часто используемых элементов и сокращения некоторых структур данных.
- В файловой системе Ext4 отмечено только исправления ошибок и более точное вычисление параметров отложенной инициализации таблицы Inode.
- На уровне блочных устройств реализованы оптимизации, позволяющие существенно повысить эффективность привязки операций к ядрам CPU.
- Добавлена начальная поддержка жёстких дисков с несколькими независимыми приводами (multi-actuator), дающими возможность одновременно обращаться к нескольким секторам в разных зонах магнитной пластины.
- Добавлена новая ioctl-команда CDROM_TIMED_MEDIA_CHANGE для определения событий смены носителя в приводе оптических дисков.
- В файловую систему EROFS (Enhanced Read-Only File System) добавлена возможность работы поверх нескольких устройств хранения. Разные устройства могут быть отражены в одно 32-разрядное адресное пространство блоков. Также добавлена поддержка сжатия с использованием алгоритма LZMA.
- В ФС F2FS добавлены опции монтирования для управления фрагментированием файлов при размещении в хранилище (например, для отладки оптимизаций работы с фрагментированными хранилищами).
- В CEPH включены по умолчанию операции создания и удаления каталогов в асинхронном режиме (для возвращения старого поведения следует при монтировании использовать флаг ‘-o wsync’). Добавлено ведение метрик, отслеживающих операции копирования внешних объектов.
- В CIFS добавлен параметр монтирования tcpnodelay, при котором для сетевого сокета выставляется режим tcp_sock_set_nodelay, отключающий ожидание заполнение очереди в TCP-стеке. Добавлена поддержка вложенных
DFS Link (Distributed File System) при перемонтировании. - Добавлена поддержка завершения запросов к блочному устройству в пакетном режиме. Тестирование изменения показало увеличение интенсивности выполнения операций случайного чтения с накопителей Optane с 6.1 до 6.6 млн IOPS на одном ядре CPU.
- Память и системные сервисы
- Добавлен новый системный вызов futex_waitv, позволяющий отслеживать состояние сразу нескольких фьютексов при помощи одного системного вызова. Указанная возможность напоминает доступную в Windows функциональность WaitForMultipleObjects, эмуляция которой через futex_waitv может быть полезной для повышения производительности Windows-игр, запускаемых под управлением Wine или Proton. Кроме того, одновременное ожидание фьютексов может применяться и для оптимизации производительности родных сборок игр для Linux.
- Реализована концепция фолиантов страниц памяти (page folios), использование которой в некоторых подсистемах ядра позволит ускорить управление памятью при типовых нагрузках. В настоящее время на фолианты уже переведена основная подсистема управления памятью в ядре и реализация страничного кэша, а в будущем намечен перевод файловых систем. В дальнейшем в ядре также планируются добавить поддержку многостраничных фолиантов.
Фолианты напоминают объединённые страницы памяти (compound pages), но отличаются улучшенной семантикой и более понятной организацией работы. Для управления системной памятью доступное ОЗУ разделяется на страницы памяти, размер которых зависит от архитектуры, но на системах x86 исчисляется килобайтами (обычно 4096 байт). Современные системы комплектуются десятками гигабайт ОЗУ, что приводит усложнению управления памятью из-за необходимости обработки огромного числа страниц памяти. Для сокращения числа страниц ранее в ядре была реализована концепция объединённых страниц (compound pages) со структурами, охватывающими более чем одну физическую страницу памяти. Но API для манипуляции объединённых страницами памяти оставлял желать лучшего и приводил к дополнительным накладным расходам.
- В планировщик задач добавлен обработчик, учитывающий кластеризацию кэша в CPU. В некоторых процессорах, таких как Kunpeng 920 (ARM) и Intel Jacobsville (x86), определённое число ядер CPU, обычно 4, может совмещать L3 или L2 кэш. Учёт подобных топологий может значительно повысить эффективность распределения задач по ядрам CPU в планировщике задач, так как перемещение задач в рамках одного кластера CPU позволяет повысить пропускную способность обращения к памяти и снизить
конкуренцию в кэше. - Добавлена поддержка инструкций AMX (Advanced Matrix Extensions), реализованных в грядущих серверных процессорах Intel Xeon Scalable, развиваемых под кодовым именем Sapphire Rapids. AMX предлагает новые настраиваемые регистры TMM “TILE” и инструкции для манипуляции с данными в этих регистрах, такие как TMUL (Tile matrix MULtiply) для умножения матриц.
- Реализовано несколько новых возможностей, основанных на добавленной в прошлом выпуске подсистеме DAMON (Data Access MONitor), позволяющей отслеживать доступ к данным в оперативной памяти, в привязке к выбранному процессу, работающему в пространстве пользователя. Например, подсистема даёт возможность проанализировать к каким именно областям памяти обращался процесс за всё время своей работы, а какие области памяти остались невостребованными:
- DAMON_RECLAIM для выявления и вытеснения областей памяти, к которым не было обращений. Механизм можно использовать для упреждающего мягкого вытеснения страниц памяти в условиях приближения к исчерпанию свободной памяти.
- DAMOS (Data Access Monitoring-based Operation Schemes) для применения заданных операции madvise(), таких как высвобождение дополнительной свободной памяти, к областями памяти процесса, для которых фиксируется определённая частота обращения к памяти. Настройка параметров DAMOS осуществляется через debugfs.
- Возможность мониторинга за физическим адресным пространством памяти (ранее можно было отслеживать только виртуальные адреса).
- Реализация алгоритма сжатия zstd обновлена до версии 1.4.10, что позволило заметно поднять производительность различных подсистем ядра, в которых применяется сжатие (например, распаковка образа ядра ускорена на 35%, производительность распаковки сжатых данных в Btrfs и SquashFS повысилась на 15%, в ZRAM – на 30%). Изначально в ядре была использована отдельная реализация zstd, основанная на версии 1.3.1, выпущенной более трёх лет назад и не включающей многие важные оптимизации. Кроме перехода на актуальную версию добавленный патч также упрощает синхронизацию с upstream-веткой zstd, позволяя генерировать код для включения в ядро напрямую из основного репозитория zstd. В будущем код zstd в ядре планируют обновлять по мере выхода новых версий библиотеки zstd.
- Внесена большая порция улучшений в подсистему eBPF. Добавлена возможность вызова из BPF-программ функций модулей ядра. Реализована функция bpf_trace_vprintk(), в отличие от bpf_trace_printk() позволяющая выводить разом более трёх аргументов. Добавлен новая структура хранения данных (BPF map) bloom filter, позволяющая использовать одноимённую вероятностную структуру данных для определения наличия элемента в наборе.
Добавлен новый атрибут BTF_KIND_TAG, который может применяться в BPF-программах для привязки тегов к параметрам функций, например, для упрощения выявления ошибок в пользовательских программах. В libbpf разрешено создание собственных секций .rodata.*/.data.*, реализована поддержка событий трассировки uprobe и kprobe, добавлен API для копирования всех типов BTF из одного объекта в другой. Поддержка AF_XDP вынесена из libbpf в отдельную библиотеку libxdp. Для архитектуры MIPS реализован JIT-компилятор для виртуальной машины BPF. - Для архитектуры ARM64 реализована поддержка расширений ARMv8.6 для таймера, в том числе позволяющих обеспечить самосинхронизацию представления системных регистров без применения инструкций ISB.
- Для архитектуры PA-RISC реализована возможность применения механизма KFENCE для выявления ошибок при работе с памятью, а также добавлена поддержка детектора состояний гонки KCSAN.
- Предоставлена возможность настройки прав доступа к tracefs на уровне отдельных пользователей и групп, например, теперь можно разрешить доступ к средствам трассировки только участникам определённой группы.
- Виртуализация и безопасность
- В подсистемах io_uring и device-mapper реализована поддержка генерации событий аудита. В io_uring реализована возможность управления доступа через модули LSM. Добавлена возможность аудита системного вызова openat2().
- Код ядра полностью избавлен от непрерывающихся выражений casе в switch (без return или break после каждого блока case). При сборке ядра теперь можно будет применять режим “-Wimplicit-fallthrough”.
- Включены изменения для ужесточения проверок границ при выполнении функции memcpy().
- В интерфейсе асинхронного ввода/вывода io_uring реализована возможность применения к операциям ввода/вывода политик безопасности, определяемых модулями SELinux и Smack.
- В подсистеме IMA (Integrity Measurement Architecture), позволяющей внешнему сервису верифицировать состояние подсистем ядра для того чтобы убедиться в их подлинности, реализована возможность применения правил на основе идентификатора группы (GID) к которой принадлежит файл или в которую входит пользователь, обращающийся к файлу.
- Отключены по умолчанию некоторые расширенные механизмы защиты потоков seccomp() от атак класса Spectre, которые были расценены как излишние и заметно не повышающие безопасность, но негативно влияющие на производительность. Пересмотрено применение защиты Retpoline.
- Удалена реализация механизма cryptoloop, на смену которому в 2004 году пришёл dm-crypt и при необходимости поддерживает те же алгоритмы.
- По умолчанию запрещён непривилегированный доступ к подсистеме eBPF. Изменение внесено для предотвращения использования BPF-программ для обхода защиты от атак по сторонним каналам. При необходимости администратор может вернуть возможность использования eBPF непривилегированными пользователями.
- В гипервизор ACRN, рассчитанный на выполнение задач реального времени и использование в критически важных системах, добавлена поддержка создания/удаления виртуальных устройств и проброса устройств MMIO.
- В криптодвижок добавлена поддержка определений KPP (Key-agreement Protocol Primitives), упрощающих логику разработки драйверов для криптосистем.
- Для гипервизора Hyper-V реализована поддержка режима изоляции виртуальных машин, подразумевающего шифрование содержимого памяти.
- В гипервизоре KVM добавлена поддержка архитектуры RISC-V.
Реализована возможность миграции внутри хост-окружения виртуальных машин, выполняемых с использованием расширений
AMD SEV и SEV-ES. Добавлен API для live-миграции гостевых систем, шифруемых при помощи AMD SEV (Secure Encrypted Virtualization). - Для архитектуры PowerPC по умолчанию включён режим STRICT_KERNEL_RWX, блокирующий использование страниц памяти, одновременно доступных на запись и исполнение.
- На 32-разрядных системах x86 прекращена поддержка горячего подключения памяти (Memory hotplug), которая более года находилась в нерабочем состоянии.
- Из ядра исключена библиотека liblockdep, которая теперь будет сопровождаться отдельно от ядра.
- Сетевая подсистема
- Для сокетов реализована новая опция SO_RESERVE_MEM, при помощи которой можно зарезервировать для сокета определённый объём памяти, который всегда останется доступным для сокета и не будет изъят. Использование данной опции позволяет добиться увеличения производительности за счёт сокращения в сетевом стеке операций выделения и возвращения памяти, особенно при возникновении условий нехватки памяти в системе.
- Добавлена поддержка протокола автоматического туннелирования multicast-трафика (Automatic Multicast Tunneling, RFC 7450), позволяющего доставлять multicast-трафик из сетей, поддерживающих Мulticast, получателям в сетях без Multicast. Протокол работает через инкапсуляцию в пакеты UDP.
- Улучшена инкапсуляция данных IOAM (In-situ Operations, Administration, and Maintenance) в транзитные пакеты.
- В ethtool netlink API добавлена возможность управления режимами энергопотребления приемопередатчиков.
- В подсистеме netfilter реализована возможность классификации пакетов на уровне egress, т.е. на стадии когда драйвер получает пакет от сетевого стека ядра. В nftables поддержка соответствующих фильтров появилась в версии 1.0.1. В netfilter добавлена возможность сопоставления и изменения внутренних заголовков и данных для UDP и TCP (inner header / payload), идущих после транспортного заголовка (transport header).
- Добавлены новые sysctl-параметры arp_evict_nocarrier и ndisc_evict_nocarrier при установке которых кэш ARP и таблица ndisc (neighbor discovery) будут очищаться в случае обрыва связи (NOCARRIER).
- В механизм управления сетевыми очередями fq_codel (Сontrolled Delay) добавлены режимы Low Latency, Low Loss и Scalable Throughput (L4S).
- Оборудование
- В драйвере amdgpu реализована начальная поддержка спецификации DP 2.0 (DisplayPort) и возможности туннелирования DisplayPort через USB4. Добавлена возможность вывода на APU Cyan Skillfish (оснащены GPU Navi 1x). Расширена поддержка APU Yellow Carp (мобильные процессоры Ryzen 6000 “Rembrandt”).
- В драйвере i915 стабилизирована поддержка чипов Intel Alderlake S и реализована поддержка технологии Intel PXP (Protected Xe Path), позволяющей организовать работу аппаратно защищённого графического сеанса на системах с чипами Intel Xe.
- В драйвере nouveau проведена работа по исправлению ошибок и улучшению стиля оформления кода.
- Добавлена поддержка x86-совместимых CPU Vortex (Vortex86MX). Linux на подобных процессорах работал и раньше, но явная идентификация указанных CPU потребовалась для отключения защиты от атак Spectre/Meltdown, которые не применимы к указанным чипам.
- Добавлена начальная поддержка x86-платформ Surface Pro 8, Surface Laptop Studio.
- Добавлен драйвер для поддержки звуковых чипов, используемых в APU AMD Yellow Carp, Van Gogh, также добавлена поддержка звуковых систем и кодеков Cirrus CS35L41, Maxim MAX98520/MAX98360A, Mediatek MT8195, Nuvoton NAU8821, NVIDIA Tegra210, NXP i.MX8ULP, Qualcomm AudioReach, Realtek ALC5682I-VS, RT5682S, RT9120, Rockchip RV1126 и RK3568.
- Добавлен драйвер ishtp_eclite для доступа ко встроенным контроллерам Intel PSE (Programmable Service Engine) при помощи протокола ISHTP (Integratd Sensor Hub Transport Protocol), например, для получения данных об аккумуляторе, температуре и информации, связанной с UCSI (USB Type-C Connector System Software Interface).
- Добавлен драйвер для контроллеров Nintendo Switch, поддерживающий устройства Switch Pro и Joy-Cons. Добавлена поддержка планшетов Wacom Intuos BT (CTL-4100WL/CTL-6100WL) и клавиатуры Apple 2021 Magic Keyboard. Улучшена поддержка контроллеров Sony PlayStation DualSense. Добавлена поддержка боковых кнопок мыши Xiaomi Mi.
- Добавлен драйвер RT89 с поддержкой беспроводных чипов Realtek 802.11ax, а также драйверы для Ethernet-адаптеров Asix AX88796C-SPI и коммутаторов Realtek RTL8365MB-VC.
- Для чипов Apple M1 добавлены драйверы для PCI и PASemi i2c.
- Добавлена поддержка ARM SoС, устройств и плат Raspberry Pi Compute Module 4, Fairphone 4, Snapdragon 690, LG G Watch R, Sony Xperia 10 III, Samsung Galaxy S4 Mini Value Edition, Xiaomi MSM8996 (Mi 5, Mi Note 2, Mi 5s, Mi Mix, Mi 5s Plus и Xiaomi Mi 5), Sony Yoshino (Sony Xperia XZ1, и Sony Xperia XZ Premium), F(x)tec Pro1 QX1000, Microchip LAN966, CalAmp LMU5000, Exegin Q5xR5, sama7g5, Samsung ExynosAutov9, Rockchip RK3566, RK3399 ROCK Pi 4A+, RK3399 ROCK Pi 4B+, Firefly ROC-RK3328-PC, Firefly ROC-RK3399-PC-PLUS, ASUS Chromebook Tablet CT100, Pine64 Quartz64-A, Netgear GS110EMX, Globalscale MOCHAbin 7040, NXP S32G2, Renesas R8A779M*, Xilinx Kria, Radxa Zero, JetHub D1/H1, Netronix E70K02.