Релиз ядра Linux 5.3

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.3. Среди наиболее заметных изменений: поддержка GPU AMD Navi, процессоров Zhaoxi и технологии управления энергопотреблением Intel Speed Select, возможность использования инструкций umwait для ожидания без использования циклов, повышающий интерактивность режим ‘utilization clamping’ для асимметричных CPU, системный вызов pidfd_open, возможность использования IPv4-адресов из подсети 0.0.0.0/8, интеграция гипервизора ACRN.

В анонсе нового выпуска Линус напомнил всем разработчикам о главном правиле разработки ядра — сохранение неизменности поведения для компонентов пространства пользователя. Изменения в ядре никаким образом не должны нарушать уже работающие приложения и приводить к регрессиям на пользовательском уровне. При этом нарушение поведения может вызвать не только изменение ABI, удаление устаревшего кода или появление ошибок, но и косвенное влияние корректно работающих полезных улучшений. В качестве наглядного примера была отброшена полезная оптимизация в коде Ext4, сокращающая число мелких обращений к накопителю за счёт отключения упреждающего чтение таблицы inode при мелких запросах ввода/вывода.

Оптимизация привела к тому, что из-за снижения дисковой активности энтропия для генератора случайных чисел getrandom() стала накапливаться медленнее и в некоторых конфигурациях при определённом стечении обстоятельств могли наблюдаться подвисания во время загрузки до заполнения пула энтропии. Так как оптимизация действительно полезная, среди разработчиков возникла дискуссия, в которой предлагалось устранить проблему за счёт отключения по умолчанию блокирующего режима работы вызова getrandom() с добавлением опционального флага для ожидания энтропии, но подобное изменение повлияет на качество случайных чисел на начальном этапе загрузки.

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

  • Дисковая подсистема, ввод/вывод и файловые системы
    • Для файловой системы XFS реализована возможность многопоточного обхода inode (например, при проверке квот). Добавлены новые ioctl BULKSTAT и INUMBERS, предоставляющие доступ к возможностям, доступным в пятой редакции формата ФС, таким как время рождения inode и возможность задания параметров BULKSTAT и INUMBERS для каждой группы AG (Allocation Groups);
    • В Btrfs обеспечено определение быстрой реализации crc32c на всех архитектурах;
    • В Ext4 добавлена поддержка пустот в каталогах (не привязанных блоков). Обеспечена обработка флага «i» (immutable) для открытых файлов (запрет записи в ситуации когда флаг был установлен в тот момент, когда файл уже был открыт);
    • В 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 добавлен режим «путешествия во времени», позволяющий замедлить время для упрощения отладки связанного со временем кода;
    • Добавлены новые опции командной строки ядра «init_on_alloc» и «init_on_free», при указании которых включается обнуление выделяемых и освобождаемых областей памяти (заполнение нулями), что позволяет усилить безопасность за счёт дополнительных накладных расходов на инициализацию;
    • Добавлен новый драйвер virtio-iommu с реализацией паравиртализированного устойства, позволяет отправлять IOMMU-запросы, такие как ATTACH, DETACH, MAP и UNMAP, поверх транспорта virtio без эмуляции таблиц страниц памяти;
    • Добавлен новый драйвер virtio-pmem, представляющий доступ к устройствам хранения, отражённым в физическое адресное пространство, таким как NVDIMM;
    • Реализована возможность прикрепления криптографических ключей к пользовательскому или сетевому пространству имён (ключи становятся недоступны за пределами выбранного пространства имён), а также защиты ключей при помощи ACL;
  • Сетевая подсистема
    • Обеспечена обработка адресов IPv4 в диапазоне 0.0.0.0/8, который ранее был недоступен для использования. Введение данной подсети позволит распределить ещё 16 млн адресов IPv4;
    • В Netfilter добавлена поддержка механизмов аппаратного ускорения фильтрации пакетов;
    • Добавлена возможность прикрепления BPF-программ к системным вызовам setsockopt() и getsockopt(), что, например, позволяет прикрепить свои обработчики доступа к этим вызовам. Кроме того, добавлена новая точка вызова (hook), при помощи которой можно организовать вызов BPF-программы один раз за каждый интервал RTT (round-trip-time, время пинга);
  • Память и системные сервисы
    • Продолжено развитие функциональности ‘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-приложений добавлена возможность обработки программ с циклами, если выполнение цикла ограничено и не может привести к превышению лимита на максимальное число инструкций;
  • Оборудование
    • В драйвер amdgpu добавлена начальная поддержка GPU AMD NAVI (RX5700), которая включает базовый драйвер, код для взаимодействия с экранами (DCN2), поддержку GFX и вычислений (GFX10), SDMA 5 (System DMA0), средства управления питанием и мультимедийные кодировщики/декодировщики (VCN2);
    • Добавлена поддержка x86-совместимых процессоров компании Zhaoxin, развиваемых в результате совместного проекта VIA Technologies и муниципалитета Шанхая. Семейство CPU ZX построено на базе архитектуры x86-64 Isaiah, продолжающей развитие технологий VIA Centaur;
    • В ядро приняты изменения с добавлением дополнительной защиты ioctl-вызовов, связанных с драйвером floppy, а сам драйвер помечен как оставленный без сопровождения («orphaned»), что подразумевает прекращение его тестирования. Драйвер пока сохраняется в ядре, но его корректная работа не гарантируется. Драйвер рассматривается как устаревший, так как для его тестирования трудно найти работающее оборудование — все актуальные внешние накопители, как правило, используют интерфейс USB.
    • Добавлена поддержка новых 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.3Linux-libre 5.3-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске включена отключена загрузка блобов в драйверах qcom, hdcp drm, allegro-dvt и meson-vdec. Обновлён код чистки блобов в драйверах и подсистемах amdgpu, i915, netx, r8169, brcmfmac, rtl8188eu, adreno, si2157, pvrusb2, touchscreen_dmi, звуковом драйвере ддя skylake, а также в документации к микрокоду.

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