После двух месяцев разработки Линус Торвальдс представил выпуск ядра Linux 5.14. Среди наиболее заметных изменений: новые системные вызовы quotactl_fd() и memfd_secret(), удаление драйверов ide и raw, новый контроллер приоритетов ввода/вывода для cgroup, режим планирования задач SCHED_CORE, инфраструктура для создания загрузчиков верифицированных BPF-программ.
В новую версию принято 15883 исправлений от 2002 разработчиков, размер патча - 69 МБ (изменения затронули 12580 файлов, добавлено 861501 строк кода, удалено 321654 строк). Около 47% всех представленных в 5.14 изменений связаны с драйверами устройств, примерно 14% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 13% связано с сетевым стеком, 3% - с файловыми системами и 3% c внутренними подсистемами ядра.
- дисковая подсистема, ввод/вывод и файловые системы:
- для cgroup реализован новый контроллер приоритезации ввода/вывода - rq-qos, который может управлять приоритетом обработки запросов к блочным устройствам, генерируемых участниками каждой cgroup. Поддержка нового контроллера приоритета добавлена в планировщик ввода/вывода mq-deadline;
- в файловой системе ext4 реализована новая ioctl-команда EXT4_IOC_CHECKPOINT, принудительно сбрасывающая на диск все ожидающие транзакции из журнала и связанные с ними буферы, а также перезаписывающая используемую журналом область в хранилище. Изменение подготовлено в рамках инициативы по предотвращению утечек информации из файловых систем;
- в Btrfs внесены оптимизации производительности: за счёт исключения лишнего журналирования расширенных атрибутов в процессе выполнения fsync производительность интенсивных операций с расширенными атрибутами увеличилась до 17%. Кроме того, при выполнении операций усечения, не затрагивающих экстенты, отключено выполнение полной синхронизации, что сократило время выполнения операции на 12%. В sysfs добавлена настройка для ограничения пропускной способности ввода/вывода при проверке ФС. Добавлены ioctl-вызовы для отмены операций изменения размера и удаления устройства;
- в XFS переработана реализация буферного кэша, который переведён на выделение страниц памяти в пакетном режиме. Повышена эффективность работы кэша;
- в F2FS добавлена опция для работы в режиме только для чтения и реализован режим кэширования сжатых блоков (compress_cache) для повышения производительности случайного чтения. Реализована поддержка сжатия файлов, отражённых в память при помощи операции mmap(). Для выборочного отключения сжатия файлов по маске предложена новая опция монтирования nocompress;
- в драйвере exFAT проведена работа по улучшению совместимости с хранилищами некоторых цифровых камер;
- добавлен системный вызов quotactl_fd(), который позволяет управлять квотами не через файл специального устройства, а через указание файлового дескриптора, связанного с файловой системой для которой применяется квота;
- из ядра удалены старые драйверы для блочных устройств с интерфейсом IDE, на смену которым уже давно пришла подсистема libata. Поддержка старых устройств сохранена в полном объёме, изменения касаются только возможности использования старых драйверов, при использовании которых накопители именовались /dev/hd*, а не /dev/sd*;
- из ядра удалён драйвер «raw», предоставляющий небуферизированный доступ к блочными устройствам через интерфейс /dev/raw. Указанная функциональность давно реализуется в приложениях при помощи флага O_DIRECT;
- память и системные службы:
- в планировщике задач реализован новый режим планирования SCHED_CORE, позволяющий управлять тем, какие процессы могут совместно выполнятся на одном ядре CPU. Каждому процессу может быть назначен cookie-индентификатор, определяющий область доверия между процессами (например, принадлежность одному пользователю или контейнеру). При организации выполнения кода планировщик может обеспечить совместное использование одного ядра CPU только для процессов, связанных с одним владельцем, что может использоваться для блокирования некоторых атак класса Spectre за счёт предотвращения выполнения в одном потоке SMT (Hyper Threading) заслуживающих и не заслуживающих доверия задач;
- для механизма cgroup реализована поддержка операции kill, позволяющей разом завершить все привязанные к группе процессы (отправить SIGKILL), через запись «1» в виртуальный файл cgroup.kill;
- расширены возможности, связанные с реагированием на выявление расщеплённых блокировок («split lock»), возникающих при доступе к невыровненным данным в памяти из-за того, что при выполнении атомарной инструкции данные пересекают две линии кеша CPU. Подобные блокировки приводят к значительному падению производительности, поэтому ранее яром предоставлялась возможность принудительного завершения приложения, вызвавшего блокировку. В новом выпуске добавлен параметр командной строки ядра «split_lock_detect=ratelimit:N», позволяющий определить общесистемный лимит интенсивности операций блокировки в секунду, после превышения которого любой процесс, ставший источником расщеплённой блокировки, вместо завершения будет принудительно остановлен на 20 мс;
- в cgroup-контроллере пропускной способности CFS (CFS bandwidth controller), определяющим как много процессорного времени можно выделить каждой cgroup, реализована возможность определения лимитов, ограниченных заданным временем действия, что позволяет лучше регулировать нагрузки, чувствительные к задержкам. Например, установка значения cpu.cfs_quota_us в 50000 и cpu.cfs_period_us в 100000 даст возможность группе процессов каждые 100ms тратить 50ms времени CPU;
- добавлена начальная инфраструктура для создания загрузчиков BPF-программ, которая в дальнейшем позволит разрешить загрузку только BPF-программ, подписанных заслуживающим доверия цифровым ключом;
- добавлена новая futex-операция FUTEX_LOCK_PI2, использующая монотонный таймер для расчёта таймаута, который учитывает время проведённое системой в спящем режиме;
- для архитектуры RISC-V реализована поддержка больших страниц памяти (Transparent Huge-Pages) и возможность применения механизма KFENCE для выявления ошибок при работе с памятью;
- в системный вызов madvise(), предоставляющий средства для оптимизации управления памятью процесса, добавлены флаги MADV_POPULATE_READ и MADV_POPULATE_WRITE для генерации «page fault» во всех страницах памяти, отражённых для операций чтения или записи, без выполнения фактического чтения или записи (prefault). Применение флагов может быть полезным для снижения задержек в процессе работы программы, благодаря упреждающему выполнению обработчика «page fault» разом для всех невыделенных страниц, не дожидаясь фактического обращения к ним;
- в системе unit-тестирования kunit добавлена поддержка запуска тестов в окружении QEMU;
- добавлены новые трассировщики: «osnoise» для отслеживания задержек в приложениях, вызванных обработкой прерываний, и «timerlat» для вывода детальной информации о задержках при пробуждениях по сигналу таймера;
- виртуализация и безопасность:
- добавлен системный вызов memfd_secret(), позволяющий создать приватную область памяти в изолированном пространстве адресов, видимую только процессу-владельцу, неотражаемую в другие процессы и напрямую недоступную ядру;
- в системе фильтрации системных вызовов seccomp при выносе обработчиков блокировки в пространство пользователя предоставлена возможность использования одной атомарной операции для создания файлового дескриптора для изолируемой задачи и его возвращения при обработке системного вызова. Предложенная операция решает проблему с прерыванием обработчика в пространстве пользователя при поступлении сигнала;
- добавлен новый механизм для управления ограничением ресурсов в пространстве имён идентификаторов пользователей, который привязывает отдельные счётчики rlimit к пользователю в «user namespace». Изменение решает проблему с применением общих счётчиков ресурсов при запуске одним пользователем процессов в разных контейнерах;
- в гипервизор KVM для систем ARM64 добавлена возможность использования в гостевых системах расширения MTE (MemTag, Memory Tagging Extension), позволяющего привязать теги к каждой операции выделения памяти и организовать проверку корректности использования указателей для блокирования эксплуатации уязвимостей, вызванных обращением к уже освобождённым блокам памяти, переполнениями буфера, обращениями до инициализации и использованием вне текущего контекста;
- предоставляемые платформой ARM64 средства для аутентификации указателей (Pointer Authentication) теперь могут быть отдельно настроены для ядра и пространства пользователя. Технология позволяет использовать специализированные инструкции ARM64 для проверки адресов возврата при помощи цифровых подписей, которые хранятся в неиспользуемых верхних битах самого указателя;
- в User-mode Linux добавлена поддержка использования драйверов к PCI-устройствам с виртуальной шиной PCI, реализуемой драйвером PCI-over-virtio;
- для систем x86 добавлена поддержка паравиртуализированного устройства virtio-iommu, позволяющего отправлять IOMMU-запросы, такие как ATTACH, DETACH, MAP и UNMAP, поверх транспорта virtio без эмуляции таблиц страниц памяти;
- для CPU Intel, начиная с семейства Skylake и заканчивая Coffee Lake, по умолчанию отключено использование расширений Intel TSX (Transactional Synchronization Extensions), предоставляющих средства для повышения производительности многопоточных приложений за счёт динамического исключения лишних операций синхронизации. Расширения отключены из-за возможности совершения атак Zombieload, манипулирующих утечкой сведений по сторонним каналам, возникающей при работе механизма асинхронного прерывания операций (TAA, TSX Asynchronous Abort);
- сетевая подсистема:
- продолжена интеграция в ядро MPTCP (MultiPath TCP), расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам. В новом выпуске добавлен механизм для задания собственных политик хэширования трафика для IPv4 и IPv6 (multipath hash policy), дающих возможность из пространства пользователя определять, какие из полей в пакетах, в том числе инкапсулированных, будут использованы при вычислении хэша, определяющего выбор пути для пакета;
- в виртуальный транспорт virtio добавлена поддержка сокетов SOCK_SEQPACKET (упорядоченная и надёжная передача датаграмм);
- расширены возможности механизма сокетов SO_REUSEPORT, который позволяет сразу нескольким слушающим сокетам подключиться к одному порту для приёма соединений с распределением поступающих запросов одновременно по всем подключенным через SO_REUSEPORT сокетам, что упрощает создание многопоточных серверных приложений. В новой версии добавлены средства для передачи управления другому сокету в случае сбоя при обработки запроса изначально выбранным сокетом (решает проблему с потерей отдельных соединений при перезапуске сервисов);
- оборудование:
- в драйвере amdgpu реализована поддержка новых серий GPU AMD Radeon RX 6000, развиваемых под кодовыми именами «Beige Goby» (Navi 24) и «Yellow Carp», а также улучшена поддержка GPU Aldebaran (gfx90a) и APU Van Gogh. Добавлена возможность одновременной работы с несколькими панелями eDP. Для APU Renoir реализована поддержка работы с шифрованными буферами в видеопамяти (TMZ, Trusted Memory Zone). Добавлена поддержка горячего извлечения графических карт (hot-unplug). Для GPU Radeon RX 6000 (Navi 2x) и старых GPU AMD включена по умолчанию поддержка механизма энергосбережения ASPM (Active State Power Management), который ранее был активирован только для GPU Navi 1x, Vega и Polaris;
- для чипов AMD добавлена поддержка разделяемой виртуальной памяти (SVM, shared virtual memory) на базе подсистемы HMM (Heterogeneous memory management), позволяющей использовать устройства с собственными блоками управления памятью (MMU, memory management unit), которые могут получать доступ к основной памяти. В том числе при помощи HMM можно организовать совместное адресное пространство между GPU и CPU, в котором GPU может получить доступ к основной памяти процесса;
- добавлена начальная поддержка технологии AMD Smart Shift, динамически меняющей параметры энергопотребления CPU и GPU на ноутбуках с чипсетом и видеокартой AMD для форсирования производительности при играх, редактировании видео и 3D-рендеринге;
- в драйвере i915 для видеокарт Intel включена поддержка чипов Intel Alderlake P;
- добавлен драйвер drm/hyperv для виртуального графического адаптера Hyper-V;
- добавлен графический драйвер simpledrm, использующий для вывода фреймбуфер EFI-GOP или VESA, предоставляемый UEFI-прошивкой или BIOS. Основным назначением драйвера является предоставление возможности графического вывода на начальных стадиях загрузки, до того как станет возможным использование полноценного DRM-драйвера. Драйвер также может использоваться как временное решение для оборудования, для которого пока отсутствуют родные DRM-драйверы;
- добавлена поддержка компьютера-моноблока Raspberry Pi 400;
- добавлен драйвер dell-wmi-privacy для поддержки поставляемых в ноутбуках Dell аппаратных выключателей камеры и микрофона;
- для ноутбуков Lenovo добавлен WMI-интерфейс для изменения параметров BIOS через sysfs /sys/class/firmware-attributes/;
- расширена поддержка устройств с интерфейсом USB4;
- добавлена поддержка звуковых карт и кодеков AmLogic SM1 TOACODEC, Intel AlderLake-M, NXP i.MX8, NXP TFA1, TDF9897, Rockchip RK817, Qualcomm Quinary MI2 и Texas Instruments TAS2505. Улучшена поддержка звука на ноутбуках HP и ASUS. Добавлены патчи для снижения задержек перед началом воспроизведения звука на устройствах с интерфейсом USB.
Источник – opennet.ru.
>>> Подробности