Релиз ядра 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.
1602497626979.png

В новую версию принято 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 памяти, значительно уменьшить общее потребление памяти ядром и снизить фрагментацию памяти.
    • В звуковой подсистеме ALSA и USB-стеке, в соответствии с недавно принятыми рекомендациями по использованию инклюзивной терминологии в ядре Linux, проведена чистка неполиткорректных терминов. Код очищен от использования слов "slave", "master", "blacklist" и "whitelist".
  • Виртуализация и безопасность
    • При сборке ядра с использованием компилятора 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.
    • Для AMD Zen и более новых моделей CPU добавлена поддержка технологии P2PDMA, позволяющей использовать DMA для прямой передачи данных между памятью двух устройств, подключенных к шине PCI.
    • В 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 реализована упреждающая загрузка битовых карт распределения блоков. В сочетании с ограничением сканирования неинициализированных групп, оптимизация позволила сократить время монтирования очень больших разделов.
    • В F2FS добавлен ioctl F2FS_IOC_SEC_TRIM_FILE, позволяющий использовать команды TRIM/discard для физического обнуления указанных данных в файле, например, для удаления ключей доступа без оседания на накопителе остаточных данных. В F2FS также добавлен новый режим сборки мусора GC_URGENT_LOW, работающий более агрессивно за счёт исключения некоторых проверок нахождения в состоянии простоя (idle) перед запуском сборщика мусора.
    • В 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-блока.
    • Для устройств хранения NVMe добавлена поддержка команд для зонирования накопителя (ZNS, NVM Express Zoned Namespace), позволяющего разбить пространство для хранения на зоны, составляющие группы блоков, для более полного управления размещением данных на накопителе.
  • Сетевая подсистема
    • В 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". В данном режиме виртуальная таблица может быть ассоциирована только с таблицей маршрутизации, которая не используется в других виртуальных таблицах.
    • В беспроводной драйвер ath11k добавлена поддержка частоты 6GHz и спектрального сканирования.
  • Оборудование
    • Удалён код для поддержки архитектуры 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 градусов.
      Интересно, что драйвер для GPU AMD является самым крупным драйвером в ядре - он насчитывает около 2.71 млн строк кода, что примерно 10% от общего размера ядра (27.81 млн строк). При этом 1.79 млн строк приходится на сгенерированные автоматически заголовочные файлы с данными для регистров GPU, а Си-код составляет 366 тысяч строк (для сравнения драйвер Intel i915 включает 209 тысяч строк, а Nouveau - 149 тысяч).
    • В драйвер Nouveau добавлена поддержка покадровой проверки целостности при помощи CRC (Cyclic Redundancy Checks) в дисплейных движках GPU NVIDIA. Реализация основана на документации, предоставленной компанией NVIDIA.
    • Добавлены драйверы для LCD-панелей: Frida FRD350H54004, KOE TX26D202VM0BWA, CDTech S070PWS19HP-FC21, CDTech S070SWV29HG-DC44, Tianma TM070JVHG33 и Xingbangda XBD599.
    • В звуковой подсистеме ALSA реализована поддержка Intel Silent Stream (режим постоянного поддержания питания для внешних HDMI-устройств для исключения задержки при начале воспроизведения) и нового устройства для управления подсветкой кнопок активации микрофона и отключения звука, а также добавлена поддержка нового оборудования, включая контроллер Loongson 7A1000.
    • Добавлена поддержка 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.9 - Linux-libre 5.9-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске отключена загрузка блобов в драйверах для WiFi rtw8821c и SoC MediaTek mt8183. Обновлён код чистки блобов в драйверах и подсистемах Habanalabs, Wilc1000, amdgpu, mt7615, i915 CSR, Mellanox mlxsw (Spectrum3), r8169 (rtl8125b-2) и x86 touchscreen.


Opennet
 
Назад
Сверху Снизу