После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.10. Выпуску 5.10 решено присвоить статус ветки с длительным сроком поддержки, обновления для которой будут выпускаться не менее двух лет. Среди наиболее заметных изменений: поддержка механизма защиты MemTag для систем ARM64, опция монтирования «nosymfollow», значительные оптимизации Ext4, решение проблемы 2038 года в XFS, новый системный вызов process_madvise, расширение поддержки AMD SEV шифрованием регистров CPU, возможность приостановки выполнения BPF-программ.

В новую версию принято 17470 исправлений от 2062 разработчиков,
размер патча — 64 МБ (изменения затронули 15101 файлов, добавлено 891932 строк кода, удалено 619716 строк). Около 42% всех представленных в 5.10 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 13%связано с сетевым стеком, 3% — с файловыми системами и 3% c внутренними подсистемами ядра.

Основные новшества:

  • Дисковая подсистема, ввод/вывод и файловые системы
    • В ФС ext4 добавлен режим быстрых коммитов (fast_commit), позволяющий заметно сократить задержки при выполнении многих операций с файлами за счёт более быстрого сброса метаданных на диск при выполнении вызова fsync(). В обычных условиях при выполнении fsync() синхронизируется избыточный набор метаданных. В режиме fast_commit в журнал переносятся только метаданные, необходимые для восстановления ФС в случае краха, что ускоряет вызов fsync() и повышает производительность операций, активно манипулирующих метаданными.

      Новый режим включается во время создания ФС утилитой mkfs. В сочетании с оптимизациями буферизированной записи и перезаписи данных отмечается существенно повышение производительности при нагрузках, связанных с параллельным выполнением операций записи. Например, на системе с 96 ядрами CPU отмечено повышение скорости прохождения теста fio.write_iops на 330.6%.

    • В реализацию файловой системы Btrfs внесены существенные оптимизации производительности, связанные с выполнением операций fsync(). Снижение конкуренции мьютексов для лога привело к увеличению пропускной способности на 4% и снижению задержек на 14% при прохождении теста dbench с 32 клиентами. Отбрасывание лишних коммитов для ссылок и переименований подняло пропускную способность на 6% и снизило задержки на 30%. Ограничение ожидания в fsync только операциями обратной записи повысило пропускную способность на 10-40%.

      Кроме того, реализация прямого ввода/вывода (direct io) в Btrfs переведена на инфраструктуру iomap. Добавлены новые sysfs-параметры с информацией о статусе эксклюзивных операций с ФС (балансировка, добавление/замена устройств) и версии send stream.

    • В XFS добавлены изменения в метаданные inode, решающие проблемы с переполнением 32-разрядного типа данных time_t в 2038 году. Аналогичные изменения, которые сдвинули переполнение счётчика времени до 2468 года, добавлены в код для расчёта времени дисковых квот. Формат XFS V4 объявлен устаревшим, пользователем рекомендовано обновить ФС до формата V5, но времени на обновление более чем достаточно, так как поддержка V4 будет сохранена до 2030 года. В XFS также изменён размер записи в inode btree, позволивший расширить проверки избыточности и сократить время монтирования.
    • В OverlayFS добавлен режим «volatile», приводящий к игнорированию любых вызовов fsync(). Новый режим позволяет существенно ускорить выполнение операций сборки образов для изолированных контейнеров, в которых выполняется большое число операций установки пакетов. Ускорение достигается за счёт отключения сброса состояния ФС после установки каждого пакета (в случае сбоя во время построения образа можно просто начать его сборку заново). В OverlayFS также добавлена поддержка ioctl [S|G]ETFLAGS и FS[S|G]ETXATTR, а также продолжена подготовка к реализации поддержки монтирования непривилегированными пользователями.
    • В ZoneFS, ФС для зонированных устройств хранения, добавлена опция монтирования «-o explicit-open» при выставлении которой открытие файла на запись будет приводить к активации ассоциированной зоны на устройстве, что гарантирует, что успешное открытие зоны в дальнейшем позволит успешно выполнить операцию записи.
    • Предложена новая опция монтирования «nosymfollow», запрещающая обработку символических ссылок при определении пути, но не мешающая приложениям использовать readlink() для самостоятельно раскрытия символических ссылок.
    • Для подсистемы FUSE реализована поддержка операций DAX для прямого доступа к ФС в обход страничного кэша без применения уровня блочных устройств, что используется для исключения двойного кэширования в virtiofs при организации совместного доступа к каталогам и файлам в гостевых системах. В virtiofs также добавлена поддержка раздельного подключения разделов, имеющих разные точки монтирования на хост системе.
    • В файловой системе F2FS добавлен новый режим сборки мусора ATGC (Age Threshold Garbage Collection), улучшена поддержка зонированных устройств NVMe и увеличена скорость распаковки сжатых данных.
    • В F2FS и Ext4 переработан режим работы с именами файлов без учёта регистра символов (casefold) — решено унифицировать реализацию игнорирования регистра в именах файлов, вынеся связанный с ними код в общий libfs.
    • В CIFS обновлены определения протоколов из документации MS-SMB2. В SMB3 добавлена поддержка алгоритма шифрования AES256 в режиме GCM, для включения которой предложены параметры require_gcm_256 и enable_gcm_256. Добавлена поддержка тегов IO_REPARSE_TAG_LX_, используемых в WSL (Windows Subsystem for Linux).
    • В md/raid10 для программных массивов RAID10 улучшена поддержка операций DISCARD.
  • Память и системные сервисы
    • Добавлен системный вызов process_madvise(), позволяющий одному процессу выполнить системный вызов madvise() от имени другого процесса. При помощи madvise() можно информировать ядро об особенностях работы с памятью для оптимизации управления памятью процесса, например, на основе переданной информации ядро может инициировать высвобождение дополнительной свободной памяти.
      Вызов madvise() другим процессом может потребоваться на платформах, таких как Android, в которых информация, необходимая для оптимизации, неизвестна текущему процессу, а координируется отдельным фоновым управляющим процессом (ActivityManagerService в Android), который самостоятельно может инициировать изъятие у процессов неиспользуемой памяти.

    • В интерфейс асинхронного ввода/вывода io_uring
      добавлена возможность создания ограниченных ring-областей (restricted rings), которые можно безопасно совместно использовать с процессом, не заслуживающим доверия. Указанная возможность позволяет базовому приложению выборочно ограничить доступ только к отдельным своим файловым дескрипторам для их использования в сторонних приложениях через io_uring.

    • В системный вызов pidfd_open() добавлен флаг PIDFD_NONBLOCK для создания неблокируемого файлового дескриптора (аналог O_NONBLOCK для pidfd).
    • Реализована возможность приостановки выполнения BPF-программ через переход программы в режим сна. Включение режима сна осуществляется самой BPF-программой и требует установки флага BPF_F_SLEEPABLE во время запуска. Возможность пока реализована только для BPF-программ, осуществляющих трассировку и реализующих функции модулей обеспечения безопасности (сетевые обработчики в режим сна пока переходить не могут).
    • В системный вызов bpf() добавлена команда BPF_PROG_BIND_MAP, позволяющая прикрепить map-структуру к загруженной программе, которую можно использовать, например, для хранения метаданных.
    • Добавлены вспомогательные функции bpf_per_cpu_ptr() и bpf_this_cpu_ptr(), предоставляющие BPF-программам доступа к переменным, привязанным к определённым CPU.
    • Для архитектуры MIPS реализована поддержка загрузки ядер, сжатых алгоритмом ZSTD.
    • Для архитектуры RISC-V добавлена поддержка загрузки на системах с прошивками EFI.
    • Прекращена поддержка платформ i.MX без DeviceTree.
    • Необходимая для сборки ядра минимально поддерживаемая версия компилятора Clang поднята до выпуска 10.0.1.
    • Объявлено устаревшим и запланировано к удалению в выпуске 5.14 символьное устройство «raw», предоставляющее классический символьный Unix-подобный интерфейс к блочным устройствам. Очень давно данное устройство использовалось для прямого ввода/вывода, но начиная с 2002 года для этих целей добавлен флаг O_DIRECT.
  • Виртуализация и безопасность
    • Добавлена поддержка анклавов Nitro Enclave (NE), предлагаемых в Amazon Elastic Compute Cloud (EC2) для обработки конфиденциальных данных в VM, изолировано от других приложений.
    • Расширена поддержка технологии AMD SEV (secure encrypted virtualization), которая на аппаратном уровне обеспечивает прозрачное шифрование памяти виртуальных машин, при котором доступ к расшифрованным данным имеет только текущая гостевая система, а остальные виртуальные машины и гипервизор при попытке обращения к этой памяти получают зашифрованный набор данных. В новом выпуске помимо шифрования памяти реализована возможность шифрования регистров процессора, используемых в гостевой системе, что делает содержимое регистров недоступным для хост-окружения, если гостевая системе явно не предоставит к ним доступ.
    • Реализована поддержка расширения ARMv8.5 MTE (MemTag, Memory Tagging Extension), позволяющего привязать теги к каждой операции выделения памяти и организовать при доступе к памяти проверку указателя, который должен быть связан с корректным тегом. Расширение может применяться для блокирования эксплуатации уязвимостей, вызванных обращением к уже освобождённым блокам памяти, переполнениями буфера, обращениями до инициализации и использованием вне текущего контекста.
    • В LSM-модуль SafeSetID, позволяющий системным сервисам безопасно управлять пользователями без повышения привилегий (CAP_SETUID) и без получения полномочий root, добавлена поддержка управления изменением идентификаторов групп, помимо идентификаторов пользователей.
    • Из криптоподсистемы удалена реализация KerberosV-алгоритма RC4-HMAC-MD5, который когда-то был добавлен для совместимости с системами Windows NT/2000, обновление которых прекращено в 2008 году.
    • Добавлена поддержка криптографических хэшей SM2, стандартизированных для учреждений Китая.
    • Предоставлена возможность удаления из файлов расширенных атрибутов security.selinux, но только на стадии до загрузки правил SELinux (позволяет убрать метки с файлов, если SELinux не используется).
    • В гипервизоре KVM реализована возможность выноса в процесс в пространстве пользователя обработки доступа к неизвестным регистрам MSR.
    • Добавлена возможность использования статических вызовов (static_call) вместо глобальных указателей на функции для снижения негативного влияния на производительность механизмов защиты от атак класса Spectre, таких как retpoline. Суть оптимизации в замене в коде косвенных вызовов на прямые вызовы.
    • Реализована эмуляция инструкций SLDT и STR, позволившая решить проблемы с крахом некоторых Windows-приложений в Wine на системах с включенной защитой UMIP (User-Mode Instruction Prevention, на уровне CPU запрещает выполнение инструкций SGDT, SLDT, SIDT, SMSW и STR в пространстве пользователя, так как они могут применяться в атаках, нацеленных на повышение привилегий в системе).
    • В IOMMU включена поддержка блокировки трансляции ACS (Access Control Services) для внешних PCI-устройств, позволяющая защититься от некоторых атак через DMA при подключении вредоносных PCI-устройств.
    • Добавлена поддержка загрузки сертификатов MOK (Machine Owner Key) из таблиц EFI.
  • Сетевая подсистема
    • Для BPF-программ предоставлена возможность изменения и разбора опций в заголовках TCP-пакетов.
    • Продолжена интеграция в ядро MPTCP (MultiPath TCP), расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам. В новом выпуске появилась поддержка передачи данных одновременно в несколько потоков для балансировки нагрузки.
    • Добавлена возможность использования протоколов IGMPv3 и MLDv2 в режиме Source-Specific Multicast(RFC 4604).
    • Добавлена поддержка транспортного протокола ISO 15765-2:2016, используемого для передачи пакетов с данными поверх шины CAN (Controller Area Network).
    • В клиент NFS добавлена поддержка операции READ_PLUS, определённой в спецификации NFS 4.2 для более эффективного чтения данных из файлов, содержащих пустоты.
    • Разрешено создание более 255 сетевых интерфейсов IPv4 в режиме multicast.
    • В беспроводном стеке mac80211 появилась поддержка сканирования доступных сервисов в диапазоне 6 GHz, а также поддержка технологии быстрой настройки соединения FILS (Fast Initial Link Setup, стандартизирован как IEEE 802.11ai), позволяющей избавиться от задержек при роуминге во время миграции от одной точки доступа к другой.
    • В NetFilter добавлена поддержка цепочек «ingress», позволяющих фильтровать пакеты IPv4 и IPv6 на том же уровне, что ingress-обработчик в цепочке netdev (hook ingress), т.е. на стадии когда драйвер передаёт пакет сетевому стеку ядра.
  • Оборудование
    • В DRM-драйвере i915 для видеокарт Intel переработан код для работы с блокировками в GEM. Расширена поддержка чипов на базе микроархитектуры Rocket Lake. Началась подготовка к реализации поддержки чипов Alder Lake. Улучшена поддержка вывода через Type-C и DisplayPort на системах Tiger Lake (Gen12). Для дискретных карт Intel DG1 реализована поддержка вывода звука через HDMI.
    • В драйвере amdgpu продолжена работа по реализации поддержки GPU AMD Navi 21 (Navy Flounder) и Navi 22 (Sienna Cichlid).
    • Для чипов AMD Zen 3 в драйвере k10temp реализована поддержка мониторинга температуры.
    • Добавлен драйвер mgag200 с поддержкой графических карт Matrox G200.
    • Добавлена поддержка переходников Lontium LT9611 DSI/HDMI, Toshiba TC358775 DSI/LVDS, Toshiba TC358762 DSI/DPI и Cadence DPI/DP.
    • Добавлен API для обращения к GPIO из пространства пользователя.
    • Добавлена поддержка звуковых карт Creative Labs SoundBlaster AE-7, а также звуковых кодеков MediaTek MT6359 и Cirrus Logic CS4234.
    • В драйвер vc4 добавлена поддержка графической подсистемы плат Raspberry Pi 4 (BCM2711).
    • Добавлена поддержка игровых контроллеров Nintendo Switch, таких как Switch Joy-Cons и Switch Pro при подключении по USB и Bluetooth.
    • Добавлена поддержка ARM-плат, устройств и платформ: Librem 5, NVIDIA Tegra234 (Orin),
      Hisilicon SD5203 (ARM926EJ-S), Cisco Meraki MR32 (BCM53016), BCM2711 (RPi4), Caninos Loucos Labrador, RoseapplePi, Allwinner A100, Libretch S905x CC V2, Hardkernel ODROID-N2+, Wistron Mowgli, Facebook Wedge400, Tolino Shine 2 HD, NanoPi R2S, Rockchip A95X-Z2, Odyssey, Toshiba Visconti и TPMV7708.

Одновременно латиноамериканский Фонд свободного ПО сформировал
вариант полностью свободного ядра 5.10 — Linux-libre 5.10-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске добавлена поддержка появившихся в ядре новых примитивов загрузки прошивок. Добавлена проверка наличия исходных текстов для предкомпилированного BPF-кода. Обновлён код чистки блобов в драйверах и подсистемах amdgpu, Intel i915, bluetooth hci, IMX SDMA, MLXSW Spectrum, Intel iwlwifi, Qualcomm ath11k, Broadcom STM DPFE, Intel Haswell и HiFi2. Отключена загрузка блобов в новых драйверах для Cadence MHDP8546 DPI/DP и Marvell Prestera. Отключены новые блобы в портах qcom aarch64.