Релиз ядра Linux 6.9

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.9. Среди наиболее заметных изменений: модуль dm-vdo для дедупликации и сжатия блочных устройств, режим прямого доступа к файлам в FUSE, поддержка создания pidfd для отдельных потоков, механизм BPF-токенов, поддержка Rust на системах ARM64, перевод драйвера ФС Ext2 в разряд устаревших, удаление старого драйвера NTFS, поддержка механизма Intel FRED. В новую версию принято 15680 исправлений от 2106 разработчиков, размер патча - 54 МБ (изменения затронули 11825 файлов, добавлено 687954 строк кода, удалено 225344 строк). В прошлом выпуске было 15641 исправление от 2018 разработчиков, размер патча - 44 МБ. Около 42% всех представленных в 6.9 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 13% связано с сетевым стеком, 7% - с файловыми системами и 4% c внутренними подсистемами ядра. Основныеновшествав ядре6.9:
  • Дисковая подсистема, ввод/вывод и файловые системы
    • В Device Mapper (DM) добавлен новый обработчик dm-vdo (virtual data optimizer), позволяющий на базе существующих блочных устройств реализовать виртуальное блочное устройство, обладающее такими возможностями, как дедупликация повторяющихся данных, сжатие данных, исключение пустых блоков и увеличения размера блочного устройства по мере появления необходимости (thin provisioning). Указанные возможности реализуются на уровне блочного устройства и не зависят от используемой файловой системы (например, при помощи dm-vdo можно реализовать автоматическое объединение дублирующихся данных и хранение информации в сжатом виде для любых ФС). Поддерживается применение dm-vdo для физических хранилищ, размером до 256TB, и создание логических томов, размером до 4PB. Для управления разделами vdo рекомендуется использовать lvm. Технология VDO разработана компанией Permabit и открыта после её поглощения Red Hat в 2017 году.
    • В подсистеме FUSE, применяемой для реализации файловых систем в пространстве пользователя, добавлена начальная реализация режима "passthrough", позволяющего напрямую на уровне ядра получать данные файлов, минуя процесс, работающий в пространстве пользователя, что позволяет в некоторых ситуациях существенно повысить производительность. Например, FUSE-реализации ФС, работающие в режиме только для чтения и разграничивающие доступ к файлам, могут отдавать содержимое файлов из исходной ФС без их передачи в процесс FUSE.
    • В категорию устаревших (deprecated) переведён драйвер с реализацией файловой системы Ext2. В качестве причины упоминается поддержка в драйвере только 32-разрядных счётчиков времени в inode, которые переполнятся 19 января 2038 года. Вместо драйвера ext2 предлагается использовать драйвер ext4, который поддерживает работу с файловой системой Ext2 и полностью совместим с ней, но при этом может использовать в ext2-разделах временные метки, не подверженные проблеме 2038 года, если ФС создана с inode, размером более 255 байт (в драйвере ext2 32-разрядные счётчики времени использовались независимо от размера inode).
    • Удалён старый драйвер файловой системы NTFS, на смену которому начиная с выпуска 5.15 пришёл новый драйвер NTFS3. Поставка в ядре двух драйверов с реализацией NTFS признана нецелесообразной, с учётом того, что старый драйвер не обновлялся уже много лет, находится в плачевном состоянии и может работать только в режиме чтения.
    • В файловые системы zonefs и hugetlbfsдобавлена поддержка маппинга идентификаторов пользователей примонтированных файловых систем, применяемого для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
    • В NFSv4 для администраторов предоставлена возможность очистки состояний открытия и блокировки файлов.
    • Для файловой системы Ext4 отмечается только исправление ошибок и обновление kunit-тестов.
    • В Btrfs продолженперевод функций на использование фолиантов страниц памяти (page folios). Добавлены оптимизации для ускорения операций журналирования. Примерно на 6% повышена пропускная способность за счёт сокращения конкуренции блокировок. Исключено выполнение полного повторного сканирования квот, излишнего в некоторых ситуациях.
    • В exFAT значительно повышена производительность при монтировании с опцией "dirsync", при которой выполнение всех операций обновления каталогов осуществляется только в синхронном режиме.
    • В F2FS улучшена поддержка зонированных блочных устройств и добавлена возможность использования флагов SEEK_DATA и SEEK_HOLE для сжатых файлов.
    • В Bcachefs добавлена btree-структура с информацией о дочерних элементах подразделов, которая в будущем будет задействована в API для обхода подразделов. Улучшена проверка структуры каталогов. Улучшен процесс журналирования и повышена производительность при высокой нагрузке на запись. Увеличена эффективность операций Discard.
    • В файловой системе XFS продолжена работа над реализацией возможности применения утилиты fsck для проверки и исправления выявленных проблем в online-режиме, без отмонтирования файловой системы.
    • В системный вызов pwritev2() добавлен флаг RWF_NOAPPEND, позволяющий указать смещение для записи, даже если файл был открыт в режиме только добавления данных в конец файла.
    • Добавлены новые ioctl-команды: FS_IOC_GETUUID - возвращает UUID-идентификатор указанной файловой системы, и FS_IOC_GETFSSYSFSPATH - определяет местоположение в /sys/fs заданной примонтированной ФС.
    • Файловые системы efs, qnx4 и coda переведены на использование нового API монтирования разделов.
    • Улучшена реализация операций с файлами, выполняемых в режиме без учёта регистра символов. Повышена производительность за счёт выполнения вначале сравнения с учётом регистра и отката на поиск без учёта регистра. Решены проблемы при монтировании overlayfs поверх каталогов, для которых выставлен режим без учёта регистра символов.
  • Память и системные сервисы
    • Реализованаподдержка механизма Intel FRED (Flexible Return and Event Delivery), созданного для повышения эффективности и надёжности доставки информации о низкоуровневых событиях, по сравнению с применяемым ныне механизмом IDT (Interrupt Descriptor Table). Повышение производительности и сокращение задержек обеспечивается благодаря возвращению событий процессорной инструкцией IRET вместо передачи событий через таблицу IDT. Повышение надёжности достигается из-за раздельной обработки поступления события в контексте ядра и контексте пользователя, защиты от вложенного выполнения NMI и сохранения в расширенном кадре стека всех связанных с исключением регистров CPU.
    • Добавлена возможность оптимизации доступа к данным отдельных ядер CPU через использования в коде ядра именованных адресных пространств (Named Address Spaces), реализованных в GCC в форме расширения GNU C.
    • В функцию pidfd_open() добавлен флаг PIDFD_THREAD, позволяющий создавать pidfd для отдельных потоков, а не только использовать pidfd в контексте лидера группы потоков. Также предложена реализация псевдо-ФС для доступа к pidfd через виртуальную файловую систему. В отличие от идентификации процессов при помощи pid, идентификатор pidfd связывается с конкретным процессом и не меняется, в том время как PID после завершения текущего процесса может быть привязан к другому процессу.
    • В подсистему BPF добавлен механизм BPF-токенов, позволяющий выборочно делегировать программам права доступа к привилегированным BPF-операциям, например, можно предоставить непривилегированному приложению доступ к отдельным подсистемам BPF без предоставления полных прав CAP_BPF.
    • В подсистему BPF добавлен новый тип разделяемой памяти bpf_arena, определяющий область, доступную для совместного использования программами BPF и процессами в пространстве пользователя. Добавлена инструкция may_goto, позволяющая организовать работу циклов, которые могут быть прерваны верификатором. Добавлена возможность генерации из BPF-программ произвольных TCP SYN cookie и создания BPF-обработчиков для борьбы с SYN-флудом.
    • В системе управления памятью реализованаподдержка паралелльной инициализации больших страниц памяти (HugeTLB), которая позволила заметно ускорить процесс загрузки на системах с очень большим объёмом ОЗУ. Например, на системе с 12 ТБ ОЗУ инициализация HugeTLB размером 1GB сократилась с 77 до 18 секунд.
    • Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Добавлена поддержка использования языка Rust при работе на 64-разрядных процессорах ARM. Осуществлён переход на использование выпуска Rust 1.76. Добавлен макрос 'container_of!'. Вместо нестабильной функциональности 'ptr_metadata' задействован стабильный метод 'byte_sub'. Добавлен модуль 'time' с функцией преобразования времени 'msecs_to_jiffies()'.
    • В подсистему io_uringдобавлена возможность усечения файлов (ftruncate_file).
    • Добавлен новый тип рабочих очередей WQ_BH (workqueue Bottom Halves) для асинхронного выполнения кода в контексте программных прерываний, нацеленный на использование вместо устаревших tasklet-ов.
    • Значительно переработана подсистема работы с таймером, в которой улучшена логика выбора активного ядра CPU для выполнения сработавшего таймера, чтобы не выводить из спящего режима неактивные ядра.
    • Реализована возможность обновления модели потребления энергии ядра (EM, Energy Model) во время работы, что может использоваться, например, для учёта влияния рабочей температуры на энергетическую эффективность CPU. Значительно повышена производительность функции em_cpu_energy(), которая в тестах на стационарной системе теперь выполняется быстрее в 1.43 раза, а в тесте на плате RockPi 4B - в 1.69 раза.
    • Добавлена поддержка запуска систем на базе архитектуры ARM64 в режиме LPA2 с 52-разрядным виртуальным адресным пространством.
    • Для систем ARM64 реализована поддержка непрерывных записей PTE (Page Table Entry), позволяющих повысить производительность за счёт повышения эффективности использования TLB (Translation Lookaside Buffer).
    • Приняты патчи для повышения производительности подсистемы управления памятью за счёт сокращения возникновения конкурирующих блокировок в vmalloc().
    • Для архитектуры LoongArch реализован механизм горячего наложения патчей на ядро (live patching), позволяющий применять исправления к ядру без перезагрузки.
    • Для систем RISC-V реализована поддержка системного вызова membarrier(), обеспечивающего установку барьеров на память для работающих в системе потоков. Добавлены реализации алгоритмов AES-ECB, AES-CBC, AES-CTR, AES-XTS, ChaCha20, GHASH, SHA-256, SHA-384, SHA-512, SM3 и SM4, ускоренные при помощи векторных инструкций RISC-V.
    • В драйвер amd-pstate, применяемый для управления энергопотреблением на системах с процессорами AMD, добавлена возможность использования информации о приоритетных ядрах CPU (Preferred Core), на которых допускается выставление более высокой частоты, для их первоочередного выбора в планировщике для выполнения приоритетных задач.
    • Максимальный размер шрифтов, которые допускается использовать в консоли fbcon увеличен до 64x128, что позволяет сформировать комфортное отображение текста на экранах 4k.
    • Добавлена настройка USB_DEFAULT_AUTHORIZATION_MODE, позволяющая изменить применяемый по умолчанию режим авторизации, используемый при подключении USB-устройств и определяющий будет ли система сразу использовать подключённое устройство: 0 - требуется активация из пространства пользователя, 1 (по умолчанию) - все устройства можно использовать сразу и 2 - активация не требуется для внутренних устройств.
    • Подняты требования к версии LLVM/Clang, которую можно использовать для сборки ядра. Для сборки теперь требуется как минимум выпуск LLVM 13.0.1 (ранее поддерживалась сборка в LLVM 11+).
    • В механизм "User trace events", позволяющий создавать события трассировки из пользовательских процессов для отслеживания активности в пространстве пользователя, добавлена поддержка экспорта сведений о событии в различных форматах (USER_EVENT_REG_MULTI_FORMAT).
    • В механизм трассировки вызова функций добавлена возможность отслеживания состояния входящих аргументов функции при трассировке выхода из функции. Значения оператора return теперь можно сопоставить с аргументами, использованными при вызове функции.
    • В утилиту perf добавлена поддержка режима агрегирования вывода "cluster" ("perf stat -a --per-cluster") для объединения статистики разделяемых ресурсов. Реализована возможность задействования библиотеки libcapstone для дизассемблирования процессорных инструкций ("perf script -F disasm"). Проведены оптимизации потребления памяти при выполнении команд perf report' и 'perf annotate'.
  • Виртуализация и безопасность
    • Добавлена защита от уязвимости RFDS (Register File Data Sampling) в процессорах Intel Atom, позволяющей извлечь остаточную информацию из регистровых файлов (RF, Register File) процессора, которые используются для совместного хранения содержимого регистров во всех задачах на том же ядре CPU. Для блокирования уязвимости требуется обновление микрокода и использование инструкции VERW для очистки содержимого микроархитектурных буферов в момент возвращения из ядра в пространство пользователя. Для включения защиты при загрузке ядра можно указать флаг "reg_file_data_sampling=on". Информация о подверженности уязвимости и наличии необходимого для защиты микрокода можно оценить в файле "/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling".
    • Добавлена базовая поддержка защиты гостевых систем при помощи расширения AMD SEV-SNP (Secure Nested Paging), обеспечивающего безопасную работу с вложенными таблицами страниц памяти и защищающего от атак "undeSErVed" и "SEVerity" на процессоры AMD EPYC, позволяющих обойти механизм защиты AMD SEV (Secure Encrypted Virtualization). В KVM необходимые для использования SNP изменения планируются добавить в ветке 6.10.
    • Модули с реализацией технологий IMA (Integrity Measurement Architecture) и ЕVM (Extended Verification Module) переведены на использование фреймворка LSM (Linux Security Modules), что без потери функциональности позволило заметно упростить код, объединить дублирующуюся функциональность и задействовать доступные через LSM типовые возможности. Модуль IMA предназначен для проверки целостности компонентов операционной системы по цифровым подписям и хэшам. Модуль EVM позволяет защитить расширенные атрибуты файлов (xattrs) от атак, направленных на нарушение их целостности (EVM не позволит совершить offline-атаку, при которой злоумышленник может изменить метаданные, например, загрузившись со своего накопителя).
    • Переделаны для большей совместимости с 32-разрядными окружениями системные вызовы lsm_list_modules(), lsm_get_self_attr() и lsm_set_self_attr(), предназначенные для вывода списка загруженных LSM-модулей (Linux Security Modules) и получения/выставления атрибутов LSM-модуля. Изменение нарушает обратную совместимость, но так как новые системные вызовы были добавлены в прошлом выпуске ядра и пока не используются в приложениях, Линус Торвальдс посчитал, что изменение допустимо.
    • Предпринята попытка возобновленияиспользования механизма UBSAN (Undefined Behavior Sanitizer). Сутьпроблемы в том, что компиляторы по разному обрабатывают целочисленные переполнения знаковых и беззнаковых типов. Знаковые переполнения и переполнения указателей относятся к категории неопределённого поведения, а беззнаковые переполнения отсекаются по модулю 2n с сохранением только младших битов результата ("wrap-around") и не подпадают под неопределённое поведение. Чтобы исключить ситуации с возникновением неопределённого поведения ядро собирается с опцией "-fno-strict-overflow", которая приводит к использованию "wrap-around" для всех целочисленных переполнений. GCC и Clang не могут нормально диагностировать некоторые проблемы при использовании флага "-fno-strict-overflow" и включение UBSAN нацелено на проведение совместной с разработчиками компиляторов работы по устранению возникающих ложных срабатываний и выявления целочисленных переполнений в местах, в которых отсутствуют явные проверки. Для проверки возможных переполнений в ядре используются конструкции вида "var + offset PAGE_SHIFT) Предложение более масштабной переделки ядра с введением дополнительных определений типов отвергнуто Линусом Торвальдсом.
  • Сетевая подсистема
    • В сетевой подсистеме проведена работа по снижению возникновения конкурирующих блокировок ("lock contention", попытка получить блокировку, удерживаемую другим потоком). Сокращено использования блокировок RTNL.
    • Добавлена возможность включения поддержки активного полинга сокетов (busy polling) в контексте отдельных вызовов epoll. Размер пула и параметры бюджета могут выставляться отдельно от системных параметров по умолчанию.
    • Реализована структура net_hotdata для повышения эффективности кэширования наиболее часто используемых переменных сетевой конфигурации.
    • В MPTCP добавлена поддержка установки для сокетов опции TCP_NOTSENT_LOWAT, позволяющей ограничить размер буфера отправки. В API для сокетов MPTCP добавлена поддержка индентификаторов сети ("network ID"), дающих возможность использовать на одном хосте несколько непересекающихся сетей MPTCP.
    • В IPSec добавлена поддержка перенаправления ICMP-сообщений с информацией об ошибках (RFC 4301).
    • Ускорен процесс сканирования маршрутов с истекшим временем жизни.
    • Ускорена работа XDP, благодаря более жёсткому избеганию выделения больших блоков памяти.
    • Добавлена возможность прикрепления метаданных к сообщениям netconsole.
    • В Netfilter разрешено определение из пространства пользователя таблиц, которые привязываются к управляющему фоновому процессу и не удаляются автоматически после завершения пользовательского приложения.
    • В nftables ускорено добавление элементов в set-наборы с объединёнными диапазонами.
  • Оборудование
    • В драйвере i915 продолженаработа по реализации поддержки чипов Intel LunarLake (Xe 2). Добавлены новые PCI-идентификаторы для устройств на базе чипов Intel Arrow Lake и Alder Lake N. Для Displayport добавлена поддержка туннелинга (DP tunneling) и выделения пропускной способности (bandwidth allocation). Для всех платформ включён режим fastboot, отключающий лишние переключения видеорежимов во время загрузки. Добавлена поддержка отладочного вывода в привязке к отдельным устройствам.
    • В драйвере AMDGPU проведена подготовка к реализации поддержки GPU AMD RDNA3.5 и RDNA4. Добавлена поддержка ATHUB 4.1, LSDMA 7.0, JPEG DPG, IH 7.0, HDP 7.0, VCN 5.0, SMU 13.0.6, NBIO 7.11, SDMA 6.1, MMHUB 3.3, DCN 3.5.1, NBIF 6.3.1, VPE 6.1.1 и фреймворка RAS ACA. В модуль ядра добавлен параметр freesync_video для включения экспериментальной поддержки оптимизации воспроизведения видео с использованием технологии адаптивной синхронизации FreeSync (по умолчанию FreeSync для видео на уровне драйвера теперь отключён, так как KDE и GNOME реализовали собственные методы адаптивной синхронизации частоты кадров).
    • В драйвере Nouveau код управления экраном переведён на использование функции kmemdup().
    • Продолженаработа над drm-драйвером (Direct Rendering Manager) Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake.
    • Добавлен DRM-драйвер для чипов Mediatek MT8188 VDOSYS1.
    • Связанные с видеоподсистемами настройки ядра перенесены в секцию CONFIG_VIDEO.
    • В драйвер xpad добавлена поддержка геймпадов Snakebyte и ASUS ROG RAIKIRI. В подсистему HID (Human Interface Device) добавлена поддержка клавиатур, мышей и геймпадов от компании Samsung, использующих Bluetooth.
    • Добавлена поддержка ARM64 SoC: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
    • Добавлена поддержка ARM-плат и устройств:
      • Rockchip - Pine64 PineTab2, QNAP TS433 NAS, игровые консоли Powkiddy RGB10MAX3, Anbernic RG-ARC S и RG-ARC D, платы Toybrick TB-RK3588X и Theobroma Systems RK3588-Q7.
      • Allwinner - Sipeed Longan Pi 3H (Allwinner H618), Remix Mini PC (Allwinner H64).
      • Qualcomm - Samsung Galaxy Tab 4 10.1 LTE (SM8550, Snapdragon 8 Gen 2), Samsung Galaxy Core Prime, Samsung Galaxy Grand Prime (MSM8916).
      • Amlogic - Freebox Pop Player (IPTV).
      • Mediatek - Banana Pi BPI-R4, Xiaomi AX3000T, Radxa NIO 12L, Acelink EW-7886CAX, пять моделей Chromebook.
      • NVIDIA - два Android-смартфона на чипе Tegra30.
      • Renesas - плата White Hawk.
    • Добавлена поддержка SoC Mobileye на базе процессоров MIPS.
    • Проведён рефакторинг кода звуковой подсистемы ALSA. Добавлена поддержка звуковых систем Microchip SAM9x7, NXP i.MX95, Rockchip RK3308 и Qualcomm WCD939x. В драйвер SoundWire добавлена поддержка ASoC со звуковыми сопроцессорами AMD ACP 6.3, а для систем Intel реализован режим DSPless. Добавлена поддержка дополнительных звуковых кодеков Cirrus HD. В драйвере virtio улучшено управление звуковыми устройствами.
    • Добавлена поддержка Ethernet-контроллеров Marvell Octeon PCI Endpoint NIC VF и Intel E825-C 100G.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.9 - Linux-libre 6.9-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.9 обновлён код чистки блобов в драйверах amdgpu, ath12k, adreno, btusb и r8169. Проведена чистка нового драйвера ptp_fc3. Проведена чистка имён блобов в dts-файлах (devicetree) для архитектуры Aarch64. Устранены проблемы с чисткой драйвера i915, приводившие к зависанию во время инициализации. Внесены изменения, связанные с обработкой блобов, поставляемых в виде шестнадцатеричных дампов.