После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.15. Среди наиболее заметных изменений: новый драйвер NTFS с поддержкой записи, модуль ksmbd с реализацией SMB-сервера, подсистема DAMON для мониторинга доступа к памяти, примитивы блокировок для режима реального времени, поддержка fs-verity в Btrfs, системный вызов process_mrelease для систем реагирования на нехватку памяти, модуль удалённой аттестации dm-ima.
В новую версию принято 13499 исправлений от 1888 разработчиков,
размер патча – 42 МБ (изменения затронули 10895 файлов, добавлено 632522 строк кода, удалено 299966 строк). Около 45% всех представленных в 5.15 изменений связаны с драйверами устройств, примерно 14% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 14% связано с сетевым стеком, 6% – с файловыми системами и 3% c внутренними подсистемами ядра.
- Дисковая подсистема, ввод/вывод и файловые системы
- В ядро принята новая реализацией файловой системы NTFS, открытая компанией Paragon Software. Новый драйвер может работать в режиме записи и поддерживает все возможности актуальной версии NTFS 3.1, включая расширенные атрибуты файлов, списки доступа (ACL), режим сжатия данных, эффективную работу с пустотами в файлах (sparse) и воспроизведение изменений из журнала для восстановления целостности после сбоев.
- В файловой системе Btrfs реализована поддержка механизма fs-verity, применяемого для прозрачного контроля целостности и подлинности отдельных файлов по ассоциированным с файлами криптографическим хэшам или ключам, хранимым в области метаданных. Ранее fs-verity был доступен только для ФС Ext4 и F2fs.
В Btrfs также добавлена поддержка маппинга идентификаторов пользователей для смонтированных файловых систем (ранее поддерживался для ФС FAT, ext4 и XFS). Указанная возможность позволяет сопоставить файлы определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
Среди других изменений в Btrfs: ускорение добавления ключей в индекс каталога для повышения производительности создания файлов; возможность работы raid0 с одним устройством, а raid10 с двумя (например, в процессе переконфигурирования массива); опция “rescue=ibadroots” для игнорирования некорректного дерева экстентов; ускорение операции “send”; снижение конфликтов блокировок во время операций переименования; возможность использования секторов 4K на системах с размером страницы памяти 64K.
- В XFS стабилизирована возможность использования в ФС дат после 2038 года. Реализован механизм отложенной деактивации inode и поддержка отложенной установки и удаления атрибутов файлов. C целью исключения проблем убрана возможность отключения дисковых квот для уже примонтированных разделов (принудительно квоты отключить можно, но связанных с ними подсчёт будет продолжен, поэтому для полноценного отключения требуется перемонтирование).
- В EXT4 проведена работа по увеличению производительности записи delalloc-буферов и обработки осиротевших (orphan) файлов, продолжающих существовать из-за того что они остаются открытыми, но оказавшихся без привязки к директории. Обработка операций discard вынесена из jbd2-потока kthread для исключения блокировок операций с метаданными.
- В F2FS добавлена опция “discard_unit=block|segment|section” для привязки операций discard (пометка освобождённых блоков, которые уже можно не хранить физически) к выравниванию относительно блока, сектора, сегмента или секции. Добавлена поддержка отслеживания изменения задержек при ввода/выводе.
- В файловой системе EROFS (Extendable Read-Only File System) добавлена поддержка прямого ввода/вывода для файлов, сохранённых без сжатия, а также поддержка fiemap.
- В OverlayFS реализована корректная обработка флагов монтирования “immutable”, “append-only”, “sync” и “noatime”.
- В NFS улучшена обработка ситуаций, когда NFS-сервер перестал отвечать на запросы. Добавлена возможность монтирования с уже используемого сервера, но доступного через другой сетевой адрес.
- Началась подготовка к переписыванию подсистемы FSCACHE.
- Добавлена поддержка EFI-разделов с нестандартным размещением таблиц GPT.
- В механизме fanotify реализован новый флаг FAN_REPORT_PIDFD, приводящий к указанию pidfd в числе возвращаемых метаданных. Pidfd помогает обрабатывать ситуации с повторным использованием PID для более точной идентификации процессов, обращающихся к отслеживаемым файлам (pidfd связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID).
- В системный вызов move_mount() добавлена возможность добавления точек монтирования в существующие совместные группы, что решает проблемы c сохранением и восстановлением состояния процессов в инструментарии CRIU при наличии нескольких пространств монтирования, совместно используемых в изолированных контейнерах.
- Добавлена защита от скрытых состояния гонки, которые потенциально могли приводить к повреждению файлов при выполнении чтения из кэша во время обработки пустот в файле.
- Прекращена поддержка обязательных (mandatory) блокировок файлов, реализуемых через блокирование системных вызовов, приводящих к изменению файла. Из-за возможных состояний гонки данные блокировки считались ненадёжными и много лет назад были объявлены устаревшими.
- Удалена подсистема LightNVM, позволявшая получить прямой доступ к SSD-накопителю, минуя прослойку эмуляции. LightNVM потерял смысл после появления стандартов NVMe, предусматривающих возможность зонирования (ZNS, Zoned Namespace).
- Память и системные сервисы
- Реализована подсистема DAMON (Data Access MONitor), позволяющая отслеживать активность, связанную с доступом к данным в оперативной памяти, в привязке к выбранному процессу, работающему в пространстве пользователя. Подсистема позволяет проанализировать к каким именно областям памяти обращался процесс за всё время своей работы, а какие области памяти остались невостребованными. Из особенностей DAMON отмечается низкая нагрузка на CPU, небольшое расходование памяти, высокая точность и предсказуемые постоянные накладные расходы, не зависящие от размера. Подсистема может использоваться как ядром для оптимизации управления памятью, так и утилитами в пространстве пользователя для понимания того, что именно делает процесс и оптимизации использования памяти, например, высвобождения лишней памяти системе.
- Реализован системный вызов process_mrelease, позволяющий ускорить процесс освобождения памяти процесса, завершающего своё выполнение. В обычных условиях освобождение ресурсов и завершение процесса выполняется не мгновенно и по разным причинам может задерживаться, что мешает работе функционирующих в пространстве пользователя систем раннего реагирования на нехватку памяти, таких как oomd (предоставляется в systemd) и lmkd (используется в Android). При помощи вызова process_mrelease подобные системы могут более предсказуемо инициировать возвращение памяти от принудительно завершаемых процессов.
- Из ветки ядра PREEMPT_RT, в которой развивается поддержка работы в режиме реального времени, перенесены варианты примитивов для организации блокировок mutex, ww_mutex, rw_semaphore, spinlock и rwlock, основанные на подсистеме RT-Mutex. В SLUB slab allocator добавлены изменения, улучшающие работу в режиме PREEMPT_RT и снижающих влияние на прерывания.
- В cgroup добавлена поддержка атрибута планировщика задач SCHED_IDLE, позволяющая снабдить данным признаком сразу все процессы группы, входящие в определённый cgroup. Т.е. эти процессы будут запущены только когда в системе нет других задач, ожидающих выполнения. В отличии от установки атрибута SCHED_IDLE каждому процессу по отдельности, при привязке SCHED_IDLE к cgroup при выборе задачи для выполнения учитывается относительный вес задач внутри группы.
- Механизм учёта потребления памяти в cgroup расширен возможностью отслеживания дополнительных структур данных ядра, в том числе создаваемых для poll-инга, обработки сигналов и пространств имён.
- Добавлена поддержка асимметричной планировки привязки задач к процессорным ядрам на архитектурах, в которых некоторые CPU допускают выполнение 32-разрядных задач, а некоторые работают только в 64-разрядном режиме (например, ARM). Новый режим позволяет при планировании выполнения 32-разрядных задач учитывать только CPU, поддерживающие 32-разрядные задачи.
- В интерфейсе асинхронного ввода/вывода io_uring появилась поддержка открытия файлов сразу в индексной таблице fixed-file, не используя файловых дескриптор, что даёт возможность существенно ускорить некоторые типы операций, но идёт в разрез с традиционным для Unix процессом использования файловых дескрипторов для открытия файлов.
В io_uring для подсистемы BIO (Block I/O Layer) реализован новый механизм повторной переработки (“BIO recycling”), позволяющий снизить накладные расходы в процессе управления внутренней памятью и примерно на 10% увеличить число обрабатываемых операций ввода/вывода в секунду.
В io_uring также добавлена поддержка системных вызовов mkdirat(), symlinkat() и linkat(). - Для BPF-программ реализована возможность запроса и обработки событий таймера. Добавлен итератор для UNIX-сокетов, а также реализована возможность получать и устанавливать опции сокетов для setsockopt. В BTF dumper добавлена поддержка типизированных данных.
- На NUMA-системах с разными типами памяти, отличающимися по производительности, в ситуации исчерпания свободного пространства реализован перенос вытесняемых страниц памяти из динамической памяти (DRAM) в более медленную постоянную память (Persistent Memory) вместо удаления этих страниц. Проведение тестов показало, что подобная тактика как правило улучшает производительность на подобных системах. Для NUMA также реализована возможность выделения страниц памяти для процесса из выбранного набора узлов NUMA.
- Для архитектуры ARC реализована поддержка трёх- и четырёхуровневых таблиц страниц памяти, что в дальнейшем позволит реализовать поддержку 64-разрядных процессоров ARC.
- Для архитектуры s390 реализована возможность применения механизма KFENCE для выявления ошибок при работе с памятью, а также добавлена поддержка детектора состояний гонки KCSAN.
- Добавлена поддержка индексирования списка сообщений, выводимых через printk(), что позволяет разом извлечь все подобные сообщения и отслеживать изменения в пространстве пользователя.
- В mmap() прекращена поддержка опции VM_DENYWRITE, а код ядра избавлен от использования режима MAP_DENYWRITE, что сократило число ситуаций, приводящих к блокированию записи в файл с ошибкой ETXTBSY.
- В подсистему трассировки добавлен новый тип проверок “Event probes”, которые можно прикреплять к существующим событиям трассировки, определяя собственный формат вывода.
- При сборке ядра с использованием компилятора Clang по умолчанию теперь задействован встроенный ассемблер от проекта LLVM.
- В рамках проекта по избавлению ядра от кода, приводящего к выводу предупреждений компилятором, проведён эксперимент с включением по умолчанию режима “-Werror”, при котором предупреждения компилятора обрабатываются как ошибки. В процессе подготовки выпуска 5.15 Линус начал принимать только изменения, не приводящие к предупреждениям при сборке ядра и активировал сборку с “-Werror”, но потом согласился с мнением о преждевременности такого решения и отложил включение “-Werror” по умолчанию. Управление включением флага “-Werror” при сборке производится при помощи параметра WERROR, который по умолчанию выставлен в значение COMPILE_TEST, т.е. пока включается только при тестовых сборках.
- Виртуализация и безопасность
- В Device Mapper (DM) добавлен новый обработчик dm-ima с реализацией механизма удалённой аттестации на основе подсистемы IMA (Integrity Measurement Architecture), позволяющей внешнему сервису верифицировать состояние подсистем ядра для того чтобы убедиться в их подлинности. На практике dm-ima позволяет создавать при помощи Device Mapper хранилища, привязанные к внешним облачным системам, в которых при помощи IMA проверяется достоверность запускаемой конфигурации DM target.
- В prctl() реализована новая опция PR_SPEC_L1D_FLUSH, при включении которой ядро начинает сбрасывать содержимое кэша первого уровня (L1D) каждый раз, когда завершается очередной цикл выполнения процесса в CPU. Данный режим позволяет выборочно для наиболее важных процессов реализовать дополнительную защиту от использования атак по сторонним каналам, проводимым для определения данных, осевших в кэше в результате уязвимостей, вызванных спекулятивным выполнением инструкций в CPU. Ценой включения PR_SPEC_L1D_FLUSH (по умолчанию не активирован) является существенное снижение производительности.
- Реализована возможность сборки ядра с добавлением в GCC флага “-fzero-call-used-regs=used-gpr”, обеспечивающего обнуление всех регистров перед возвращением управления из функции. Указанная опция позволяет защититься от утечки информации из функций и на 20% сократить число блоков, пригодных для построения ROP-гаджетов (Return-Oriented Programming) в эксплоитах.
- Реализована возможность сборки ядер для архитектуры ARM64 в форме клиентов для гипервизора Hyper-V.
- Предложен новый фреймворк для разработки драйверов “VDUSE”, позволяющий реализовывать виртуальные блочные устройства в пространстве пользователя и применять Virtio в качестве транспорта для доступа из гостевых систем.
- Добавлен Virtio-драйвер для шины I2C, дающий возможность эмулировать контроллеры I2C в режиме паравиртуализации с использованием отдельных бэкендов.
- Добавлен Virtio-драйвер gpio-virtio, позволяющий гостевым системам получить доступ к линиям GPIO, предоставляемым хост-системой.
- Добавлена возможность ограничения доступа к страницам памяти для устройств с поддержкой DMA на системах без I/O MMU (memory-management unit).
- В гипервизоре KVM реализована возможность вывода статистики в форме линейных и логарифмических гистограмм.
- Сетевая подсистема
- В состав ядра добавлен модуль ksmbd с реализацией файлового сервера, использующего протокол SMB3. Модуль дополняет ранее доступную в ядре реализацию клиента SMB и в отличие от SMB-сервера, работающего в пространстве пользователя, более эффективен с точки зрения производительности, потребления памяти и интеграции с расширенными возможностями ядра. Ksmbd преподносится как высокопроизводительное и готовое для применения на встраиваемых устройствах расширение к Samba, при необходимости интегрируемое с инструментами и библиотеками Samba.
Из возможностей ksmbd выделяется улучшенная поддержка технологии распределённого кэширования файлов (SMB leases) на локальных системах, которая позволяет существенно сократить трафик. В дальнейшем планируют добавить поддержку RDMA (“smbdirect”) и расширений протокола, связанных с усилением надёжности шифрования и верификацией по цифровым подписям. - В клиенте CIFS прекращена поддержка NTLM и менее надёжных алгоритмов аутентификации.
- В реализации сетевых мостов для vlan реализована поддержка multicast.
- В драйвер bonding, применяемый для агрегирования сетевых интерфейсов, добавлена поддержка подсистемы XDP (eXpress Data Path), позволяющей манипулировать сетевыми пакетами на стадии до их обработки сетевым стеком ядра Linux.
- В беспроводном стеке mac80211 реализована поддержка 6GHZ STA (Special Temporary Authorization) в режимах LPI, SP и VLP, а также возможность установки отдельных TWT (Target Wake Time) в режиме точки доступа.
- Добавлена поддержка протокола MCTP (Management Component Transport Protocol), применяемого для взаимодействия управляющих контроллеров и связанных с ними устройств (хост-процессоры, периферийные устройства и т.п.).
- Продолжена интеграция в ядро MPTCP (MultiPath TCP), расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам. В новом выпуске добавлена поддержка адресов в режиме fullmesh.
- В netfilter добавлены обработчики сетевых потоков, инкапсулированных в протокол SRv6 (Segment Routing IPv6).
- Добавлена поддержка sockmap для потоковых Unix-сокетов.
- В состав ядра добавлен модуль ksmbd с реализацией файлового сервера, использующего протокол SMB3. Модуль дополняет ранее доступную в ядре реализацию клиента SMB и в отличие от SMB-сервера, работающего в пространстве пользователя, более эффективен с точки зрения производительности, потребления памяти и интеграции с расширенными возможностями ядра. Ksmbd преподносится как высокопроизводительное и готовое для применения на встраиваемых устройствах расширение к Samba, при необходимости интегрируемое с инструментами и библиотеками Samba.
- Оборудование
- В драйвере amdgpu реализована поддержка APU Cyan Skillfish (оснащены GPU Navi 1x). Для APU Yellow Carp реализована поддержка видеокодеков. Улучшена поддержка GPU Aldebaran. Добавлены новые идентификаторы карт на базе GPU Navi 24 “Beige Goby”. Предложена улучшенная реализация виртуальных экранов (VKMS).
- В драйвере amdkfd (для дискретных GPU, таких как Polaris) реализован менеджер разделяемой виртуальной памяти (SVM, shared virtual memory) на базе подсистемы HMM (Heterogeneous memory management), позволяющей использовать устройства с собственными блоками управления памятью (MMU, memory management unit), которые могут получать доступ к основной памяти. В том числе при помощи HMM можно организовать совместное адресное пространство между GPU и CPU, в котором GPU может получить доступ к основной памяти процесса.
- В драйвере i915 для видеокарт Intel расширено применение менеджера управления видеопамятью TTM и включены возможность управления энергопотреблением на базе GuC (Graphics micro Controller).
- В драйвере nouveau реализовано управление подсветкой панелей eDP при помощи DPCD (DisplayPort Configuration Data).
- В драйвер msm добавлена поддержка GPU Adreno 7c Gen 3 и Adreno 680.
- В состав принят драйвер ocp_pt для развиваемой компанией Meta (Facebook) PCIe-платы с реализацией миниатюрных атомных часов и GNSS-ресивера, которые могут применяться для организации работы обособленных серверов синхронизации точного времени.
- Добавлена поддержка смартфонов
Sony Xperia 10II (Snapdragon 665), Xiaomi Redmi 2 (Snapdragon MSM8916), Samsung Galaxy S3 (Snapdragon MSM8226), Samsung Gavini/Codina/Kyle. - Добавлена поддержка ARM SoС и плат NVIDIA Jetson TX2 NX Developer Kit, Sancloud BBE Lite, PicoITX, DRC02, SolidRun SolidSense, SKOV i.MX6, Nitrogen8, Traverse Ten64, GW7902, Microchip SAMA7, ualcomm Snapdragon SDM636/SM8150, Renesas R-Car H3e-2G/M3e-2G, Marvell CN913x,
ASpeed AST2600 (серверные платы Facebook Cloudripper, Elbert и Fuji), 4KOpen STiH418-b2264. - Добавлена поддержка LCD-панелей Gopher 2b, EDT ETM0350G0DH6/ETMV570G2DHU, LOGIC Technologies LTTD800480070-L6WH-RT, Multi-Innotechnology MI1010AIT-1CP1, Innolux EJ030NA 3.0, ilitek ili9341, E Ink VB3300-KCA, Samsung ATNA33XC20, Samsung DB7430, WideChips WS2401.
- Добавлен драйвер LiteETH с поддержкой Ethernet-контроллеров, используемых в программных SoC LiteX (для FPGA).
- В драйвер usb-audio добавлена опция lowlatency для управления включением работы в режиме минимальных задержек. Также добавлена опция quirk_flags для передачи специфичных для устройства настроек.
Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 5.15 – Linux-libre 5.15-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске реализован вывод сообщения в лог о завершении чистки. Устранены проблемы при формирования пакетов с использованием mkspec, улучшена поддержка пакетов snap. Убраны некоторые предупреждения, выводимые при обработке
заголовочного файла firmware.h. Разрешён вывод некоторых видов предупреждений (“format-extra-args”, комментарии, неиспользуемые функции и переменные) при сборке в режиме “-Werror”. Добавлена чистка драйвера gehc-achc. Обновлён код чистки блобов в драйверах и подсистемах adreno, btusb, btintel, brcmfmac, aarch64 qcom. Прекращена чистка драйверов prism54 (удалён) и rtl8188eu (заменён на r8188eu).