Релиз ядра Linux 6.14

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.14. Среди наиболее заметных изменений: драйвер ntsync c примитивами синхронизации Windows NT, настройка балансировки операций чтения в Btrfs RAID1, поддержка reflink в XFS в режиме realtime, возможность некэшируемого буферизированного ввода/вывода, dmem cgroup для ограничения памяти GPU, задействование io_uring в FUSE, делегирование атрибутов в NFS, поддержка атомарной записи в Device mapper, ускорение символических ссылок, управление возможностью выполнения скриптов, поддержка чипов Qualcomm Snapdragon 8 Elite, драйвер для NPU AMD.

Основные новшества в ядре 6.14:

  • Дисковая подсистема, ввод/вывод и файловые системы
    • В файловой системе Btrfs появилась поддержка новых методов балансировки операций чтения между накопителями, входящими в массив RAID1. Помимо ранее действующего распределения нагрузки на основе идентификаторов процессов (pid), в новой версии предложены три новых режима балансировки: “rotation” (равномерное распределение нагрузки по всем накопителям, режим включён по умолчанию); “latency” (распределение с учётом задержек, может быть полезным при сбоях или нестабильной работе накопителей); devid (ручное управление). Для изменения режима балансировки добавлен интерфейс “/sys/fs/btrfs//read_policy”. Среди других изменений в Btrfs – реализация ioctl FS_IOC_READ_VERITY_METADATA.
    • Добавлен режим некэшируемого буферизированного ввода/вывода, при котором данные удаляются из страничного кэша сразу после того, как завершены операции по их чтению или записи. Изменение может быть полезным при использовании очень быстрых устройств хранения, кэширование операций с которыми в оперативной памяти избыточно. Для таких устройств новый режим позволяет исключить излишнее расходование памяти страничным кэшем не прибегая к использованию усложнённого API прямого ввода/вывода (Direct I/O).
    • В fsnotify, механизм отслеживания изменений в ФС, добавлено новое событие FS_PRE_ACCESS, генерируемое на стадии перед обращением к содержимому файла. Событие обрабатывается в синхронном режиме, т.е. ядро отправляет событие и ожидает получения ответа. Если ответ получен – операция выполняется, а если произошёл сбой – системный вызов возвращает в пространство пользователя код ошибки. При помощи FS_PRE_ACCESS процессом в пространстве пользователя, например, может быть организовано заполнение файла по мере готовности данных в медленном хранилище.
    • В подсистему FUSE, позволяющую создавать реализации файловых систем в пространстве пользователя, добавлена поддержка обмена данными между ядром и обработчиком в пространстве пользователя с использованием механизма ввода/вывода io_uring. Изменение позволяет повысить производительность FUSE за счёт сокращения переключений контекста между ядром и пространством пользователя.
    • В файловую систему XFS добавлена возможность использования обратного маппинга (rmap, reverse-mapping) в режиме работы с предсказуемыми задержками (“realtime device”). Обратный маппинг позволяет определить для хранения какого файла используется указанный блок на устройстве хранения. При помощи rmap в XFS для realtime-режима реализована поддержка операции reflink, позволяющей создавать копии файлов путём клонирование метаданных файла и создания ссылки на уже имеющиеся данные без их фактического копирования.
    • В VFS реализовано кэширование размера символических ссылок, позволившее на 1.5% ускорить выполнение операции readlink (в тесте с /initrd.img в ext4). Кэширование включено в ФС ext4 и tmpfs.
    • В реализацию NFSv4.2 добавлена поддержка делегирования атрибутов файлов, позволяющая управлять такими атрибутами файлов, как время изменения (mtime), на стороне NFS-клиента, без необходимости сброса изменений на сервер. В NFS также улучшена поддержка протокола “LOCALIO“, позволяющего определить находятся ли клиент и сервер NFS на одном и том же хосте, для задействования соответствующих оптимизаций, таких как использование клиентом прямого ввода/вывода (Direct I/O).
    • Повышена производительность операций чтения в файловых системах NETFS, CIFS и AFS (Andrew File System).
    • В Squashfs включён режим прямой загрузки блоков в страничный кэш (SQUASHFS_FILE_DIRECT), позволяющий обойтись без отдельного кэша read_page. Изменение позволило сократить размер памяти, потребляемой при работе Squashfs.
    • В системном вызове statx() реализован флаг STATX_DIO_READ_ALIGN, для определения требуемого выравнивания для операций чтения из файла.
    • В файловой системе Bcachefs обновлён и стабилизирован формат дисковых структур. Любые дальнейшие изменения формата будут отнесены к категории не обязательных и будут реализовываться в форме опциональных дополнений. Значительно повышена скорость проверки целостности ФС.
      Кроме того, в Bcachefs улучшена работа в режиме только для чтения; устранены проблемы, приводящие к обращению к памяти после её освобождения (use after free); решены проблемы c reflink-указателями в fsck; исправлена обработка перезапуска транзакции.
    • Возвращён модуль md-linear, предназначенный для объединения блочных устройств. Данный модуль ранее был объявлен устаревшим и удалён из ядра 6.8, но как оказалось он был востребован и поэтому теперь восстановлен.
    • Файловые системы F2FS и SQUASHFS переведены на использование фолиантов страниц памяти (page folios).
    • Файловые системы OCFS2 и DLMFS переведены на использование нового API монтирования разделов.
    • В драйвере null_blk реализован атрибут “rotational”, выставляемый через configfs и позволяющий симулировать работу с устройством на базе вращающихся дисков для упрощения тестирования функций ядра.
    • В системе Device mapper и в модулях dm-mirror, dm-io, dm-table, dm-linear, dm-stripe и dm-raid1 реализована поддержка атомарной записи.
  • Память и системные сервисы
    • Завершена интеграция в ядро драйвера ntsync, реализующего символьное устройство /dev/ntsync и набор примитивов для синхронизации, применяемых в ядре Windows NT. Реализация подобных примитивов на уровне ядра позволяет существенно поднять производительность Windows-игр, запускаемых при помощи Wine. Прирост производительности достигается благодаря избавлению от накладных расходов, связанных с применением RPC в пространстве пользователя. Создание отдельного драйвера для ядра Linux объясняется проблематичностью корректной реализации API синхронизации NT поверх существующих примитивов в ядре.
    • Добавлен новый контроллер cgroup DMEM для раздельного учёта областей памяти устройств, таких как GPU. DMEM позволяет создавать отдельные cgroup для различных задач, работающих с GPU, чтобы они могли выполняться не влияя друг на друга. Новая возможность решает проблему с принудительным завершением операций с GPU при исчерпании доступной памяти, благодаря учёту отражённой памяти GPU и используемой драйверами памяти CPU в отдельных cgroup.
    • Внесены оптимизации по масштабированию операции сброса (flush) кэша TLB (Translation Lookaside Buffer), применяемого для ускорения преобразования виртуальных адресов в физические. Добавленные оптимизации сводятся к отложенному обновлению некоторых структур данных во время переключения контекста, что позволяет повысить производительность при прохождении некоторых тестов.
    • Повышена производительность механизма MGLRU (Multi-Generational LRU), применяемый для определения какие страницы памяти используются, а какие можно вытеснить в раздел подкачки.
    • Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Предоставлена возможность использования в коде ядра макроса “derive(CoercePointee)”, позволяющего использовать умные указатели с trait-объектами. В состав ядра включены Rust-обвязки для PCI, платформ, Open Firmware, символьных устройств и некоторых функций ввода/вывода.
      Грег Кроа-Хартман (Greg Kroah-Hartman), отвечающий за поддержку стабильной ветки ядра Linux, охарактеризовал текущее состояние, как “почти готовность к написанию реального драйвера на Rust”.
    • В сборочных сценариях предложен новый код для генерации версий отладочных символов для загружаемых модулей, который теперь использует информацию из отладочных записей в формате DWARF, а не разбирает исходный код напрямую. Изменение позволяет применять версионирование отладочных символов для модулей, написанных на языке Rust. Старая реализация тоже оставлена в ядре, а выбор генератора производится на уровне сборочных опций.
    • Для архитектуры PowerPC реализована поддержка режима ленивого вытеснения задач (PREEMPT_LAZY, lazy preemption), который соответствует режиму полного вытеснения (“full preemption”) для realtime-задач (RR/FIFO/DEADLINE), но задерживает вытеснение обычных задач (SCHED_NORMAL) до границы тика.
    • В подсистему профилирования производительности “perf” добавлена поддержка счётчиков энергопотребления процессоров AMD. Добавлена возможность работы на системах, насчитывающих до 2048 ядер CPU.
    • Предоставлена возможность использования sysctl-параметра pid_max с пространствами имён идентификаторов процессов (ID namespace). Параметр pid_max предназначен для ограничения максимального значения идентификаторов процессов (PID) и теперь может использоваться для ограничения максимально возможного числа процессов, запущенных в указанном пространстве имён. Обработка параметра производится иерархически, т.е. ограничения во внешних пространствах имён распространяются на вложенные пространства имён.
    • При использовании для запуска процесса системного вызова execveat в файловой системе /proc теперь будет отображаться имя запущенного файла, а не номер файлового дескриптора.
    • В состав исходного кода ядра (в каталог samples) добавлена утилита mountinfo, демонстрирующая использование системных вызовов statmount() и listmount().
    • В подсистеме BPF предложены новые функции bpf_local_irq_save() и bpf_local_irq_restore() для временного отключения прерываний на локальном CPU. Функции могут применяться для реализации структур, обработка которых не приостанавливается прерываниями.
    • В системном вызове madvise() при использовании флагов MADV_DONTNEED и MADV_FREE обеспечено освобождение таблиц страниц памяти, связанных с освобождаемым диапазоном адресов, так как в некоторых ситуациях пустые страницы памяти могут занимать достаточно много памяти.
    • Для архитектуры OpenRISC реализована поддержка механизма перезапускаемых последовательностей (rseq, restartable sequences), предназначенного для быстрого атомарного выполнения операций, которые в случае прерывания другим потоком очищаются и предпринимается повторная попытка выполнения.
    • Проведена реорганизация кода с реализацией алгоритмов CRC32 и CRC-T10DIF, который больше не пересекается с подсистемой crypto и вызывается напрямую из библиотечного интерфейса. Изменение позволило упростить код и повысить его эффективность.
    • В систему асинхронного ввода/вывода io_uring добавлен интерфейс для передачи дополнительных метаданных о целостности при выполнении операций чтения и записи.
  • Виртуализация и безопасность
    • В системный вызов execveat добавлен флаг AT_EXECVE_CHECK, позволяющий выполнить проверку допустимости исполнения файла без его фактического запуска, но c учётом политик безопасности, прав доступа и активных LSM-модулей. Для использования в сочетании с AT_EXECVE_CHECK предложены securebit-флаги SECBIT_EXEC_RESTRICT_FILE и SECBIT_EXEC_DENY_INTERACTIVE, которые можно использовать для ограничения исполнения файлов со скриптами на интерпретируемых языках программирования. Флаг SECBIT_EXEC_RESTRICT_FILE предписывает компоновщикам и интерпретаторам использовать опцию AT_EXECVE_CHECK для проверки допустимости исполнения, а флаг SECBIT_EXEC_DENY_INTERACTIVE запрещает обрабатывать интерактивные команды. Основная идея изменения в возможности применения политик безопасности не только к традиционным исполняемым файлам, но и к текстовым файлам со скриптами, которые можно загрузить через запуск интерпретатора (т.е. запрет на исполнение может быть реализован не только при запуске “./script.sh” но и при выполнении в форме “sh script.sh”).
    • На системах x86 реализована поддержка защищённых счётчиков времени для гостевых систем, не позволяющих изменять системные часы гостевой системы из хост окружения. Возможность реализована на базе механизма AMD SEV (Secure Encrypted Virtualization), применяемого в системах виртуализации для защиты виртуальных машин от вмешательства со стороны гипервизора или администратора хост-системы.
    • В систему мандатного контроля доступа SELinux добавлена поддержка xperm-правил, позволяющих привязывать политики SELinux к определённым вызовам ioctl() или сообщениям netlink.
    • Для заверения модулей ядра цифровой подписью вместо SHA1 по умолчанию задействован алгоритм SHA512.
    • В драйверах для гостевых систем VirtualBox включена поддержка архитектуры ARM64.
    • В гипервизоре KVM продолжена работа над задействованием
      механизма Intel TDX (Trusted Domain Extensions) для шифрования памяти гостевых систем.
    • В virtio_blk добавлена поддержка режима восстановления ошибок.
  • Сетевая подсистема
    • В реализации протокола RxRPC появилась возможность использования больших кадров UDP для повышения пропускной способности.
    • Для TCP добавлена поддержка алгоритма RACK-TLP для определения потери пакетов.
    • Добавлен новый параметр sysctl tcp_tw_reuse_delay, действующий в привязке к пространству имён (network namespace) и позволяющий определить задержку, вносимую перед тем как система сможет повторно использовать номер сетевого порта после закрытия TCP-сокета.
    • Добавлена возможность выбора провайдера точного времени (PTP) для формирования временных меток на уровнях PHY и MAC.
    • Для IPsec реализована поддержка механизма агрегирования и фрагментирования инкапсулированных IP-пакетов – IP-TFS/AGGFRAG (IP Traffic Flow Security/Aggregation and Fragmentation Mode for Encapsulating Security Payload).
    • В систему сетевых сокетов добавлена поддержка передачи информации о приоритете (SO_PRIORITY) в форме управляющих сообщений (cmsg – control messages). Для сетевых сокетов добавлена опция SO_RCVPRIORITY, включающая в функции recvmsg() передачу информацию о приоритете сокета.
  • Оборудование
    • Добавлен драйвер amdxdna для интегрированных в CPU AMD ускорителей NPU (Neural Processing Unit) на базе архитектуры XDNA, предназначенных для ускорения операций, связанных с машинным обучением. NPU на базе архитектуры XDNA поставляется в сериях 7040 и 8040 процессоров AMD Ryzen, ускорителях AMD Alveo V70 и SoC AMD Versal.
    • В драйвер i915 добавлены идентификаторы новых GPU, реализован обработчик сбоев инициализации HDMI, повышена надёжность сброса движков GPU на Haswell и более старых системах.
    • Продолжена работа над drm-драйвером (Direct Rendering Manager) Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake.
    • В драйвере Nouveau добавлена возможность передачи буферов с логами GSP-RM через debugfs.
    • В драйвере AMDGPU реализована поддержка механизма DRM panic, отображающего подобие “синего экрана смерти” при сбоях. Продолжена подготовка к поддержке будущей серии графических карт Radeon RX 9000 на базе архитектуры RDNA4. Обновлена поддержка DCN 3.5, GG 9.5, IH 4.4, PSP 13.x, SMU 13.x, VCN 5.x, JPEG 5.x, GC 12.x, DC FAMS, RAS и ISP.
    • В DRM-драйвер msm (GPU Qualcomm Adreno) добавлена поддержка платформы Qualcomm SM6150 (QCS615).
    • В DRM-драйвер panfrost добавлена поддержка SoC MediaTek MT8188 c GPU Mali-G57.
    • В DRM-драйвер vc4 добавлена поддержка SoC Broadcom BCM2712 (Raspberry Pi 5).
    • В vfio-драйвер nvgrace-gpu добавлена поддержка чипов NVIDIA Grace Blackwell 200.
    • В состав включён драйвер для контроллеров Intel THC (Touch Host Controller), применяемый для взаимодействия с сенсорными экранами и тачпадами на некоторых ноутбуках. Добавлена поддержка устройств Wacom с интерфейсом PCI. Добавлена поддержка игровых контроллеров QH Electronics.
    • Добавлена поддержка ARM-плат, SoC и устройств: Qualcomm Snapdragon 8 Elite (SM8750), Qualcomm Snapdragon AR2 (SAR2130P), Qualcomm IQ6/IQ8, Snapdragon 425 (MSM8917), Samsung Exynos 9810, Blaize BLZP1600, Microchip SAMA7D65, Renesas R-Car V4H ES3.0, Renesas RZ/G3E. Добавлена поддержка платы SpacemiT K1 на базе архитектуры RISC-V.
    • В звуковой подсистеме ALSA для MIDI 2.0 расширены API rawmidi и sequencer. В API для выноса операций сжатия на сторону звуковой карты добавлена поддержка ASRC (Asynchronous Sample Rate Conversion).
    • Добавлена поддержка звуковых систем устройств Allwinner suinv F1C100s, Awinc AW88083, Realtek ALC5682I-VE, TAS2781, Focusrite Scarlett 4th Gen 16i16, 18i16 и 18i20. Добавлена поддержка беспроводных наушников SteelSeries Arctis 9.
  • Release. Ссылка here.