Ядро 5.3
16.09.2019
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.3. Среди наиболее заметных изменений: поддержка GPU AMD Navi, процессоров Zhaoxi и технологии управления энергопотреблением Intel Speed Select, возможность использования инструкций umwait для ожидания без использования циклов,
повышающий интерактивность режим 'utilization clamping' для асимметричных CPU, системный вызов pidfd_open, возможность использования IPv4-адресов из подсети 0.0.0.0/8, возможность аппаратного ускорения nftables, поддержка HDR в подсистеме DRM, интеграция гипервизора ACRN.
В анонсе нового выпуска Линус напомнил всем разработчикам о главном правиле разработки ядра - сохранение неизменности поведения для компонентов пространства пользователя. Изменения в ядре никаким образом не должны нарушать уже работающие приложения и приводить к регрессиям на пользовательском уровне. При этом нарушение поведения может вызвать не только изменение ABI, удаление устаревшего кода или появление ошибок, но и косвенное влияние корректно работающих полезных улучшений. В качестве наглядного примера была отброшена полезная оптимизация в коде Ext4, сокращающая число обращений к накопителю за счёт отключения упреждающего чтение таблицы inode при мелких запросах ввода/вывода.
Оптимизация привела к тому, что из-за снижения дисковой активности энтропия для генератора случайных чисел getrandom() стала накапливаться медленнее и в некоторых конфигурациях при определённом стечении обстоятельств могли наблюдаться подвисания во время загрузки до заполнения пула энтропии. Так как оптимизация действительно полезная, среди разработчиков возникла дискуссия, в которой предлагалось устранить проблему за счёт отключения по умолчанию блокирующего режима работы вызова getrandom() с добавлением опционального флага для ожидания энтропии, но подобное изменение повлияет на качество случайных чисел на начальном этапе загрузки.
В коммите с откатом изменения Линус отметил, что планирует вернуть оптимизацию обратно, как только проблема с getrandom() будет решена.
В новую версию принято 15794 исправлений от 1974 разработчиков,
размер патча - 92 Мб (изменения затронули 13986 файлов, добавлено 258419 строк кода,
удалено 599137 строк). Около 39% всех представленных в 5.3
изменений связаны с драйверами устройств, примерно 12% изменений имеют
отношение к обновлению кода специфичного для аппаратных архитектур, 11%
связано с сетевым стеком, 3% - файловыми системами и 3% c внутренними
подсистемами ядра.
Основные новшества:
- Память и системные сервисы
- Продолжено развитие функциональности 'pidfd', помогающей обрабатывать ситуации с повторным использованием PID (pidfd связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID). Ранее в ядро уже был добавлен
системный вызов pidfd_send_signal() и флаг CLONE_PIDFD в вызове clone(), позволяющий получить pidfd для использования в idfd_send_signal(). При использовании вызова clone() с флагом CLONE_PIDFD могли возникать проблемы с сервисными менеджерами или системой принудительного завершения процессов при нехватке памяти в платформе Android. В этом случае для запуска используется вызов fork() или clone() без CLONE_PIDFD.
В ядре 5.3 представлен системный вызов pidfd_open(), позволяющий получить проверяемый pidfd для произвольного существующего процесса, созданного не через вызов clone() с флагом CLONE_PIDFD. Также добавлена поддержка поллинга pidfd при помощи poll() и epoll(), что позволяет в менеджерах процессов отслеживать завершения произвольных процессов, не опасаясь состояния гонки в случае присвоения PID новому процессу. Механизм уведомления о завершении работы процесса, связанного с pidfd, аналогичен информированию о завершении своего дочернего процесса;
- В планировщик задач добавлена поддержка механизма закрепления нагрузки (Utilization clamping), позволяющего придерживаться минимального или максимального диапазонов частот, в зависимости от активных на CPU задач. Представленный механизм ускоряет задачи, которые напрямую влияют на качество взаимодействия с пользователем, через запуск этих задач как минимум в нижней границе "запрошенной" частоты. Низкоприоритетные задачи, не сказывающиеся на работе пользователя, запускаются c использованием верхнего лимита "разрешённой" частоты. Лимиты задаются через атрибуты sched_uclamp_util_min и sched_uclamp_util_max в системном вызове sched_setattr().
- Добавлена поддержка технологии управления энергопотреблением Intel Speed Select, доступной на некоторых серверах с процессорами Intel Xeon. Указанная технология позволяет устанавливать настройки производительности и пропускной способности разделов для разных ядер CPU, что позволяет сделать более приоритетной производительность для задач, выполняемых на определённых ядрах, жертвуя производительностью на других ядрах;
- Процессам в пространстве пользователя предоставлена возможность ожидания в течение небольшого времени без использования циклов при помощи инструкции umwait. Данная инструкция, вместе с инструкциями umonitor и tpause, будет предложена в готовящихся к выпуску чипах Intel "Tremont", и позволит реализовывать задержки, эффективные с точки зрения энергопотребления и не влияющие на производительность других потоков при использовании Hyper Threading;
- Для архитектуры RISC-V добавлена поддержка больших страниц памяти (huge pages);
- В механизм трассировки "kprobes" добавлена возможность разыменования указателей ядра в пространство пользователя, что может применяться, например, для оценки содержимого структур, передаваемых в системные вызовы. Также добавлена возможность установки проверок на этапе загрузки.
- В файл конфигурации добавлена опция PREEMPT_RT для работы в режиме реального времени. Сам код для поддержки режима реального времени пока не добавлен в ядро, но появление опции является хорошим знаком, что многолетняя эпопея по интеграции патчей Realtime-Preempt близится к финалу;
- Добавлен системный вызов clone3() c реализацией более расширяемого варианта интерфейса clone(), допускающего указание большего числа флагов;
- Добавлен обработчик bpf_send_signal(), позволяющий BPF-программам отправлять сигналы произвольным процессам;
- Для событий perf в окружении гипервизора KVM добавлен новый механизм фильтрации событий, позволяющий администратору определить типы событий, допустимые или не допустимые для мониторинга на стороне гостевой системы;
- В механизм верификации eBPF-приложений добавлена возможность обработки программ с циклами, если выполнение цикла ограничено и не может привести к превышению лимита на максимальное число инструкций;
- Дисковая подсистема, ввод/вывод и файловые системы
- Для файловой системы XFS реализована возможность многопоточного обхода inode (например, при проверке квот). Добавлены новые ioctl BULKSTAT и INUMBERS, предоставляющие доступ к возможностям, появившимся в пятой редакции формата ФС, таким как время рождения inode и возможность задания параметров BULKSTAT и INUMBERS для каждой группы AG (Allocation Groups);
- В Ext4 добавлена поддержка пустот в каталогах (не привязанных блоков).
Обеспечена обработка флага "i" (immutable) для открытых файлов (запрет записи в ситуации, если флаг был установлен в момент, когда файл уже был открыт);
- В Btrfs обеспечено определение быстрой реализации crc32c на всех архитектурах;
- В CIFS с кода для поддержки smbdirect снят признак экспериментальной разработки. В SMB3 добавлена возможность использования криптоалгоритмов в режиме GCM. Добавлена новая опция монтирования для извлечения параметров режима из записей ACE (Access Сontrol Entry). Оптимизирована производительность вызова open();
- В F2FS добавлена опция для ограничения сборщика мусора при работе в режиме checkpoint=disable. Добавлен ioctl для удаления диапазонов блоков из F2FS, что позволяет реализовать корректировку размера раздела на лету. Добавлена возможность размещения в F2FS файла подкачки с обеспечением прямого ввода/вывода. Для всех пользователей добавлена поддержка закрепления файла и выделения блоков для подобных файлов;
- В интерфейс для асинхронного ввода/вывода io_uring добавлена поддержка асинхронных операций sendmsg() и recvmsg();
- В файловую систему UBIFS добавлена поддержка сжатия с использованием алгоритма zstd и возможность верификации подписанных образов ФС;
- В ФС Ceph добавлена поддержка меток безопасности SELinux для файлов;
- Для NFSv4 реализована новая опция монтировния "nconnect=", определяющая число установленных с сервером соединений. Трафик между этими соединениями будет распределяться с использованием балансировки нагрузки. Кроме того, сервером NFSv4 теперь создаётся каталог /proc/fs/nfsd/clients с информацией о текущих клиентах, включая сведения об открытых ими файлах;
- Виртуализация и безопасность
- В состав ядра включён гипервизор для встраиваемых устройств ACRN, который написан с оглядкой на готовность для выполнения задач реального времени и пригодность к использованию в критически важных системах. ACRN обеспечивает минимальные накладные расходы, гарантирует низкие задержки (low latency) и адекватную отзывчивость при взаимодействии с оборудованием. Поддерживается виртуализация ресурсов CPU, ввода/вывода, сетевой подсистемы, операций с графикой и звуком. ACRN может применяться для запуска нескольких изолированных виртуальных машин в электронных блоках управления, приборных панелях, автомобильных информационных системах, потребительских IoT-устройств и другой встраиваемой техники;
- В User-mode Linux добавлен режим "путешествия во времени", позволяющий замедлить или ускорить время в виртуальном окружении UML для упрощения отладки связанного со временем кода. Кроме того добавлен параметр
time-travel-start, позволяющий стартовать системные часы с указанного момента в epoch-формате;
- Добавлены новые опции командной строки ядра "init_on_alloc" и "init_on_free", при указании которых включается обнуление выделяемых и освобождаемых областей памяти (заполнение нулями при malloc и free), что позволяет усилить безопасность за счёт дополнительных накладных расходов на инициализацию;
- Добавлен новый драйвер virtio-iommu с реализацией паравиртализированного устройства, позволяющего отправлять IOMMU-запросы, такие как ATTACH, DETACH, MAP и UNMAP, поверх транспорта virtio без эмуляции таблиц страниц памяти;
- Добавлен новый драйвер virtio-pmem, представляющий доступ к устройствам хранения, отражённым в физическое адресное пространство, таким как NVDIMM;
- Реализована возможность прикрепления криптографических ключей к пользовательскому или сетевому пространству имён (ключи становятся недоступны за пределами выбранного пространства имён), а также защиты ключей при помощи ACL;
- В криптоподсистему добавлена поддержка очень быстрого алгоритма некриптографичекого хэширования xxhash, скорость которого упирается в производительность памяти;
- Сетевая подсистема
- Обеспечена обработка адресов IPv4 в диапазоне 0.0.0.0/8, который ранее был недоступен для использования. Введение данной подсети позволит распределить ещё 16 млн адресов IPv4;
- В Netfilter для nftables добавлена поддержка механизмов аппаратного ускорения фильтрации пакетов за счёт применения добавленного в драйверы Flow Block API. На сторону сетевых адаптеров могут выноситься целые таблицы правил со всеми цепочками. Включение производится через привязку флага NFT_TABLE_F_HW к таблице. Поддерживаются простые метаданные протоколов 3 и 4 уровней, действия принять/отбросить, сопоставления по IP и сетевым портам отправителя/получателя и типу протокола;
- Добавлена встроенная поддержка отслеживания соединений для сетевых мостов, не требующая применения эмулирующей прослойки br_netfilter;
- В nf_tables добавлена поддержка модуля SYNPROXY, повторяющего аналогичную функциональность из iptables, а также реализована возможность проверки в правилах по отдельным опциям в заголовке IPv4;
- Добавлена возможность прикрепления BPF-программ к системным вызовам setsockopt() и getsockopt(), что, например, позволяет прикрепить свои обработчики доступа к этим вызовам. Кроме того, добавлена новая точка вызова (hook), при помощи которой можно организовать вызов BPF-программы один раз за каждый интервал RTT (round-trip-time, время пинга);
- Для IPv4 и IPv6 добавлен новый механизм хранения данных маршрутизации nexthop, нацеленный на увеличение масштабируемости таблиц маршрутизации. Проведённые тесты показали, что при использовании новой системы набор в 743 тысяч маршрутов был загружен в ядро всего за 4.3 секунды;
- Для Bluetooth реализована функциональность, необходимая для поддержки LE ping;
- Оборудование
- Добавлена поддержка x86-совместимых процессоров компании Zhaoxin, развиваемых в результате совместного проекта VIA Technologies и муниципалитета Шанхая. Семейство CPU ZX построено на базе архитектуры x86-64 Isaiah, продолжающей развитие технологий VIA Centaur;
- В подсистему DRM (Direct Rendering Manager), а также в графические драйверы amdgpu и i915, добавлена поддержка разбора, обработки и отправка через HDMI-порт метаданных HDR (расширенный динамический диапазон), позволяющего использовать HDR-панели и экраны, способные отображать дополнительные диапазоны яркости;
- В драйвер amdgpu добавлена начальная поддержка GPU AMD NAVI (RX5700), которая включает базовый драйвер, код для взаимодействия с экранами (DCN2), поддержку GFX и вычислений (GFX10),
SDMA 5 (System DMA0), средства управления питанием и мультимедийные кодировщики/декодировщики (VCN2). В amdgpu также улучшена поддержка карт на базе GPU Vega12 и Vega20, для которых добавлены дополнительные возможности управления памятью и энергопотреблением;
- В драйвер amdkfd (для дискретных GPU, такие как Fiji, Tonga, Polaris) добавлена поддержка карт на базе GPU VegaM;
- В DRM-драйвере для видеокарт Intel для чипов Icelake реализован новый мультисегментный режим гамма-коррекции. Добавлена возможность вывода через DisplayPort в формате YCbCr4:2:0. Добавлены новые прошивки GuC для SKL, BXT, KBL, GLK и ICL. Реализована возможность отключения питания экрана в асинхронном режиме. Добавлена поддержка сохранения и восстановления контекста рендеринга для чипов Ironlake (gen5) и gen4 (Broadwater - Cantiga), что позволяет из пространства пользователя восстанавливать состояние GPU при перехода от выполнения одних пакетных операций к другим;
- В драйвере Nouveau обеспечено определение чипсета NVIDIA Turing TU116;
- Расширены возможности DRM/KMS-драйвера для ускорителей экранных операций ARM Komeda (Mali D71), добавлена поддержка масштабирования, разделения/слияния слоёв, поворота, отложенной записи, AFBC, SMMU и форматов кодирования цвета Y0L2, P010, YUV420_8/10BIT;
- В драйвер MSM добавлена поддержка серии A540 GPU Adreno, применяемой в процессорах Qualcomm, а также поддержка DSI-контроллера MSM8998 для Snapdragon 835;
- Добавлены драйверы для LCD-панелей Samsung S6E63M0, Armadeus ST0700, EDT ETM0430G0DH6, OSD101T2045-53TS,
Evervision VGG804821, FriendlyELEC HD702E, KOE tx14d24vm1bpa, TFC S9700RTWV43TR-01B, EDT ET035012DM6 и VXT VL050-8048NT-C01;
- Добавлен драйвер для задействования средств ускорения декодирования
видео, доступных в SoC Amlogic Meson;
- В драйвере v3d (для GPU Broadcom Video Core V, используемого в Raspberry Pi) появилась поддержка диспетчеризации вычислительных шейдеров;
- Добавлен драйвер для SPI-клавиатур и трекпадов, применяемых в современных моделях ноутбуков Apple MacBook и MacBookPro;
- Добавлена дополнительная защита ioctl-вызовов, связанных с драйвером floppy, а сам драйвер помечен как оставленный без сопровождения
("orphaned"), что подразумевает прекращение его тестирования. Драйвер пока сохраняется в ядре, но его корректная работа не гарантируется. Драйвер рассматривается как устаревший, так как для его тестирования трудно найти работающее оборудование - все актуальные внешние накопители, как правило, используют интерфейс USB.
- Добавлен cpufreq-драйвер для плат Raspberry Pi, позволяющий динамически управлять изменением частоты процессора;
- Добавлена поддержка новых ARM SoC Mediatek mt8183 (4x Cortex-A73 + 4x Cortex-A53), TI J721E (2x Cortex-A72 + 3x Cortex-R5F + 3 DSPs + MMA) и Amlogic G12B (4x Cortex-A73 + 2x Cortex-A53), а также плат:
- Purism Librem5,
- Aspeed BMC,
- Microsoft Olympus BMC,
- Kontron SMARC,
- Novtech Meerkat96 (i.MX7),
- ST Micro Avenger96,
- Google Cheza (Qualcomm SDM845),
- Qualcomm Dragonboard 845c (Qualcomm SDM845),
- Hugsun X99 TV Box (Rockchip RK3399),
- Khadas Edge/Edge-V/Captain (Rockchip RK3399),
- HiHope RZ/G2M,
- NXP LS1021A-TSN.
Одновременно Латиноамериканский Фонд свободного ПО сформировал
вариант полностью свободного ядра 5.3 - Linux-libre 5.3-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске отключена загрузка блобов в драйверах qcom, hdcp drm, allegro-dvt и meson-vdec.
Обновлён код чистки блобов в драйверах и подсистемах amdgpu, i915, netx, r8169, brcmfmac, rtl8188eu, adreno, si2157, pvrusb2, touchscreen_dmi, звуковом драйвере для skylake, а также в документации к микрокоду.
|