28.10.2020

Релиз ядра Linux 5.9


После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.9. Среди наиболее заметных изменений: ограничение импорта символов из проприетарных модулей в GPL-модули, ускорение операций переключения контекста при помощи процессорной инструкции FSGSBASE, поддержка алгоритма сжатия Zstd, переработка расстановки приоритетов для потоков в ядре, поддержка протокола PRP (Parallel Redundancy Protocol), планирование с учётом пропускной способности в планировщике deadline, упреждающая упаковка страниц памяти, capability-флаг CAP_CHECKPOINT_RESTOR, системный вызов close_range(), повышение производительности dm-crypt, удаление кода для 32-разрядных гостевых систем Xen PV, новый механизм управления памятью slab, опция «rescue» в Btrfs, поддержка inline-шифрования в ext4 и F2FS.

В новую версию принято 16074 исправлений от 2011 разработчиков, размер патча — 62 МБ (изменения затронули 14548 файлов, добавлено 782155 строк кода, удалено 314792 строк). Около 45% всех представленных в 5.9 изменений связаны с драйверами устройств, примерно 15% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 13% связано с сетевым стеком, 3% — с файловыми системами и 3% c внутренними подсистемами ядра.

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

  • Память и системные сервисы
    • Ужесточена защита от использования GPL-прослоек для связывания проприетарных драйверов с компонентами ядра, экспортируемыми только для модулей под лицензией GPL. Флаг TAINT_PROPRIETARY_MODULE теперь наследуются во всех модулях, импортирующих символы из модулей с данным флагом. Если GPL-модуль попытается импортировать символы из не-GPL модуля, то этот GPL-модуль унаследует метку TAINT_PROPRIETARY_MODULE и не сможет обращаться к компонентам ядра, доступным только для модулей под лицензией GPL, даже если модуль ранее импортировал символы из категории «gplonly». Обратная блокировка (экспорт только EXPORT_SYMBOL_GPL в модулях, импортировавших EXPORT_SYMBOL_GPL), которая могла нарушить работу пропритеарных драйверов, не реализована (наследуется только флаг пропритарного модуля, но не GPL-привязки).
    • Добавлена поддержка механизма kcompactd для упреждающей упаковки страниц памяти в фоновом режиме, позволяющего увеличить число больших страниц памяти, доступных ядру. По предварительной оценке фоновая упаковка ценой минимальных накладных расходов позволяет в 70-80 раз снизить задержки при выделении крупных страниц памяти (huge-page) по сравнению с ранее применяемым механизмом упаковки, запускаемым при возникновении необходимости (on-demand). Для задания границ внешней фрагментации, которую будет обеспечивать kcompactd, добавлен sysctl vm.compaction_proactiveness.
    • Добавлена поддержка сжатия образа ядра с использованием алгоритма Zstandard (zstd).
    • Для систем x86 реализована поддержка процессорной инструкции FSGSBASE, позволяющей читать и изменять содержимое регистров FS/GS из пространства пользователя. В ядре FSGSBASE используется для ускорения операций переключения контекста за счёт исключения лишних операций записи MSR для GSBASE, а в пространстве пользователя позволяет обойтись без лишних системных вызовов для изменения FS/GS.
    • Добавлен параметр «allow_writes», позволяющий запретить изменения MSR-регистров процессора из пространства пользователя и ограничить доступ к содержимому данных регистров операциями чтения, так как изменение MSR может привести к проблемам. По умолчанию запись пока не запрещена, а изменение MSR отражается в логе, но в будущем планируется перевести доступ по умолчанию в режим только для чтения.
    • В интерфейс асинхронного ввода/вывода io_uring добавлена полная поддержка асинхронных операций буферизированного чтения, не требующих привлечения потоков ядра. Поддержка записи ожидается в следующем выпуске.
    • В планировщике ввода/вывода deadline реализовано планирование с учётом пропускной способности, позволяющее принимать корректные решения на асимметричных системах, таких как системы ARM на базе архитектур DynamIQ и big.LITTLE, комбинирующие в одном чипе мощные и менее производительные энергоэффективные ядра CPU. В частности, новый режим позволяет избежать рассогласований при планировании, когда медленное ядро CPU не имеет должных ресурсов для выполнения задачи в назначенный срок.
    • Модель потребления энергии в ядре (фреймворк Energy Model) теперь описывает не только поведение энергопотребления CPU, но и охватывает периферийные устройства.
    • Реализован системный вызов close_range(), позволяющий процессу разом закрыть целый диапазон открытых файловых дескрипторов.
    • Из реализации текстовой консоли и драйвера fbcon удалён код, обеспечивающий возможность программной прокрутки текста назад (CONFIG_VGACON_SOFT_SCROLLBACK) более чем на объем видеопамяти текстового режима VGA.
    • Переработан алгоритм назначения приоритетов для потоков внутри ядра. Новый вариант обеспечивает лучшую согласованность во всех подсистемах ядра при назначении приоритетов для задач реального времени.
    • Добавлен sysctl sched_uclamp_util_min_rt_default для управления параметрами форсирования частоты CPU для задач реального времени (например, можно на лету менять поведение при выполнении задач реального времени для экономии энергии после перехода на питание от аккумулятора или на мобильных системах).
    • Проведена подготовка к реализации поддержки технологии Transparent Huge Pages в страничном кэше.
    • В механизме fanotify реализованы новые флаги FAN_REPORT_NAME и FAN_REPORT_DIR_FID для передачи сведений о родительском имени и уникальном идентификаторе FID при наступлении событий создания, удаления или перемещения элементов каталога и не связанных с каталогами объектов.
    • Для cgroups реализован новый контроллер распределения памяти slab (slab memory controller), который примечателен переносом учёта slab с уровня страниц памяти на уровень объектов ядра, что даёт возможность совместно использовать slab-страницы в разных cgroup, вместо выделения отдельных кэшей slab для каждой cgroup. Предложенный подход позволяет повысить эффективность использования slab, на 30-45% сократить размер используемой для slab памяти, значительно уменьшить общее потребление памяти ядром и снизить фрагментацию памяти.
  • Виртуализация и безопасность
    • При сборке ядра с использованием компилятора Clang появилась возможность настройки (CONFIG_INIT_STACK_ALL_ZERO) автоматической инициализации нулевым значением всех переменных, хранимых в стеке (при сборке указывается «-ftrivial-auto-var-init=zero») .
    • В подсистему seccomp, при использовании режима контроля процесса в пространстве пользователя, добавлена возможность подстановки в отслеживаемый процесс файловых дескрипторов для полной эмуляции системных вызовов, приводящих к созданию файловых дескрипторов. Функциональность востребована в системах изолированных контейнеров и реализации sandbox для Chrome.
    • Для архитектур xtensa и csky добавлена поддержка ограничения системных вызовов при помощи подсистемы seccomp. Для xtensa дополнительно реализована поддержка механизма аудита.
    • Добавлен новый capability-флаг CAP_CHECKPOINT_RESTORE, позволяющий без передачи дополнительных привилегий предоставить доступ к возможностям, связанным с заморозкой и восстановлением состояния процессов.
    • В GCC 11 реализованы все возможности, необходимые для отладочного инструмента KCSAN (Kernel Concurrency Sanitizer), предназначенного для динамического выявления состояний гонки внутри ядра. Таким образом, KCSAN теперь может использоваться с ядрами, собранными в GCC.
    • В dm-crypt добавлен режим, позволяющий сократить задержки за счёт выполнения криптографической обработки данных без использования рабочих очередей. Указанный режим также необходим для корректной работы с зонированными блочными устройствами (устройства с областями, которые должны записываться последовательно с обновлением целиком всей группы блоков). Проведена работа по повышению пропускной способности и уменьшению задержек в dm-crypt.
    • Удалён код для поддержки 32-разрядных гостевых систем, работающих в режиме паравиртуализации под управлением гипервизора Xen. Пользователям подобных систем следует перейти на использование 64-разрядных ядер в гостевых окружениях или использовать для запуска окружений вместо паравиртуализации (PV) режимы полной (HVM) или комбинированной (PVH) виртуализации.
  • Дисковая подсистема, ввод/вывод и файловые системы
    • В файловой системе Btrfs реализована опция монтирования «rescue», унифицирующая доступ ко всем другим опциям для восстановления. Удалена поддержка опций «alloc_start» и «subvolrootid», объявлена устаревшей опция «inode_cache». Проведена оптимизация производительности, особенно заметно ускорено выполнение операций fsync(). Добавлена возможность использования альтернативных типов контрольных сумм, отличных от CRC32c.
    • Добавлена возможность использования inline-шифрования (Inline Encryption) в файловых системах ext4 и F2FS, для включения которого предусмотрена опция монтирования «inlinecrypt». Режим inline-шифрования позволяет задействовать встроенные в контроллер накопителя механизмы шифрования, которые осуществляют прозрачное шифрование и расшифровку ввода/вывода.
    • В XFS обеспечен сброс inode (flush) в полностью асинхронном режиме, не блокирующем процессы при выполнении операции чистки памяти. Решена давняя проблема с квотами, из-за которой некорректно отслеживались предупреждения о превышении мягкого лимита и ограничений на число inode. Унифицирована реализация поддержки DAX для ext4 и xfs.
    • В Ext4 реализована упреждающая загрузка битовых карт распределения блоков. В сочетании с ограничением сканирования неинициализированных групп, оптимизация позволила сократить время монтирования очень больших разделов.
    • В bcache размер bucket_size для экстентов увеличен с 16 до 32 бит в рамках подготовки к обеспечению возможности применения для кэша зонированных устройств.
    • В подсистему SCSI добавлена возможность использования inline-шифрования на базе встроенных средств аппаратного шифрования, предоставляемых UFS-контроллеами (Universal Flash Storage).
    • Добавлен новый параметр командной строки ядра «debugfs», позволяющий управлять доступностью одноимённой псевдо-ФС.
    • В клиенте NFSv4.2 обеспечена поддержка расширенных атрибутов файлов (xattr).
    • В dm-dust добавлен интерфейс для вывода разом списка всех выявленных bad-блоках на диске («dmsetup message dust1 0 listbadblocks»).
    • Для md/raid5 добавлен параметр /sys/block/md1/md/stripe_size для настройки размера STRIPE-блока.
  • Сетевая подсистема
    • В Netfilter добавлена возможность отклонения пакетов на стадии до проверки маршрутизации (выражение REJECT теперь может использоваться не только в цепочках INPUT, FORWARD и OUTPUT, но и на стадии PREROUTING для icmp и tcp).
    • В nftables добавлена возможность аудита событий, связанных с изменением конфигурации.
    • В nftables в API netlink добавлена поддержэка анонимных цепочек, имя которым назначается динамически ядром. При удалении свяханного с анонимной цепочкой правила, автоматически удаляется и сама цепочка.
    • В BPF добавлена поддержка итераторов для обхода, фильтрации и изменения элементов ассоциативных массивов (map) без копирования данных в пространство пользователя. Итераторы можно использовать для сокетов TCP и UDP, что позволяет BPF-программам перебирать списки открытых сокетов и извлекать из них необходимые сведения.
    • Добавлен новый тип BPF-программ BPF_PROG_TYPE_SK_LOOKUP, запускаемых в момент, когда ядро ищет подходящий слушающий сокет для входящего соединения. При помощи подобной BPF-программы можно создавать обработчики, принимающие решения о том, c каким сокетом следует ассоциировать соединение, не ограниченные рамками системного вызова bind(). Например, можно организовать связывание одного сокета с диапазоном адресов или портов. Кроме того, в bpf_setsockopt() добавлена поддержка флага SO_KEEPALIVE и реализована возможность установки обработчиков BPF_CGROUP_INET_SOCK_RELEASE, вызываемых при освобождении сокета.
    • Реализована поддержка протокола PRP (Parallel Redundancy Protocol), позволяющего на базе Ethernet реализовать прозрачное для приложений переключение на запасной канал в случае сбоя любых компонентов сети.
    • В стек mac80211 добавлена поддержка четырёхэтапного согласования канала WPA/WPA2-PSK в режиме точки доступа.
    • Добавлена возможность переключения планировщика qdisc (queuing discipline) на использование по умолчанию алгоритма управления сетевыми очередями FQ-PIE (Flow Queue PIE), нацеленного на снижение негативного влияния промежуточной буферизации пакетов на граничном сетевом оборудовании (bufferbloat) в сетях с кабельными модемами.
    • Добавлены новые возможности в MPTCP (MultiPath TCP), расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам. Добавлена поддержка syn cookie, DATA_FIN, автонастройки буферов, диагностики сокетов и испльзования флагов REUSEADDR, REUSEPORT и V6ONLY в setsockopt.
    • Для виртуальных таблиц маршрутизации VRF (Virtual Routing and Forwarding), позволяющих организовать работу нескольких доменов маршрутизации на одной системе, реализован режим «strict». В данном режиме виртуальная таблица может быть ассоциирована только с таблицей маршрутизации, которая не используется в других виртуальных таблицах.
  • Оборудование
    • Удалён код для поддержки архитектуры UniCore, разработанной в микропроцессорном центре Пекинского университета и включённой в состав ядра Linux в 2011 году. Данная архитектура с 2014 года находится без сопровождения и не имеет поддержи в GCC.
    • Для архитектуры RISC-V реализована поддержка kcov (debugfs-интерфейс для анализа покрытия кода ядра), kmemleak (система выявления утечек памяти), защиты стека, меток перехода и tickless-операций (независимая от сигналов таймера многозадачность).
    • Для архитектуры PowerPC реализована поддержка очередей для spinlock, позволившая значительно поднять производительность в ситуациях конфликта блокировок.
    • Для архитектур ARM и ARM64 задействован по умолчанию механизм регулирования частоты процессора schedutil (cpufreq governor), который для принятия решения об изменении частоты напрямую использует информацию от планировщика задач и может сразу обращаться к драйверам cpufreq для оперативного изменения частоты, мгновенно подгоняя параметры работы CPU к текущей нагрузке.
    • В DRM-драйвере i915 для видеокарт Intel включена поддержка чипов на базе микроархитектуры Rocket Lake и добавлена начальная поддержка дискретных карт Intel Xe DG1.
    • В драйвер amdgpu добавлена начальная поддержка GPU AMD Navi 21 (Navy Flounder) и Navi 22 (Sienna Cichlid). Добавлена поддержка движков ускорения кодирования и декодирования видео UVD/VCE для GPU Southern Islands (Radeon HD 7000). Добавлено свойство для поворота отображения на 90, 180 или 270 градусов. Интересно, что amdgpu является самым крупным драйвером в ядре. Драйвер насчитывает около 2.71 млн строк кода, что примерно 10% от общего размера ядра (27.81 млн строк). При этом 1.79 млн строк приходится на сгенерированные автоматически заголовочнные файлы.
    • В драйвер Nouveau добавлена поддержка покадровой проверки целостности при помощи CRC (Cyclic Redundancy Checks) в дисплейных движках GPU NVIDIA. Реализация основана на документации, предоставленной компанией NVIDIA.
    • Добавлены драйверы для LCD-панелей: Frida FRD350H54004, KOE TX26D202VM0BWA, CDTech S070PWS19HP-FC21, CDTech S070SWV29HG-DC44, Tianma TM070JVHG33 и Xingbangda XBD599.
    • Добавлена поддержка ARM-плат, устройств и платформ: Pine64 PinePhone v1.2, Lenovo IdeaPad Duet 10.1, ASUS Google Nexus 7, Acer Iconia Tab A500, Qualcomm Snapdragon SDM630 (используется в Sony Xperia 10, 10 Plus, XA2, XA2 Plus и XA2 Ultra), Jetson Xavier NX, Amlogic WeTek Core2, Aspeed EthanolX, пять новых плат на базе NXP i.MX6, MikroTik RouterBoard 3011, Xiaomi Libra, Microsoft Lumia 950, Sony Xperia Z5, MStar, Microchip Sparx5, Intel Keem Bay, Amazon Alpine v3, Renesas RZ/G2H.

Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 5.9Linux-libre 5.9-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске отключена загрузка блобов в драйверах для WiFi rtw8821c и SoC MediaTek mt8183. Обновлён код чистки блобов в драйверах и подсистемах Habanalabs, Wilc1000, amdgpu, mt7615, i915 CSR, Mellanox mlxsw (Spectrum3), r8169 (rtl8125b-2) и x86 touchscreen.

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

Добавить комментарий