Релиз ядра Linux 5.7

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.7. Среди наиболее заметных изменений: новая реализация ФС exFAT, модуль bareudp для создания UDP-туннелей, защита на основе аутентификации указателей для ARM64, возможность прикрепления BPF-программ к LSM-обработчикам, новая реализация Curve25519, детектор «split-lock», совместимость BPF с PREEMPT_RT, снятие ограничения на 80-символьный размер строки в коде, учёт показателей температуры CPU в планировщике задач, возможность использования clone() для порождения процессов в другом cgroup, защита от записи в память при помощи userfaultfd.

В новую версию принято 15033 исправлений от 1961 разработчиков, размер патча — 39 МБ (изменения затронули 11590 файлов, добавлено 570560 строк кода, удалено 297401 строк). Около 41% всех представленных в 5.7 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 13% связано с сетевым стеком, 4% — с файловыми системами и 4% c внутренними подсистемами ядра.

Основные новшества:

  • Дисковая подсистема, ввод/вывод и файловые системы
    • Добавлена новая реализация драйвера exFAT, основанная на актуальной кодовой базе «sdfat» (2.x), развиваемой компанией Samsung для своих Android-смартфонов. Ранее добавленный в ядро драйвер был основан на устаревшем коде Samsung (версия 1.2.9) и отставал по производительности он нового драйвера примерно на 10%. Напомним, что добавление поддержки exFAT в ядро стало возможным после того, как компания Microsoft опубликовала общедоступные спецификации и предоставила возможность безвозмездного использования патентов на exFAT в Linux.
    • В Btrfs реализована новая команда ioctl() — BTRFS_IOC_SNAP_DESTROY_V2, позволяющая удалять подраздел по его идентификатору. Обеспечена полная поддержка клонирования inline-экстентов. Расширено число точек отмены операций перераспределения, что позволило сократить длительные ожидания при выполнении команды ‘balance cancel’. Ускорено определение обратных ссылок на экстенты (например, время выполнения тестового сценария уменьшилось с часа до нескольких минут). Добавлена возможность прикрепления к каждому inode дерева экстентов файла. Переработана схема блокировки, используемая при записи в подразделы и при исключении NOCOW. Повышена эффективность выполнения fsync для диапазонов.
    • В XFS улучшена проверка метаданных и выполнение fsck для активных разделов. Предложена библиотека для перестроения структур btree, которая в будущем будет использована для переработки xfs_repair и реализации возможности восстановления без отмонтирования раздела.
    • В CIFS добавлена эксперимантальная поддержка размещения раздела подкачки в SMB3-хранилищах. Реализованы POSIX-расширения в readdir, определённые в спецификации SMB3.1.1. Повышена производительность записи для страниц размером 64KB при включении режима cache=strict и использовании версий протокола 2.1+.
    • ФС EXT4 переведена с bmap и iopoll на использование iomap.
    • В F2FS реализована опциональная поддержка сжатия данных с использованием алгоритма zstd. По умолчанию для сжатия задействован алгоритм LZ4. Добавлена поддержка команды «chattr -c commit». Обеспечено отображение времени монтирования. Добавлен ioctl F2FS_IOC_GET_COMPRESS_BLOCKS для получения сведений о числе сжатых блоков. Добавлены данные о сжатии, выводимые через statx.
    • В файловой системе Ceph добавлена возможность локального выполнения операций создания и удаления (unlink) файла без ожидания ответа от сервера (работа в асинхронном режиме). Изменение, например, позволяет заметно поднять производительность при работе утилиты rsync.
    • В OVERLAYFS добавлена возможность использования virtiofs в качестве ФС верхнего уровня.
    • Переписан код обхода путей в VFS, переделан код разбора символических ссылок и унифицирован обход точек монтирования.
    • В подсистеме scsi непривилегированным пользователям разрешено выполнение команд ZBC.
    • В dm_writecache реализована возможность постепенной очистки кэша на основании параметра max_age, задающего максимальное время жизни блока.
    • В dm_integrity добавлена поддержка операции «discard».
    • В null_blk добавлена поддержка подстановки ошибок для симуляции сбоев при проведении тестирования.
    • Добавдлена возможность отправки udev-уведомлений об изменении размера блочного устройства.
  • Сетевая подсистема
    • В Netfilter включены изменения, значительно ускоряющие обработку больших списков сопоставления (nftables set), в которых требуется проверка сочетания подсетей, сетевых портов, протокола и MAC-адресов. Оптимизации внесены в модуль nft_set_pipapo (PIle PAcket POlicies), решающий задачу сопоставления содержимого пакета с применяемыми в правилах фильтрации произвольными диапазонами состояния полей, такими как диапазоны IP и сетевых портов (nft_set_rbtree и nft_set_hash манипулируют сопоставлением интервалов и прямым отражением значений). Векторизированная при помощи 256-разрядных инструкций AVX2 верcия pipapo на системе с процессором AMD Epyc 7402 показала прирост производительности на 420% при разборе 30 тысяч записей, включающих связки порт-протокол. Прирост при сопоставлении связки из подсети и номера порта при разборе 1000 записей составил 87% для IPv4 и 128% для IPv6.
    • Добавлен модуль bareudp, позволяющий инкапсулировать в UDP-туннель различные L3-протоколы, такие как MPLS, IP и NSH.
    • Продолжена интеграция компонентов MPTCP (MultiPath TCP), расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам.
    • Добавлена поддержка механизмов аппаратного ускорения инкапсуляции Ethernet-кадров в 802.11 (Wi-Fi).
    • При перемещении устройства из одного пространства имён сетевой подсистемы (network namespace) в другое обеспечена корректировка прав доступа и владельца соответствующих файлов в sysfs.
  • Виртуализация и безопасность
    • Добавлена аппаратная реализация аутентификации указателей (Pointer Authentication), использующая специализированные инструкции CPU ARM64 для защиты от атак, использующих приёмы возвратно-ориентированного программирования (ROP) при которых атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися в загруженных библиотеках кусками машинных инструкций, завершающихся инструкцией возврата управления. Защита сводится к использованию цифровых подписей для проверки адресов возврата на уровне ядра. Подпись хранится в неиспользуемых верхних битах самого указателя. В отличие от программных реализаций создание и проверка цифровых подписей производится при помощи специальных инструкций CPU.
    • Добавлена возможность защиты области памяти от записи при помощи системного вызова userfaultfd(), предназначенного для обработки page faults (обращение к невыделенным страницам памяти) в пространстве пользователя. Идея в том, чтобы использовать userfaultfd() и для отслеживания нарушения доступа к страницам, помеченным защищёнными от записи, и вызова обработчика, который может реагировать на подобные попытки записи (например, для обработки изменений в процессе создания live-снапшотов работающих процессов, фиксации состояния при сбросе дампов памяти на диск, реализации разделяемой памяти, отслеживания изменений в памяти). Функциональность эквивалентна применению mprotect() в связке с обработчиком сигнала SIGSEGV, но работает заметно быстрее.
    • В SELinux объявлен устаревшим параметр «checkreqprot», позволяющий отключить проверку защиты памяти при обработке правил (допускал использование исполняемых областей памяти, независимо от предписаний, заданных в правилах). Символическим ссылкам kernfs разрешено наследование контекста родительских каталогов.
    • В состав включён модуль KRSI, позволяющий прикреплять BPF-программы к любым LSM-хукам в ядре. Изменение позволяет создавать LSM-модули (Linux Security Module) в форме BPF-программ для решения задач аудита и мандатного контроля доступа.
    • Реализация эллиптической кривой Curve25519 заменена на вариант из библиотеки HACL, для которого приведено математическое доказательство формальной верификации надёжности.
    • Добавлен механизм информирования о свободных страницах памяти. При помощи данного механизма гостевые системы могут передавать хост-системе сведения о страницах, которые больше не используются, и данные страницы хост может забрать обратно.
    • В vfio/pci добавлена поддержка SR-IOV (Single-Root I/O Virtualization).
  • Память и системные сервисы
    • C 80 до 100 символов увеличено ограничение на максимальную длину строки в исходных текстах. При этом разработчикам по-прежнему рекомендуется держаться в границах 80 символов в строке, но это теперь не является жёстким лимитом. Кроме того, превышение лимита на размер строки теперь будет приводить к выводу предупреждения при сборке только если утилита checkpatch запущена с опцией «—strict’. Изменение даст возможность не отвлекать разработчиков на манипуляции с пробелами и более свободно чувствовать себя при выравнивании кода.
    • Добавлена поддержка смешанного режима загрузки EFI, позволяющего без применения специализированного загрузчика загрузить 64-разрядное ядро из 32-разрядной прошивки, выполняемой на 64-разрядном CPU.
    • Включена система выявления и отладки расщеплённых блокировок («split lock«), возникающих при доступе к невыровненным данным в памяти из-за того, что при выполнении атомарной инструкции данные пересекают две линии кэша CPU. Подобные блокировки приводят к значительному падению производительности (на 1000 циклов медленнее, чем атомарная операция с данными, попадающими в одну линию кэша). В зависимости от загрузочного параметра «split_lock_detect» ядро может на лету выявлять подобные блокировки и выводить предупреждения или отправлять сигнал SIGBUS приложению, вызвавшему блокировку.
    • В планировщике задач обеспечено отслеживание показателей датчиков температуры (Thermal Pressure) и реализован учёт перегрева при размещении задач. Пользуясь выдаваемой статистикой обработчик температуры (thermal governor) может корректировать максимальную частоту CPU при перегреве, а планировщик задач теперь учитывает снижение вычислительной мощности из-за подобного урезания частоты при планировании запуска задач (раньше планировщик реагировал на изменение частоты с определённой задержкой, какое-то время принимая решения на основе завышенных предположениях о доступных вычислительных ресурсах).
    • В планировщике задач задействованы инвариантные показатели отслеживания нагрузки, позволяющие корректно оценить нагрузку, независимо от текущей частоты работы CPU. Изменение позволяет более точно прогнозировать поведение задач в условиях динамического изменения вольтажа и частоты CPU. Например, задача, которая потребляла 1/3 ресурсов CPU при частоте 1000 MHz, станет потреблять 2/3 ресурсов при снижении частоты до 500 MHz, что раньше создавало ложное предположение о работе на полную мощность (т.е. задачи для планировщика казались более крупными только за счёт снижения частоты, что приводило к принятую неверных решений в schedutil cpufreq governor).
    • Реализована возможность использования подсистемы BPF при работе ядра в режиме реального времени (PREEMPT_RT). Ранее при включении PREEMPT_RT предписывалось отключение BPF.
    • Добавлен новый тип BPF-программ — BPF_MODIFY_RETURN, которые могут прикрепляться к функции в ядре и изменять возвращаемое данной функцией значение.
    • Добавлена возможность использования системного вызова clone3() для создания процесса в cgroup, отличающемся от родительского cgroup, что позволяет родительскому процессу применить ограничения и включить аккаунтинг сразу после порождения нового процесса или потока. Например, сервисный менеджер может напрямую выделять новые сервисы в отдельные cgroup, а новые процессы при помещении в «замороженные» cgroup и будут сразу остановлены.
    • в Kbuild добавлена поддержка переменной окружения «LLVM=1» для переключения на инструментарий Clang/LLVM при сборке ядра. Подняты требования к версии binutils (2.23).
    • В debugfs добавлена секция /sys/kernel/debug/kunit/ с результатами тестов kunit.
    • Добавлен параметр загрузки ядра pm_debug_messages (аналог/sys/power/pm_debug_messages), включающий вывод отладочной информации о работе системы управления питанием (полезно при отладке проблем со спящим и ждущим режимом).
    • В интерфейс асинхронного ввода/вывода io_uring добавлена поддержка splice() и атомарного выбора буферов.
    • Улучшено профилирование cgroup при помощи инструментария perf. Ранее perf мог профилировать задачи только в определённом cgroup и не мог узнать к какой cgroup принадлежит текущий образец. Теперь perf получает сведения о cgroup для каждой выборки, что позволяет профилировать более одного cgroup и применять сортировку по cgroup в отчётах.
    • В cgroupfs, псевдо-ФС для управления cgroups, добавлена поддержка расширенных атрибутов (xattrs) при помощи которых, например, можно оставлять дополнительную информацию для обработчиков в пространстве пользователя.
    • В cgroup memory controller добавлена поддержка рекурсивной защиты значения «memory.low», регулирующего минимальный объём оперативной памяти, предоставленной участникам группы. При монтировании иерархии cgroup с опцией «memory_recursiveprot» значение «memory.low», которое установлено для нижних узлов, автоматически будет распределяться для всех дочерних узлов.
    • Добавлен фреймворк Uacce (Unified/User-space-access-intended Accelerator Framework) для совместного использования виртуальных адресов (SVA, Shared Virtual Addressing) между CPU и периферийными устройствами, позволяющий аппаратным ускорителям получить доступ к структурам данных в основном CPU.
  • Аппаратные архитектуры
    • Для архитектуры ARM реализована возможность горячего извлечения памяти.
    • Для архитектуры RISC-V добавлена поддержка горячего подключения и извлечения CPU (CPU hotplug). Для 32-разрядных RISC-V реализован eBPF JIT.
    • Убрана возможность использования 32-разрядных ARM-систем для запуска гостевых окружений KVM.
    • Удалена «фиктивная» реализация NUMA для архитектуры s390, для которой так и не найдены сценарии использования, позволяющие добиться повышения производительности.
    • Для ARM64 добавлена поддержка расширения AMU (Activity Monitors Unit), определённого в ARMv8.4 и предоставляющего счётчики производительности, которые использованы для расчёта коэффициентов коррекции масштабирования частоты в планировщике задач.
  • Оборудование
    • Добавлена поддержка устройств vDPA, в которых используется канал обмена данных, соответствующий спецификациям virtio. vDPA-устройства могут быть как физически подключённым оборудованием, так и эмулируемыми программно виртуальными устройствами.
    • В подсистеме GPIO появилась новая команда ioctl() для мониторинга изменений, позволяющая наладить информирование процесса об изменении состояния любой линии GPIO. В качестве примера использования новой команды предложена утилита gpio-watch.
    • В DRM-драйвере i915 для видеокарт Intel включена по умолчанию поддержки чипов Tigerlake («Gen12») и добавлена начальная поддержка управления подсветкой OLED. Улучшена поддержка чипов Ice Lake, Elkhart Lake, Baytrail и Haswell.
    • В драйвере amdgpu добавлена возможность загрузки прошивок в чип USBC для ASIC. Улучшена поддержка чипов AMD Ryzen 4000 «Renoir». Появилась поддержка управления OLED-панелями. Обеспечено отображение состояния прошивки в debugfs.
    • В DRM-драйвер vmwgfx для систем виртуализации VMware добавлена возможность использования OpenGL 4 в гостевых системах (раннее поддерживался OpenGL 3.3).
    • Добавлен новый DRM-драйвер tidss для дисплейной системы платформы TI Keystone.
    • Добавлены драйверы для LCD-панелей: Feixin K101 IM2BA02, Samsung s6e88a0-ams452ef01, Novatek NT35510, Elida KD35T133, EDT, NewEast Optoelectronics WJFH116008A, Rocktech RK101II01D-CT, Frida FRD350H54004.
    • В систему управления питанием добавлена поддержка платформы Intel Jasper Lake (JSL) на базе Atom.
    • Добавлена поддержка ноутбука Pinebook Pro на базе Rockchip RK3399, планшета Pine64 PineTab и смартфона PinePhone на базе Allwinner A64.
    • Добавлены поддержка новых звуковых кодеков и чипов: Amlogic AIU, Amlogic T9015, Texas Instruments TLV320ADCX140, Realtek RT5682, ALC245, Broadcom BCM63XX I2S, Maxim MAX98360A, Presonus Studio 1810c, MOTU MicroBook IIc.
    • Добавлена поддержка ARM-плат и платформ Qualcomm Snapdragon 865 (SM8250), IPQ6018, NXP i.MX8M Plus, Kontron «sl28», 11 вариантов платы i.MX6 TechNexion Pico, три новых варианта Toradex Colibri, Samsung S7710 Galaxy Xcover 2 на базе ST-Ericsson u8500, DH Electronics DHCOM SoM и PDK2, Renesas M3ULCB, Hoperun HiHope, Linutronix Testbox v2, PocketBook Touch Lux 3.

Источник: http://www.opennet.ru/opennews/art.shtml?num=53062