Suicide
01.06.2020, 19:02
После двух месяцев разработки Линус Торвальдс представил (https://lkml.org/lkml/2020/5/31/326) релиз ядра Linux 5.7 (https://www.kernel.org/). Среди наиболее заметных изменений: новая реализация ФС 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 внутренними подсистемами ядра.
Основные (https://kernelnewbies.org/Linux_5.6) новшества (https://lwn.net/Articles/816934/):
Дисковая подсистема, ввод/вывод и файловые системы
Добавлена новая реализация драйвера exFAT, основанная (https://www.opennet.ru/opennews/art.shtml?num=52222) на актуальной кодовой базе "sdfat" (2.x), развиваемой компанией Samsung для своих Android-смартфонов. Ранее добавленный в ядро драйвер был основан на устаревшем коде Samsung (версия 1.2.9) и отставал по производительности от нового драйвера примерно на 10%. Напомним, что добавление поддержки exFAT в ядро стало возможным после того, как компания Microsoft опубликовала (https://www.opennet.ru/opennews/art.shtml?num=51374) общедоступные спецификации и предоставила возможность безвозмездного использования патентов на 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 в качестве ФС верхнего уровня.
Переписан (https://lkml.org/lkml/2020/2/22/317) код обхода путей в VFS, переделан код разбора символических ссылок и унифицирован обход точек монтирования.
В подсистеме scsi непривилегированным пользователям разрешено (https://git.kernel.org/linus/6fdb79ff27ee0d385ec8481458d2fd1d69fec50b) выполнение команд ZBC.
В dm_writecache реализована (https://git.kernel.org/linus/3923d4854e189d84c6ec22e66d536d3498f2747c) возможность постепенной очистки кеша на основании параметра max_age, задающего максимальное время жизни блока.
В dm_integrity добавлена (https://git.kernel.org/linus/84597a44a9d86ac949900441cea7da0af0f2f473) поддержка операции "discard".
В null_blk добавлена (https://git.kernel.org/linus/596444e7570587867924c3ab025183b1a8726897) поддержка подстановки ошибок для симуляции сбоев при проведении тестирования.
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e598a72faeb543599bdf0d930df3a71906404e6f) возможность отправки udev-уведомлений об изменении размера блочного устройства.
Сетевая подсистема
В Netfilter включены изменения (https://www.opennet.ru/opennews/art.shtml?num=52548), значительно ускоряющие обработку больших списков сопоставления (nftables set), в которых требуется проверка сочетания подсетей, сетевых портов, протокола и MAC-адресов. Оптимизации внесены (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7400b063969bdca4a06cd97f1294d765c8eecbe1) в модуль 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.
Добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=571912c69f0ed731bd1e071ade9dc7ca4aa52065) модуль bareudp, позволяющий инкапсулировать в UDP-туннель различные L3-протоколы, такие как MPLS, IP и NSH.
Продолжена интеграция компонентов MPTCP (MultiPath TCP), расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам.
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=50ff477a8639fa1fbbeecb5a6f2f8b6c5557ecec) поддержка механизмов аппаратного ускорения инкапсуляции Ethernet-кадров в 802.11 (Wi-Fi).
При перемещении устройства из одного пространства имён сетевой подсистемы (network namespace) в другое обеспечена корректировка прав доступа и владельца соответствующих файлов в sysfs.
Предоставлена возможность использования флага SO_BINDTODEVICE пользователями, не имеющими прав root.
Принята третья часть патчей, переводящих инструментарий ethtool с ioctl() на использование интерфейса netlink. Новый интерфейс упрощает добавление расширений, улучшает обработку ошибок, позволяет отправлять уведомления при изменении состояния, упрощает взаимодействие между ядром и пространством пользователя и сокращает число синхронизируемых именованных списков.
Добавлена возможность использования специальных аппаратных ускорителей для выполнения операций отслеживания соединений.
В netfilter добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8537f78647c072bdb1a5dbe32e1c7e5b13ff1258) хук для подключения классификаторов исходящих пакетов (egress), дополнивший собой ранее присутствовавший хук для входящих пакетов (ingress).
Виртуализация и безопасность
Добавлена аппаратная реализация аутентификации указателей (Pointer Authentication (https://lwn.net/Articles/718888/)), использующая специализированные инструкции CPU ARM64 для защиты от атак, использующих приёмы возвратно-ориентированного программирования (ROP) при которых атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися в загруженных библиотеках кусками машинных инструкций, завершающихся инструкцией возврата управления. Защита сводится к использованию цифровых подписей для проверки адресов возврата на уровне ядра. Подпись хранится в неиспользуемых верхних битах самого указателя. В отличие от программных реализаций создание и проверка цифровых подписей производится при помощи специальных инструкций CPU.
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=57e5d4f278b9522646b49a3a97ebf5f2b8f9d4cf) возможность защиты области памяти от записи при помощи системного вызова userfaultfd(), предназначенного для обработки page faults (обращение к невыделенным страницам памяти) в пространстве пользователя. Идея в том, чтобы использовать userfaultfd() и для отслеживания нарушения доступа к страницам, помеченным защищёнными от записи, и вызова обработчика, который может реагировать на подобные попытки записи (например, для обработки изменений в процессе создания live-снапшотов работающих процессов, фиксации состояния при сбросе дампов памяти на диск, реализации разделяемой памяти, отслеживания изменений в памяти). Функциональность эквивалентна (https://lwn.net/Articles/787308/) применению mprotect() в связке с обработчиком сигнала SIGSEGV, но работает заметно быстрее.
В SELinux объявлен устаревшим параметр "checkreqprot", позволяющий отключить проверку защиты памяти при обработке правил (допускал использование исполняемых областей памяти, независимо от предписаний, заданных в правилах). Символическим ссылкам kernfs разрешено наследование контекста родительских каталогов.
В состав включён (https://git.kernel.org/linus/4dece7f3b925) модуль KRSI (https://lwn.net/Articles/808048/), позволяющий прикреплять BPF-программы к любым LSM-хукам в ядре. Изменение позволяет создавать LSM-модули (Linux Security Module) в форме BPF-программ для решения задач аудита и мандатного контроля доступа.
Проведена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=31c0aa87ec8a30b1e9e4cf862905a369560f7705) оптимизация производительности /dev/random за счёт пакетной передачи значений CRNG вместо отдельного вызова инструкций RNG. Улучшена работа getrandom и /dev/random на системах ARM64, предоставляющих инструкции RNG.
Реализация эллиптической кривой Curve25519 заменена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=07b586fe06625b0b610dc3d3a969c51913d143d4) на вариант из библиотеки HACL (https://hacl-star.github.io/), для которого приведено (https://www.opennet.ru/opennews/art.shtml?num=50470) математическое доказательство формальной верификации надёжности.
Добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1edca85e768a) механизм информирования о свободных страницах памяти. При помощи данного механизма гостевые системы могут передавать хост-системе сведения о страницах, которые больше не используются, и данные страницы хост может забрать обратно.
В vfio/pci добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=137e5531351db258eff58ea28f4dc8fdf7ca2990) поддержка SR-IOV (Single-Root I/O Virtualization).
Память и системные сервисы
C 80 до 100 символов увеличено (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bdc48fa11e46) ограничение на максимальную длину строки в исходных текстах. При этом разработчикам по-прежнему рекомендуется держаться в границах 80 символов в строке, но это теперь не является жёстким лимитом. Кроме того, превышение лимита на размер строки теперь будет приводить к выводу предупреждения при сборке только если утилита checkpatch запущена с опцией "--strict'. Изменение даст возможность не отвлекать разработчиков на манипуляции (https://lkml.org/lkml/2020/5/28/1245) с пробелами и более свободно чувствовать себя при выравнивании кода, а также предотвратит (https://lkml.org/lkml/2020/5/28/1237) излишнее разбиение строк, мешающее (https://lkml.org/lkml/2020/5/29/1038) восприятию кода и поиску.
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=17054f492dfd4d91e093ebb87013807812ec42a4) поддержка смешанного режима загрузки EFI, позволяющего без применения специализированного загрузчика загрузить 64-разрядное ядро из 32-разрядной прошивки, выполняемой на 64-разрядном CPU.
Включена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6650cdd9a8ccf00555dbbe743d58541ad8feb6a7) система выявления и отладки расщеплённых блокировок ("split lock (https://lwn.net/Articles/806466/)"), возникающих при доступе к невыровненным данным в памяти из-за того, что при выполнении атомарной инструкции данные пересекают две линии кеша CPU. Подобные блокировки приводят к значительному падению производительности (на 1000 циклов медленнее, чем атомарная операция с данными, попадающими в одну линию кеша). В зависимости от загрузочного параметра "split_lock_detect" ядро может на лету выявлять подобные блокировки и выводить предупреждения или отправлять сигнал SIGBUS приложению, вызвавшему блокировку.
В планировщике задач обеспечено отслеживание показателей датчиков температуры (Thermal Pressure (https://lwn.net/Articles/788380/)) и реализован учёт перегрева при размещении задач. Пользуясь выдаваемой статистикой обработчик температуры (thermal governor) может корректировать максимальную частоту CPU при перегреве, а планировщик задач теперь учитывает снижение вычислительной мощности из-за подобного урезания частоты при планировании запуска задач (раньше планировщик реагировал на изменение частоты с определённой задержкой, какое-то время принимая решения на основе завышенных предположениях о доступных вычислительных ресурсах).
В планировщике задач задействованы инвариантные показатели (https://lwn.net/Articles/816388/) отслеживания нагрузки, позволяющие корректно оценить нагрузку, независимо от текущей частоты работы CPU. Изменение позволяет более точно прогнозировать поведение задач в условиях динамического изменения вольтажа и частоты CPU. Например, задача, которая потребляла 1/3 ресурсов CPU при частоте 1000 MHz, станет потреблять 2/3 ресурсов при снижении частоты до 500 MHz, что раньше создавало ложное предположение о работе на полную мощность (т.е. задачи для планировщика казались более крупными только за счёт снижения частоты, что приводило к принятию неверных решений в schedutil cpufreq governor).
Драйвер Intel P-state, отвечающий за выбор режимов производительности, переведён на использование schedutil (https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt).
Реализована возможность использования подсистемы BPF при работе ядра в режиме реального времени (PREEMPT_RT). Ранее при включении PREEMPT_RT предписывалось отключение BPF.
Добавлен новый тип BPF-программ - BPF_MODIFY_RETURN, которые могут прикрепляться к функции в ядре и изменять возвращаемое данной функцией значение.
Добавлена возможность (https://lwn.net/Articles/807882/) использования системного вызова clone3() для создания процесса в cgroup, отличающемся от родительского cgroup, что позволяет родительскому процессу применить ограничения и включить аккаунтинг сразу после порождения нового процесса или потока. Например, сервисный менеджер может напрямую выделять новые сервисы в отдельные cgroup, а новые процессы при помещении в "замороженные" cgroup и будут сразу остановлены.
в Kbuild добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a0d1c951ef08ed24f35129267e3595d86f57f5d3) поддержка переменной окружения "LLVM=1" для переключения на инструментарий Clang/LLVM при сборке ядра. Подняты требования к версии binutils (2.23).
В debugfs добавлена секция /sys/kernel/debug/kunit/ с результатами тестов kunit.
Добавлен параметр загрузки ядра pm_debug_messages (аналог/sys/power/pm_debug_messages), включающий вывод отладочной информации о работе системы управления питанием (полезно при отладке проблем со спящим и ждущим режимом).
В интерфейс асинхронного ввода/вывода io_uring (https://www.opennet.ru/opennews/art.shtml?num=50631#io_uring) добавлена поддержка splice() (https://www.man7.org/linux/man-pages/man2/splice.2.html) и атомарного выбора буферов (https://lwn.net/Articles/815491/).
Улучшено профилирование cgroup при помощи инструментария perf. Ранее perf мог профилировать задачи только в определённом cgroup и не мог узнать к какой cgroup принадлежит текущий образец. Теперь perf получает сведения о cgroup для каждой выборки, что позволяет профилировать более одного cgroup и применять сортировку по cgroup в отчётах.
В cgroupfs, псевдо-ФС для управления cgroups, добавлена поддержка расширенных атрибутов (xattrs) при помощи которых, например, можно оставлять дополнительную информацию для обработчиков в пространстве пользователя.
В cgroup memory controller добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a931f801340)а поддержка рекурсивной защиты значения "memory.low", регулирующего минимальный объём оперативной памяти, предоставленной участникам группы. При монтировании иерархии cgroup с опцией "memory_recursiveprot" значение "memory.low", которое установлено для нижних узлов, автоматически будет распределяться для всех дочерних узлов.
Добавлен (https://git.kernel.org/linus/aa017ab97a22) фреймворк 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 и предоставляющего счётчики производительности, которые использованы для расчёта коэффициентов коррекции масштабирования частоты в планировщике задач.
Оборудование
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=961e9c84077f) поддержка устройств vDPA, в которых используется канал обмена данных, соответствующий спецификациям virtio. vDPA-устройства могут быть как физически подключённым оборудованием, так и эмулируемыми программно виртуальными устройствами.
В подсистеме GPIO появилась (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=51c1064e82e7) новая команда ioctl() для мониторинга изменений, позволяющая наладить информирование процесса об изменении состояния любой линии GPIO. В качестве примера использования новой команды предложена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=33f0c47b8fb4) утилита gpio-watch.
В DRM-драйвере i915 для видеокарт Intel включена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f365ab31efacb70bed1e821f7435626e0b2528a6) по умолчанию поддержки чипов Tigerlake ("Gen12") и добавлена начальная поддержка управления подсветкой OLED. Улучшена поддержка чипов Ice Lake, Elkhart Lake, Baytrail и Haswell.
В драйвере amdgpu добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f365ab31efacb70bed1e821f7435626e0b2528a6) возможность загрузки прошивок в чип 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.
В систему управления питанием добавлена (https://git.kernel.org/linus/16292bed9c56a20715d942fd5d9e025f01fa65fe) поддержка платформы Intel Jasper Lake (JSL) на базе Atom.
Добавлена поддержка ноутбука Pinebook Pro на базе Rockchip RK3399, планшета Pine64 PineTab и смартфона PinePhone (https://www.opennet.ru/opennews/art.shtml?num=52662) на базе 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.
01.06.2020
https://www.opennet.ru/opennews/art.shtml?num=53062
В новую версию принято 15033 исправлений от 1961 разработчиков, размер патча - 39 МБ (изменения затронули 11590 файлов, добавлено 570560 строк кода, удалено 297401 строк). Около 41% всех представленных в 5.7 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 13% связано с сетевым стеком, 4% - с файловыми системами и 4% c внутренними подсистемами ядра.
Основные (https://kernelnewbies.org/Linux_5.6) новшества (https://lwn.net/Articles/816934/):
Дисковая подсистема, ввод/вывод и файловые системы
Добавлена новая реализация драйвера exFAT, основанная (https://www.opennet.ru/opennews/art.shtml?num=52222) на актуальной кодовой базе "sdfat" (2.x), развиваемой компанией Samsung для своих Android-смартфонов. Ранее добавленный в ядро драйвер был основан на устаревшем коде Samsung (версия 1.2.9) и отставал по производительности от нового драйвера примерно на 10%. Напомним, что добавление поддержки exFAT в ядро стало возможным после того, как компания Microsoft опубликовала (https://www.opennet.ru/opennews/art.shtml?num=51374) общедоступные спецификации и предоставила возможность безвозмездного использования патентов на 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 в качестве ФС верхнего уровня.
Переписан (https://lkml.org/lkml/2020/2/22/317) код обхода путей в VFS, переделан код разбора символических ссылок и унифицирован обход точек монтирования.
В подсистеме scsi непривилегированным пользователям разрешено (https://git.kernel.org/linus/6fdb79ff27ee0d385ec8481458d2fd1d69fec50b) выполнение команд ZBC.
В dm_writecache реализована (https://git.kernel.org/linus/3923d4854e189d84c6ec22e66d536d3498f2747c) возможность постепенной очистки кеша на основании параметра max_age, задающего максимальное время жизни блока.
В dm_integrity добавлена (https://git.kernel.org/linus/84597a44a9d86ac949900441cea7da0af0f2f473) поддержка операции "discard".
В null_blk добавлена (https://git.kernel.org/linus/596444e7570587867924c3ab025183b1a8726897) поддержка подстановки ошибок для симуляции сбоев при проведении тестирования.
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e598a72faeb543599bdf0d930df3a71906404e6f) возможность отправки udev-уведомлений об изменении размера блочного устройства.
Сетевая подсистема
В Netfilter включены изменения (https://www.opennet.ru/opennews/art.shtml?num=52548), значительно ускоряющие обработку больших списков сопоставления (nftables set), в которых требуется проверка сочетания подсетей, сетевых портов, протокола и MAC-адресов. Оптимизации внесены (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7400b063969bdca4a06cd97f1294d765c8eecbe1) в модуль 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.
Добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=571912c69f0ed731bd1e071ade9dc7ca4aa52065) модуль bareudp, позволяющий инкапсулировать в UDP-туннель различные L3-протоколы, такие как MPLS, IP и NSH.
Продолжена интеграция компонентов MPTCP (MultiPath TCP), расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам.
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=50ff477a8639fa1fbbeecb5a6f2f8b6c5557ecec) поддержка механизмов аппаратного ускорения инкапсуляции Ethernet-кадров в 802.11 (Wi-Fi).
При перемещении устройства из одного пространства имён сетевой подсистемы (network namespace) в другое обеспечена корректировка прав доступа и владельца соответствующих файлов в sysfs.
Предоставлена возможность использования флага SO_BINDTODEVICE пользователями, не имеющими прав root.
Принята третья часть патчей, переводящих инструментарий ethtool с ioctl() на использование интерфейса netlink. Новый интерфейс упрощает добавление расширений, улучшает обработку ошибок, позволяет отправлять уведомления при изменении состояния, упрощает взаимодействие между ядром и пространством пользователя и сокращает число синхронизируемых именованных списков.
Добавлена возможность использования специальных аппаратных ускорителей для выполнения операций отслеживания соединений.
В netfilter добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8537f78647c072bdb1a5dbe32e1c7e5b13ff1258) хук для подключения классификаторов исходящих пакетов (egress), дополнивший собой ранее присутствовавший хук для входящих пакетов (ingress).
Виртуализация и безопасность
Добавлена аппаратная реализация аутентификации указателей (Pointer Authentication (https://lwn.net/Articles/718888/)), использующая специализированные инструкции CPU ARM64 для защиты от атак, использующих приёмы возвратно-ориентированного программирования (ROP) при которых атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися в загруженных библиотеках кусками машинных инструкций, завершающихся инструкцией возврата управления. Защита сводится к использованию цифровых подписей для проверки адресов возврата на уровне ядра. Подпись хранится в неиспользуемых верхних битах самого указателя. В отличие от программных реализаций создание и проверка цифровых подписей производится при помощи специальных инструкций CPU.
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=57e5d4f278b9522646b49a3a97ebf5f2b8f9d4cf) возможность защиты области памяти от записи при помощи системного вызова userfaultfd(), предназначенного для обработки page faults (обращение к невыделенным страницам памяти) в пространстве пользователя. Идея в том, чтобы использовать userfaultfd() и для отслеживания нарушения доступа к страницам, помеченным защищёнными от записи, и вызова обработчика, который может реагировать на подобные попытки записи (например, для обработки изменений в процессе создания live-снапшотов работающих процессов, фиксации состояния при сбросе дампов памяти на диск, реализации разделяемой памяти, отслеживания изменений в памяти). Функциональность эквивалентна (https://lwn.net/Articles/787308/) применению mprotect() в связке с обработчиком сигнала SIGSEGV, но работает заметно быстрее.
В SELinux объявлен устаревшим параметр "checkreqprot", позволяющий отключить проверку защиты памяти при обработке правил (допускал использование исполняемых областей памяти, независимо от предписаний, заданных в правилах). Символическим ссылкам kernfs разрешено наследование контекста родительских каталогов.
В состав включён (https://git.kernel.org/linus/4dece7f3b925) модуль KRSI (https://lwn.net/Articles/808048/), позволяющий прикреплять BPF-программы к любым LSM-хукам в ядре. Изменение позволяет создавать LSM-модули (Linux Security Module) в форме BPF-программ для решения задач аудита и мандатного контроля доступа.
Проведена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=31c0aa87ec8a30b1e9e4cf862905a369560f7705) оптимизация производительности /dev/random за счёт пакетной передачи значений CRNG вместо отдельного вызова инструкций RNG. Улучшена работа getrandom и /dev/random на системах ARM64, предоставляющих инструкции RNG.
Реализация эллиптической кривой Curve25519 заменена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=07b586fe06625b0b610dc3d3a969c51913d143d4) на вариант из библиотеки HACL (https://hacl-star.github.io/), для которого приведено (https://www.opennet.ru/opennews/art.shtml?num=50470) математическое доказательство формальной верификации надёжности.
Добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1edca85e768a) механизм информирования о свободных страницах памяти. При помощи данного механизма гостевые системы могут передавать хост-системе сведения о страницах, которые больше не используются, и данные страницы хост может забрать обратно.
В vfio/pci добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=137e5531351db258eff58ea28f4dc8fdf7ca2990) поддержка SR-IOV (Single-Root I/O Virtualization).
Память и системные сервисы
C 80 до 100 символов увеличено (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bdc48fa11e46) ограничение на максимальную длину строки в исходных текстах. При этом разработчикам по-прежнему рекомендуется держаться в границах 80 символов в строке, но это теперь не является жёстким лимитом. Кроме того, превышение лимита на размер строки теперь будет приводить к выводу предупреждения при сборке только если утилита checkpatch запущена с опцией "--strict'. Изменение даст возможность не отвлекать разработчиков на манипуляции (https://lkml.org/lkml/2020/5/28/1245) с пробелами и более свободно чувствовать себя при выравнивании кода, а также предотвратит (https://lkml.org/lkml/2020/5/28/1237) излишнее разбиение строк, мешающее (https://lkml.org/lkml/2020/5/29/1038) восприятию кода и поиску.
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=17054f492dfd4d91e093ebb87013807812ec42a4) поддержка смешанного режима загрузки EFI, позволяющего без применения специализированного загрузчика загрузить 64-разрядное ядро из 32-разрядной прошивки, выполняемой на 64-разрядном CPU.
Включена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6650cdd9a8ccf00555dbbe743d58541ad8feb6a7) система выявления и отладки расщеплённых блокировок ("split lock (https://lwn.net/Articles/806466/)"), возникающих при доступе к невыровненным данным в памяти из-за того, что при выполнении атомарной инструкции данные пересекают две линии кеша CPU. Подобные блокировки приводят к значительному падению производительности (на 1000 циклов медленнее, чем атомарная операция с данными, попадающими в одну линию кеша). В зависимости от загрузочного параметра "split_lock_detect" ядро может на лету выявлять подобные блокировки и выводить предупреждения или отправлять сигнал SIGBUS приложению, вызвавшему блокировку.
В планировщике задач обеспечено отслеживание показателей датчиков температуры (Thermal Pressure (https://lwn.net/Articles/788380/)) и реализован учёт перегрева при размещении задач. Пользуясь выдаваемой статистикой обработчик температуры (thermal governor) может корректировать максимальную частоту CPU при перегреве, а планировщик задач теперь учитывает снижение вычислительной мощности из-за подобного урезания частоты при планировании запуска задач (раньше планировщик реагировал на изменение частоты с определённой задержкой, какое-то время принимая решения на основе завышенных предположениях о доступных вычислительных ресурсах).
В планировщике задач задействованы инвариантные показатели (https://lwn.net/Articles/816388/) отслеживания нагрузки, позволяющие корректно оценить нагрузку, независимо от текущей частоты работы CPU. Изменение позволяет более точно прогнозировать поведение задач в условиях динамического изменения вольтажа и частоты CPU. Например, задача, которая потребляла 1/3 ресурсов CPU при частоте 1000 MHz, станет потреблять 2/3 ресурсов при снижении частоты до 500 MHz, что раньше создавало ложное предположение о работе на полную мощность (т.е. задачи для планировщика казались более крупными только за счёт снижения частоты, что приводило к принятию неверных решений в schedutil cpufreq governor).
Драйвер Intel P-state, отвечающий за выбор режимов производительности, переведён на использование schedutil (https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt).
Реализована возможность использования подсистемы BPF при работе ядра в режиме реального времени (PREEMPT_RT). Ранее при включении PREEMPT_RT предписывалось отключение BPF.
Добавлен новый тип BPF-программ - BPF_MODIFY_RETURN, которые могут прикрепляться к функции в ядре и изменять возвращаемое данной функцией значение.
Добавлена возможность (https://lwn.net/Articles/807882/) использования системного вызова clone3() для создания процесса в cgroup, отличающемся от родительского cgroup, что позволяет родительскому процессу применить ограничения и включить аккаунтинг сразу после порождения нового процесса или потока. Например, сервисный менеджер может напрямую выделять новые сервисы в отдельные cgroup, а новые процессы при помещении в "замороженные" cgroup и будут сразу остановлены.
в Kbuild добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a0d1c951ef08ed24f35129267e3595d86f57f5d3) поддержка переменной окружения "LLVM=1" для переключения на инструментарий Clang/LLVM при сборке ядра. Подняты требования к версии binutils (2.23).
В debugfs добавлена секция /sys/kernel/debug/kunit/ с результатами тестов kunit.
Добавлен параметр загрузки ядра pm_debug_messages (аналог/sys/power/pm_debug_messages), включающий вывод отладочной информации о работе системы управления питанием (полезно при отладке проблем со спящим и ждущим режимом).
В интерфейс асинхронного ввода/вывода io_uring (https://www.opennet.ru/opennews/art.shtml?num=50631#io_uring) добавлена поддержка splice() (https://www.man7.org/linux/man-pages/man2/splice.2.html) и атомарного выбора буферов (https://lwn.net/Articles/815491/).
Улучшено профилирование cgroup при помощи инструментария perf. Ранее perf мог профилировать задачи только в определённом cgroup и не мог узнать к какой cgroup принадлежит текущий образец. Теперь perf получает сведения о cgroup для каждой выборки, что позволяет профилировать более одного cgroup и применять сортировку по cgroup в отчётах.
В cgroupfs, псевдо-ФС для управления cgroups, добавлена поддержка расширенных атрибутов (xattrs) при помощи которых, например, можно оставлять дополнительную информацию для обработчиков в пространстве пользователя.
В cgroup memory controller добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a931f801340)а поддержка рекурсивной защиты значения "memory.low", регулирующего минимальный объём оперативной памяти, предоставленной участникам группы. При монтировании иерархии cgroup с опцией "memory_recursiveprot" значение "memory.low", которое установлено для нижних узлов, автоматически будет распределяться для всех дочерних узлов.
Добавлен (https://git.kernel.org/linus/aa017ab97a22) фреймворк 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 и предоставляющего счётчики производительности, которые использованы для расчёта коэффициентов коррекции масштабирования частоты в планировщике задач.
Оборудование
Добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=961e9c84077f) поддержка устройств vDPA, в которых используется канал обмена данных, соответствующий спецификациям virtio. vDPA-устройства могут быть как физически подключённым оборудованием, так и эмулируемыми программно виртуальными устройствами.
В подсистеме GPIO появилась (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=51c1064e82e7) новая команда ioctl() для мониторинга изменений, позволяющая наладить информирование процесса об изменении состояния любой линии GPIO. В качестве примера использования новой команды предложена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=33f0c47b8fb4) утилита gpio-watch.
В DRM-драйвере i915 для видеокарт Intel включена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f365ab31efacb70bed1e821f7435626e0b2528a6) по умолчанию поддержки чипов Tigerlake ("Gen12") и добавлена начальная поддержка управления подсветкой OLED. Улучшена поддержка чипов Ice Lake, Elkhart Lake, Baytrail и Haswell.
В драйвере amdgpu добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f365ab31efacb70bed1e821f7435626e0b2528a6) возможность загрузки прошивок в чип 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.
В систему управления питанием добавлена (https://git.kernel.org/linus/16292bed9c56a20715d942fd5d9e025f01fa65fe) поддержка платформы Intel Jasper Lake (JSL) на базе Atom.
Добавлена поддержка ноутбука Pinebook Pro на базе Rockchip RK3399, планшета Pine64 PineTab и смартфона PinePhone (https://www.opennet.ru/opennews/art.shtml?num=52662) на базе 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.
01.06.2020
https://www.opennet.ru/opennews/art.shtml?num=53062