Релиз ядра Linux 6.13

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.13. Среди наиболее заметных изменений: режим ленивого вытеснения в планировщике задач, поддержка атомарной записи в XFS и Ext4, механизм “multigrain timestamps”, адаптивный режим включения полинга в сетевой подсистеме, возможность сборки с оптимизациями AutoFDO, поддержка механизма защиты ARM65 Guarded Control Stack, раздельные стеки в BPF, удаление ReiserFS, режим монтирования tmpfs учёта регистра символов, поддержка POSIX-расширений в SMB3.

В новую версию принято 14172 исправлений от 2086 разработчиков,
размер патча – 46 МБ (изменения затронули 15375 файлов, добавлено 598707 строк кода, удалено 406294 строк). В прошлом выпуске было 14607 исправлений от 2167 разработчиков, размер патча – 37 МБ. Около 52% всех представленных в 6.13
изменений связаны с драйверами устройств, примерно 13% изменений имеют
отношение к обновлению кода, специфичного для аппаратных архитектур, 11%
связано с сетевым стеком, 4% – с файловыми системами и 3% c внутренними
подсистемами ядра.

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

  • Дисковая подсистема, ввод/вывод и файловые системы
    • Добавлен механизм “multigrain timestamps“, позволяющий получать информацию о времени изменения или доступа к файлам c более чем с миллисекундой точностью, но без негативного влияния на производительность. Повышение точности меток приводит к дополнительным накладным расходам из-за увеличения интенсивности записи метаданных на диск, поэтому в предложенной реализации более точные метки создаются не для всех файлов, а только для тех, для которых процессы запрашивают подобные метки через вызов getattr().
    • Добавлена поддержка атомарных операций записи, при которых запись данных, размер которых превышает размер сектора, осуществляется атомарно на устройствах хранения, предоставляющих подобную возможность. В настоящее время атомарная запись реализована для XFS, Ext4 в режиме O_DIRECT (Direct I/O) и md RAID 0/1/10.
    • Предложен новый механизм подсчёта ссылок для файлов, обеспечивающий прирост производительности на 3-5% в рабочих нагрузках, имеющих более 255 потоков.
    • Удалена реализация файловой системы ReiserFS, которая в позапрошлом году была объявлена устаревшей.
    • Добавлен sysctl-параметр “fs.dentry-negative” для выставления в VFS политики очистки записей “dentry” (внутреннее представление элементов каталогов) после удаления связанных с ними файлов. Для каких-то видов нагрузки оптимальнее оставлять подобные записи об удалённых файлах, а для каких-то – удалять, поэтому в ядре предоставлена возможность выбора (по умолчанию “dentry” автоматически не удаляются).
    • В системный вызов statmount() добавлен флаг STATMOUNT_OPT_ARRAY для возвращения списка опций файловой системы в виде массива из строк, завершающихся нулевым символом и не использующих экранирование “00”. Добавлена поддержка возвращения подтипа ФС (fs_subtype, для определения использования FUSE), опций безопасного монтирования и исходного суперблока (sb_source).
    • В OverlayFS предоставлена возможность указания слоёв через файловые дескрипторы, а не имена файловых путей.
    • В файловую систему tmpfs добавлена опция монтирования “casefold” для работы без учёта регистра символов и опция “strict_encoding” для блокирования создания файлов с именами, содержащими некорректные символы UTF-8.
    • Предложен новый набор системных вызовов для управления расширенными атрибутами файлов: setxattrat(), getxattrat(), listxattrat() и removexattrat(). В отличие от системных вызовов setxattr(), getxattr(), listxattr() и removexattr() новые варианты требуют указания файлового дескриптора каталога, относительно которого осуществляется поиск файлового пути.
    • В Btrfs добавлена ioctl-операция BTRFS_IOC_SUBVOL_SYNC_WAIT, включающая ожидание завершения очистки подразделов, что позволяет выполнить команду “btrfs subvolume sync” непривилегированным пользователем, не имеющим доступа к ioctl SEARCH_TREE (полезно в приложениях резервного копирования, очищающих подразделы). Добавлена ioctl-операция ENCODED_READ для чтения через io_uring закодированных данных, например, для чтения напрямую сжатых экстентов без распаковки. Продолжена работа по переходу на использование фолиантов страниц памяти (page folios). Сокращено возникновение конкурирующих блокировок (“lock contention”) при поиске встроенных обратных ссылок и при переборе буферов экстентов. Повышена эффективность сжатия карты экстентов.
    • В файловой системе EROFS (Extendable Read-Only File System), предназначенной для использования на разделах, доступных в режиме только для чтения, реализована возможность использования в системном вызове lseek() опций SEEK_HOLE и SEEK_DATA.
    • В F2FS добавлена поддержка отражения устройств (“device aliasing”), позволяющая временно зарезервировать область в F2FS для использования части блочного устройства в другой ФС. После завершения внешней операции зарезервированную область можно вернуть в F2FS. Например, можно создать ФС командой “mkfs.f2fs -c /dev/[email protected] /dev/vdb”, после чего содержимое устройства /dev/vdc будет зарезервировано и отражено в файл vdc.file и раздел /dev/vdc можно использовать для своих нужд, например, отформатировать под другую ФС. Для возвращения зарезервированного содержимого достаточно удалить файл vdc.file.
    • В XFS включена поддержка квот для realtime-устройств. Добавлена поддержка директории с метаданными (metadata directory), в которой размещаются все inode с метаданными.
    • В механизме FUSE включена возможность динамического изменения максимального числа страниц (FUSE_MAX_MAX_PAGES), используя “sysctl fs.fuse.max_pages_limit”. В работе задействованы фолианты страниц памяти (page folios).
    • В SMB реализована поддержка POSIX-расширений для SMB3, необходимых для хранения специальных типов файлов, таких как fifo, файлы устройства и символические ссылки. Добавлена возможность монтирования раздела с альтернативным паролем, применяемым при ротации паролей. Добавлена новая опция монтирования “cifs.upcall” для определения пространства имён. Обеспечено распознавание файлов символьных и блочных устройств, созданных в Windows NFS
      Server. Добавлена поддержка символических ссылок в стиле WSL (Windows Subsystem for Linux).
    • Файловые системы UBIFS, ADFS, BEFS, HFS, HFSPLUS, HPFS, JFS и ECRYPTFS переведены на использование нового API монтирования разделов.
    • Файловые системы и ECRYPTFS, UFS и NILFS2 переведены на использование фолиантов страниц памяти (page folios).
  • Память и системные сервисы
    • В планировщике реализована модель ленивого вытеснения задач (PREEMPT_LAZY, lazy preemption), которая аналогична модели полного вытеснения (“full preemption”) для realtime-задач (RR/FIFO/DEADLINE), но задерживает вытеснение обычных задач (SCHED_NORMAL) до границы тика. Указанная задержка приводит к сокращению случаев вытеснения держателей блокировок, что позволяет приблизить производительность к конфигурациям, использующим модель добровольного вытеснения (voluntary preemption). Таким образом, новая модель позволяет сохранить возможности полного вытеснения в отношении realtime-задач, но сводит к минимуму проседание производительности для обычных задач. Кроме того, новая модель упрощает логику операций вытеснения в ядре, благодаря сокращению вовлечения в процесс планирования обработчиков, находящихся в компонентах ядра, вне планировщика задач.
    • При сборке компилятором Clang предоставлена возможность использования оптимизаций AutoFDO и добавлена конфигурация для инструментария Propeller. Оптимизация AutoFDO (Auto-Feedback-Directed Optimization) использует результаты профилирования c информацией о частоте выполнения различных участков кода для повышения производительности часто выполняемых операций. Проведённое тестирование показало снижение задержек на 10% при сборке с AutoFDO. Propeller используется для накопления статистики о выполнении кода для её дальнейшего использования компилятором при принятии решений, связанных с оптимизацией.
    • В системный вызов madvise(), предоставляющий средства для оптимизации управления памятью процесса, добавлен флаг MADV_GUARD_INSTALL для подстановки в указанный диапазон адресов сторожевых страниц памяти (guard page), попытка доступа к которым вызывает исключение и аварийное завершение процесса (SIGSEGV). По сравнению с маппингом в режиме PROT_NONE сторожевые страницы позволяют более эффективно блокировать выполнение кода за пределами выделенной области памяти, так как их создание не требует выделения новой области виртуальной памяти.
    • Новые возможности подсистемы асинхронного ввода/вывода io_uring: изменение размера уже созданного кольцевого буфера; отправка в синхронном режиме сообщений в другой кольцевой буфер; частичное клонирование буфера; фиксированные области ожидания; гибридный полинг ввода/вывода; расширенный API для регистрации кольцевых буферов и областей памяти.
    • На системах с CPU AMD реализована возможность выявления расщеплённых блокировок (“split-lock”), возникающих при доступе к невыровненным данным в памяти, когда при выполнении атомарной инструкции данные пересекают две линии кеша CPU. Подобные блокировки приводят к значительному падению производительности (на 1000 циклов медленнее, чем атомарная операция с данными, попадающими в одну линию кеша).
    • Добавлен драйвер AMD Cache Optimizer, позволяющий использовать технологию AMD 3D V-Cache для повышения производительности отдельных ядер CPU за счёт увеличения размера доступного им L3-кэша (режим Cache) или повышения частоты (режим Frequency).
    • Для архитектуры MIPS добавлена поддержка систем с многокластерными (multi-cluster) контроллерами прерываний (для каждого кластера в CPU предусмотрен отдельный контроллер прерываний).
    • Добавлена новая ioctl-операция PIDFD_GET_INFO, позволяющая получить сведения о процессе по его идентификатору PIDFD. Идентификатор PIDFD связывается с конкретным процессом и не меняется, в то время как PID может быть привязан к другому процессу после завершения процесса, ассоциированного с этим PID.
    • В планировщик задач добавлены компоненты, необходимые для реализации механизма Proxy Execution, решающего проблему с перестановкой приоритетов (ситуация, когда низкоприоритетная задача удерживает ресурс, необходимый высокоприоритетной (realtime) задаче, и тем самым блокирует её). Осуществлено разделение контекстов планировщика и исполнения процессов.
    • Добавлен основанный на netlink API для выставления ограничений температуры в привязке к устройствам. При превышении данных ограничений в обработчик в пространстве пользователей передаются уведомления.
    • Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Добавлены обвязки над структурами данных и интерфейсами VFS, необходимые для работы драйвера Binder, переписанного на Rust. Добавлена поддержка событий трассировки в коде на Rust. Добавлены дополнительные обвязки для написания драйверов. Добавлены обвязки для pid_namespace.

      Предложен модуль ‘alloc’ с системой выделения памяти и специфичная для ядра реализация типажа Allocator, не привязанная к внешнему модулю Alloc и в отличие от последнего не использующая нестабильные возможности языка. На базе Allocator подготовлены реализации Kmalloc, Vmalloc и KVmalloc, а также созданы типы Vec и Box.

    • В подсистеме BPF предоставлена возможность использования в BPF-программах отдельного стека с целью снижения риска переполнений при обработке больших цепочек вызовов.Реализован итератор kmem_cache для получения из BPF-программы данных о состоянии механизма распределения памяти slab (slab allocator). Добавлена функция bpf_send_signal_task(), позволяющая BPF-программам отправлять сигналы другим процессам. Добавлен механизм разделяемой памяти BPF map, который можно использовать, например, для передачи сведений о нагрузке обработчикам планировщика задач sched_ext.
    • В систему трассировки добавлена возможность генерации исключения (page fault) при срабатывании точек трассировки на входе или выходе из системного вызова для чтения параметров, передаваемых из пространства пользователя.
    • Добавлен параметр командной строки ядра “transparent_hugepage_shmem” для управления использованием больших страниц памяти в ФС tmpfs и shmem.
    • Реализована поддержка работы в режиме реального времени на системах с архитектурой Loongarch.
    • Для систем RISC-V реализована поддержка расширений Smmpm”, “Smnpm” и “Ssnpm” для маскирования указателей в пространстве пользователя (использования части битов указателей для хранения не связанных с адресацией метаданных).
  • Виртуализация и безопасность
    • Для систем на базе архитектуры ARM64 добавлена поддержка запуска Linux в виртуальных машинах, изолированных при помощи технологии ARM CCA (Confidential Compute Architecture). ARM CCA предоставляет гарантии целостности памяти виртуальных машин и защищает их от модификации и анализа со стороны администратора хост-системы, способного выполнить код на уровне гипервизора.
    • Добавлена поддержка расширения ARM64 GCS (Guarded Control Stack) для аппаратной защиты адресов возврата из функций и блокирования эксплоитов, использующих методы возвратно-ориентированного программирования (ROP – Return-Oriented Programming, эксплоит формируется из уже имеющихся кусков машинных инструкций, завершающихся инструкцией возврата управления). ARM64 GCS позволяет использовать для защиты процессов в пространстве пользователя технику теневого стека (shadow stack) – после передачи управления функции, адреса возврата сохраняются процессором не только в обычном стеке, но и в отдельном теневом стеке, который не может быть изменён напрямую. Перед выходом из функции адрес возврата извлекается из теневого стека и сверяется с адресом возврата из основного стека.
    • В SELinux реализована поддержка управления политиками безопасности в привязке к отдельным операциям Netlink. Объявлен устаревшим и будет удалён одном из будущих выпусков конфигурационный интерфейс /sys/fs/selinux/user, который до 2020 года использовался в библиотеке libselinux.
    • В криптоподсистему ядра добавлен внутренний API Asymmetric Signature для генерации цифровых подписей по открытым ключам.
    • В подсистеме “iommufd“, позволяющей управлять таблицами страниц памяти ввода/вывода IOMMU (I/O Memory-Management Unit) через файловые дескрипторы из пространства пользователя, реализованы операции IOMMU_IOAS_MAP_FILE, IOMMU_IOAS_CHANGE_PROCESS, IOMMU_VIOMMU_ALLOC и IOMMU_VDEVICE_ALLOC. Добавлена возможность использования ARM SMMuv3 (System Memory Management Unit) для вложенной трансляции адресов.
    • Добавлен виртуализированный драйвер virtual-cpufreq для ядер, запускаемых в гостевых системах. Драйвер позволяет отправлять хосту запросы на изменение частоты виртуального CPU (vCPU), которые могут использоваться на стороне хоста при планировании изменения частоты реального CPU.
  • Сетевая подсистема
    • Добавлен новый режим доставки пакетов, адаптивно переключающийся между активным полингом (NAPI/busy polling, периодический опрос устройства ядром) и генерацией прерываний в зависимости от периодов активности приложения. Когда приложение находится в состоянии простоя (idle) используется обработка прерываний, а когда фиксируется высокая нагрузка – используется полинг.
    • Добавлен netlink API для управления полингом (NAPI) в сетевых драйверах, позволяющий настраивать отдельные экземпляры NAPI вместо настройки всего сетевого интерфейса.
    • Добавлен netlink API net-shaper для настройки ограничения интенсивности отправки пакетов (TX H/W shaping) с поддержкой интроспекции аппаратных возможностей сетевой карты для шейпинга.
    • В сетевом стеке проведена работа по избавлению от конкурирующих блокировок – глобальная блокировка RTNL (rtnl_lock) преобразована в блокировку, привязываемую к отдельным пространствам сетевых имён, что позволило сократить конкуренцию между блокировками в системах, активно использующих пространства имён, например, в конфигурациях с изолированными контейнерами. Оптимизация пока объявлена экспериментальной и отключена по умолчанию. Для включения следует использовать при сборке параметр DEBUG_NET_SMALL_RTNL.
  • Оборудование
    • Продолжена работа над drm-драйвером (Direct Rendering Manager) Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake.
    • В драйвер i915 добавлены идентификаторы новых GPU на базе микроархитектуры Arrow Lake. Добавлена поддержка GPU на базе микроархитектуры Panther Lake.
    • В драйвере Nouveau реализована поддержка механизма drm_panic (отображает при сбоях подобие “синего экрана смерти”) для GPU начиная с nv50.
    • В драйвере AMDGPU реализована возможность сброса очередей SDMA
      Добавлена поддержка SMU 13.0.6 и JPEG 4.0.3.
    • В DRM-драйвер msm (GPU Qualcomm Adreno) добавлена поддержка GPU
      Adreno A663, чипсетов MSM8917, MSM8937, MSM8953 и MSM8996, а также платформы Qualcomm SA8775P.
    • В звуковой подсистеме ALSA предложен новый режим обращения к аппаратным устройствам, предоставляющим функции для ускорения вычислений, связанных с обработкой звука (например, преобразование частоты дискретизации, распаковка и декодирование потоков).
    • Добавлена поддержка звуковых кодеков Realtek RT721 SDCA, Everest Semi ES8323, NXP UDA1342, Cirrus Logic CS42L84. Добавлена поддержка усилителей NeoFidelity NTP8918/NTP8835/NTP8835C, Awinic aw88081 и Iron Device SMA1307. Добавлена поддержка звуковых систем устройств Samsung Galaxy Book3 360, ASUS Zenbook UM5606WA, ASUS Zen AIO 27 и Ayaneo System CS35L41.
    • Прекращена поддержка платформы PowerPC Maple, которая давно не используется на практике.
    • Добавлена поддержка ARM-плат, SoC и устройств: Nothing Phone 1, Microsoft Surface Pro 9 5G, Redmi 5A (MSM8917/PM8937), Samsung Galaxy S9, Samsung Exynos 8895, 9810 и 990 (применялись в смартфонах Samsung Galaxy), Apple A7*/A8*/A9*/A10*/A11*, FriendlyARM NanoPi R3S, Orange Pi 5b, Radxa ROCK 5C, Rockchip RK3528, Microchip sam9x7, TI J742S2, Renesas R-Car Gen4 E-FUSE, Marvell PXA1908, Nuvoton Arbel NPCM8XX, Kobo Clara 2E,
      Kontron OSM-S i.MX8MP, Freescale Ivy, Boundary Device Nitrogen8MP, i.MX8M Plus Gateworks GW82XX-2X, iMX8MP, X1E Dell XPS 9345, CS9100, Powkiddy RGB20SX, Rockchip RK3528, IPQ5424, IPQ5404.
    • Добавлена поддержка экранных панелей Samsung AMS581VF01, Samsung AMS639RQ08, Samsung S6E3HA8 и Microchip AC69T88A LVDS.
Release. Ссылка here.