После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.11. Среди наиболее заметных изменений: поддержка операций атомарной записи на уровне блочных устройств, поддержка операций bind() и listen() в io_uring, новый механизм блокировок программных обработчиков прерываний, возможность записи в отзеркаленные в память исполняемые файлы, поддержка написания драйверов блочных устройств на языке Rust, оптимизация вызова getrandom(), новая реализация AES-GCM.
В новую версию принято 15130 исправлений от 2078 разработчиков,
размер патча – 85 МБ (изменения затронули 13282 файлов, добавлено 985857 строк кода, удалено 268915 строк). В прошлом выпуске было 14564 исправлений от 1989 разработчиков, размер патча – 41 МБ (в два раза меньше, чем патч для ядра 6.11). Около 46% всех представленных в 6.11 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 10% связано с сетевым стеком, 5% – с файловыми системами и 3% c внутренними подсистемами ядра.
Основные новшества в ядре 6.11:
- Дисковая подсистема, ввод/вывод и файловые системы
- В подсистеме блочных устройств реализована поддержка атомарных операций записи, при которых на накопитель записывается либо весь указанный набор блоков, либо ни один из блоков, что позволяет защититься от ситуаций, когда после сбоя оборудования записывается лишь часть блоков, а в другой части остаётся старая информация. Для включения атомарного режима записи в системный вызов pwritev() добавлен флаг RWF_ATOMIC. Информацию о поддержке атомарной записи (atomic_write_unit_min, atomic_write_unit_max и atomic_write_segments_max) в привязке к отдельным файлам можно получить при помощи функции statx().
- Предоставлена поддержка записи в исполняемые файлы, связанные с работающими процессами. Ранее, как и в других Unix-подобных системах, ядро выводило ошибку при попытке записи в исполняемый файл запущенного процесса. Данное ограничение снято, так как оно лишено практического смысла.
- Реализована возможность разработки драйверов блочных устройств на языке Rust. В качестве примера в ядро добавлен драйвер rnull, представляющий собой аналог драйвера null_blk, написанный на языке Rust.
- В файловой системе Btrfs в опции монтирования “rescue=” реализована поддержка новых режимов “ignoremetacsums” и “ignoresuperflags”, которые можно использовать для выноса некоторых проверок в пространство пользователя при восстановлении ФС после сбоя.
Реализация операции динамического возвращения групп блоков переделана для исключения возникновения ситуации нехватки свободного пространства в условиях неполной заполненности ФС. - В файловой системе ntfs3 реализована поддержка атрибутов “compressed” и “immutable”, определяющих сжатые и неизменяемые файлы.
- В ФС F2FS и Ext4 обработка имён файлов без учёта регистра символов (casefold) упрощена через хранение имён в форме qstr-строк без лишних преобразований регистра.
- В ФС Ext4 реализация функции jbd2_transaction_committed оптимизирована для повышения производительности на очень быстрых накопителях (в тестах отмечен прирост обрабатываемых операций в секунду, достигающий 20%).
- В системном вызове statx() разрешена передача указателя NULL вместо пустой строки с файловым путём, в случае если выставлен флаг AT_EMPTY_PATH.
- В системном вызове open_by_handle_at() смягчены проверки прав доступа к файлу, в случае отсутствия полномочий CAP_DAC_READ_SEARCH для поиска в начальном пространстве имён. Ранее необходимость наличия полномочий CAP_DAC_READ_SEARCH к начальному пространству имён не позволяла использовать системный вызов open_by_handle_at() в контейнерах.
- Расширены возможности системных вызовов listmount() и statmount(). В listmount() добавлен флаг LISTMOUNT_REVERSE для вывода содержимого таблицы точек монтирования в обратном порядке (самые новые записи в верху). В statmount() реализован вывод опций, выставленных при монтировании ФС. В обоих системных вызовах разрешена работа при отсутствии доступа к начальному пространству имён (когда имеется только доступ к локальному или внешнему пространству имён).
- В ФС Bcachefs реализована поддержка автоматического прозрачного восстановления проблемных данных, используя коды восстановления ошибок – если при чтении возникает ошибка ввода/вывода или вычислено несоответствие контрольной суммы, проблемный блок данных автоматически перезаписывается при наличии избыточности для его восстановления.
- Память и системные сервисы
- В состав приняты патчи с реализацией нового механизма блокировок программных обработчиков прерываний (BH, bottom-half), который обеспечивает блокировку используемых структур данных, но при этом не вызывает блокирования параллельного выполнения не связанного с ними кода. Отмечается, что изменение позволило не только снизить задержки для ядер, работающих в режиме realtime, но и повысить производительность обычных ядер (например, для некоторых видов нагрузки наблюдается повышение производительности сетевой подсистемы на 14.5%).
- В подсистему асинхронного ввода/вывода io_uring добавлена поддержка операций для реализации функций bind() и listen(), используемых для создания принимающих соединения сетевых сокетов.
- Добавлен набор ioctl-операций для псевдо-ФС NSFS (NameSpace FS), используемой для работы с пространствами имён. Новые ioctl позволяют преобразовывать идентификаторы процессов и групп потоков между разными пространствами имён идентификаторов процессов (PID namespace). Похожие ioctl, позволяющие на основе pidfd-идентификаторов определять файловые дескрипторы процессов в отдельных пространствах имён, также добавлены в псевдо-ФС pidfd.
- Для BPF-программ добавлена поддержка нового итератора для работы с битовыми масками, который можно использовать, например, для перебора отдельных битов в областях памяти, таких как cpumask. Добавлен механизм для отправки процессам в пространстве пользователя уведомлений об отсоединении (detach/unregister) объекта struct_ops. Расширен спектр типов, которые можно использовать в массивах (например, можно объявлять массивы, имеющие элементы с типами kptr, bpf_rb_root и bpf_list_head). Предложен более надёжный механизм Split BTF (BPF Type Format), используемый для проверки типов в псевдокоде BPF.
- Добавлена подсистема, позволяющая организовать подачу питания на устройства в заданном порядке, на случай, когда одно устройство должно быть активировано раньше другого (например, при активации беспроводных чипов на платформах Qualcomm).
- Добавлен модуль “Sloppy logic analyzer“, позволяющий создавать простые логические анализаторы сигнала, использующие GPIO и работающие на отдельном ядре CPU.
- Добавлена поддержка runtime-констант, которые могут использоваться вместо переменных, инициализируемых один раз. Например, runtime-константы могут применяться вместо переменных, хранящих указатель и размер для кэша dentry. Данные переменные выставляются во время загрузки и затем никогда не меняются. Идея в том, чтобы подставить значения подобных переменных напрямую в инструкции в коде, исключив накладные расходы, связанные с манипуляциями с указателями.
- Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Добавлена поддержка выпуска Rust 1.80 (в качестве минимальной версии по-прежнему поддерживается Rust 1.78). Помимо ранее отмеченных средств для разработки драйверов блочных устройств, в новой версии добавлены абстракции для загрузки прошивок, доступа к пространству пользователя (uaccess) и работы структурой “page”.
- Для систем x86-64 реализован новый системный вызов uretprobe(), оптимизирующий работу механизма трассировки uretprobe, позволяющего отслеживать значения, возвращаемые функциями в приложениях пространства пользователя.
- Добавлены параметры командной строки ядра: “reserve_mem” для резервирования именованной области памяти во время загрузки и “ramoops.mem_name” для использования в pstore области памяти, созданной через reserve_mem.
- В контроллер памяти на базе cgroup в файл memory.reclaim, через который определяются настройки вытеснения памяти, добавлен параметр “swappiness”, позволяющий изменить баланс между вытеснением анонимных страниц памяти в раздел подкачки и освобождением страниц памяти, занятых под файловый кэш.
- Добавлен ioctl-интерфейс PROCMAP_QUERY для более эффективного поиска виртуальных областей памяти (Virtual Memory Area) в /proc/PID/maps.
- В системный вызов mmap() добавлен флаг MAP_DROPPABLE для запроса памяти, которая никогда не будет сброшена в раздел подкачки, а в случае нехватки памяти может быть удалена.
- Для архитектуры ARM64 реализована поддержка горячего подключения (перевода в режимы online/offline) физических и виртуальных CPU на системах с ACPI.
- Для архитектуры RISC-V обеспечена поддержка горячего подключения памяти и добавлена поддержка поддержка GCC-плагина STACKLEAK (выполняет инициализацию всех хранимых в стеке переменных для предотвращения утечки информации из ядра через неинициализированные переменные, которые могут содержать остатки ранее сохранённых в стеке данных).
- Удалён механизм фиктивного маппинга памяти EFI (fake EFI memory map) на этапе загрузки. Данный механизм не использовался на практике и мешал разработкам в области конфиденциального выполнения виртуальных машин.
- Прекращена поддержка платформы PowerPC 40x.
- Повышены требования к версии GNU Make – для сборки ядра требуется как минимум выпуск GNU Make, опубликованный в 2013 году.
- Виртуализация и безопасность
- Интегрированы патчи, значительно (до 15 раз) ускоряющие получение случайных чисел через системный вызов getrandom(). Оптимизация основана на использовании механизма vDSO (virtual dynamic shared object), дающего возможность перенести обработчик системного вызова из ядра в пространство пользователя и избежать переключений контекста. Загрузка реализации системного вызова в адресное пространство процесса непосредственно ядром.
- Для систем x86-64 включена новая реализация алгоритма шифрования AES-GCM, поддерживающая использование векторных инструкций VAES, VPCLMULQDQ и AVX512/AVX10 для ускорения вычислений. В проведённых тестах прирост производительности после перехода на новую реализацию достигает 156%. Ассемблерная реализация AES-GCM полностью переписана с учётом корректности, производительности, размера и исчерпывающего документирования кода.
- Реализована возможность запуска ядра в качестве гостевой системы в виртуализированных окружениях, использующих процессорное расширение AMD SEV-SNP (Secure Nested Paging), предназначенное для обеспечения безопасной работы с вложенными таблицами страниц памяти. Для дополнительной изоляции доступа к ресурсам из виртуальных машин может применяться модуль SVSM (Linux Secure VM Service Module). В гипервизор KVM добавлена начальная поддержка запуска гостевых систем, защищённых при помощи AMD SEV-SNP.
- Добавлен отдельный bucket slab allocator, включаемый через параметр CONFIG_SLAB_BUCKETS и обеспечивающий защиту от атак с использованием техники “heap spraying“.
- В гипервизор KVM добавлен ioctl-вызов для упреждающего выделения памяти гостевой системе до её фактического запуска.
- Сетевая подсистема
- Добавлен sysctl-параметр net.tcp_rto_min_us, через который можно настроить минимальный таймаут повторной передачи (retransmission timeout) для TCP-сокетов.
- В утилиту ethtool добавлена возможность тонкой настройки конфигурации обработчиков прерываний для сетевых интерфейсов, использующих интерфейс Net DIM.
- Оборудование
- В драйвер AMDGPU добавлена поддержка DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 и MMHUB 4.1.
- Продолжена работа над drm-драйвером (Direct Rendering Manager) Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake. Улучшена поддержка CPU Arrow Lake и Lunar Lake.
- В подсистеме DRM (Direct Rendering Manager) переписан обработчик выставляемых монитором параметров EDID (Extended Display Identification Data).
- В драйвере i915 добавлена поддержка GPU Battlemage Xe2 и включён по умолчанию режим CMRR (Content Match Refresh Rate).
- В DRM-драйвер msm (GPU Qualcomm Adreno) добавлена поддержка платформы SM7150 и GPU X185 и a505.
- Добавлена поддержка экранных панелей Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01, K&d kd101ne3-40ti.
- Добавлена поддержка звуковых чипов Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 и Texas Instruments PCM5242.
- Внесена финальная порция изменений, обеспечивающих поддержку ARM SoC Snapdragon X Elite, в котором используется собственный 12-ядерный CPU Qualcomm Oryon и GPU Qualcomm Adreno. Чип нацелен на использование в ноутбуках и ПК, и опережает во многих тестах производительности чипы Apple M3 и Intel Core Ultra 155H. Добавленные в ядро 6.11 изменения связаны с поддержкой GPU Adreno X1-85 и управлением энергопотреблением. Из устройств на базе SoC Snapdragon X Elite заявлена поддержка ноутбуков ASUS Vivobook S15 и Lenovo Yoga Slim7x.
Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 6.11 – Linux-libre 6.10-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.11 обновлён код чистки блобов в драйверах mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth и tas2781. Проведена чистка новых драйверов amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 и pcie-rcar-gen4. Выполнена чистка имён блобов в dts-файлах (devicetree) для архитектуры Aarch64. Добавлена не выдающая предупреждения и запросов (nowait-nowarn) версия примитивов для загрузки прошивок. Добавлен код для определения примитивов загрузки прошивок в коде на языке Rust.