После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 4.20. Среди наиболее заметных изменений в ядре 4.20: поддержка процессорной архитектуры C-SKY, планировщик трафика taprio, подсистема PSI (Pressure Stall Information), P2P DMA для PCI, рефакторинг кода обработки сигналов, подключение диссекторов сетевого потока (разбор трафика) через BPF, перевод страничного кэша на новую структуру XArray, объединение драйверов amdgpu и amdkfd, увеличение производительности подсистемы FUSE, возможность фильтрации сетевых пакетов на основе меток secmark, включение вложенной виртуализации для KVM.

В новую версию принято 14997 исправлений от 1857 разработчиков,
размер патча — 49 Мб (изменения затронули 11402 файлов, добавлено 686104 строк кода, удалено 318945 строк). Около 47% всех представленных в 4.20 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 14% связано с сетевым стеком, 3% — файловыми системами и 4% c внутренними подсистемами ядра.

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

  • Сетевая подсистема
    • TCP-стек переведён на использование модели, определяющей
      наиболее раннее время отправления каждого пакета при распределении исходящего трафика. Реализованная модель пытается решить проблемы с масштабированием через использование вместо очередей исходящих пакетов закольцованной структуры на основе таймера, определяющего самое раннее время, в которое каждый пакет может быть отправлен. Подобная структура позволяет увеличить эффективность распределения отправляемых пакетов и более точно вычислять время приёма-передачи (RTT, round-trip time) при формировании потока;

    • Добавлена возможность загрузки в виде BPF-программ обработчиков, осуществляющих разбор заголовков пакетов в сетевом потоке (network flow dissectors), что позволяет добиться более высокой производительности и защищённости по сравнению c ранее предлагаемой реализацией на языке Си;
    • Реализован новый планировщик трафика «taprio», позволяющий управлять отправкой пакетов в соответствии с предварительно сгенерированным временным рядом. Метод планирования определён в спецификации IEEE 802.1Qbv, учитывает требования к передаче трафика, чувствительного ко времени доставки пакетов (например, видео и звуковые потоки) и использует разные временные интервалы для различных классов трафика;
    • Для протокола rtnetlink реализован режим строгой проверки («rigid checking»), дающий возможность убедиться, что в пространство пользователя передаётся актуальная информация, соответствующая поступившему запросу;
    • Добавлена возможность фильтрации дампов с информацией о маршрутизации по используемым протоколам (например, для разделения маршрутов от разных демонов маршрутизации), типам маршрута (например, для выделения unicast), идентификатору таблицы маршрутизации и ближайшему шлюзу (nexthop). Подобные фильтры уже достаточно давно поддерживаются в iproute2, но выполнялись в пространстве пользователя. Перенос фильтров в пространство ядра позволяет повысить эффективность работы крупных систем маршрутизации на базе Linux;
    • Начальный размер принимающего буфера для TCP увеличен с 87KB до 128KB, а начальный размер окна приёма пакетов с 29KB (20 MSS) до 64KB;
    • В реализацию сетевых мостов (подсистема bridge) добавлена возможность просмотра статистики по VLAN в разрезе отдельных портов;
    • В беспроводной стек ieee80211 добавлена поддержка 5 и 6 каналов для диапазона 60GHz, а также предоставлена возможность включения функциональности FTM Responder из пространства пользователя;
    • Для сетевых сокетов реализована опция PACKET_IGNORE_OUTGOING для игнорирования попыток отправки через данный сокет исходящих пакетов;
    • В подсистему AF_XDP (eXpress Data Path), позволяющую запускать BPF-программы на уровне сетевого драйвера, добавлена поддержка технологии
      Zero-copy для обработки сетевых пакетов без их копирования в основную память;

  • Дисковая подсистема, ввод/вывод и файловые системы
    • Большая часть драйверов блочных устройств переведена на новый API blk-mq (multiqueue), поддерживающий разделение очередей для блочных устройств. Поддержку старого API планируют прекратить в следующем выпуске ядра. Некоторые драйверы также переведены на базовый DMA mapping API;
    • К коду Btrfs применена серия патчей с оптимизациями производительности, позволившими увеличить скорость обработки файлов в тесте fsmark, ускорить производительность многопоточных операций (улучшились показатели тестов filebench и dbench), сократить число переключений контекста и повысить эффективность размещения данных в памяти. Ускорено переключение между режимами блочного доступа и доступа к накопителям с вращающимися дисками. Ускорены операции балансировки с использованием qgroups;
    • Изменения в Ext4 и XFS в основном были сосредоточены на исправлении ошибок и внесении мелких оптимизаций. В Ext4 добавлен новый механизм ожидающего резервирования блоков (pending reservation);
    • В ФС F2FS добавлена поддержка проверки целостности суперблока по контрольной сумме, реализована опция монтирования для включения и выключения режима фиксации атомарных изменений в ФС (checkpoint=disable/enable), переработана реализация квот;
    • Реализованы две новые команды ioctl() для работы с зонированными блочными устройствами: BLKGETZONESZ для получения размера зоны и
      BLKGETNRZONES для получения числа зон. Для нормальных блочных устройств (без зонирования) обе команды выдают на выходе ноль;

    • В системный вызов fanotify_mark() добавлен новый тип маркеров — FAN_MARK_FILESYSTEM, который может использоваться для отслеживания всех событий с файловой системой;
    • В реализацию NFS 4.2 добавлена поддержка протокола асинхронного копирования данных на стороне сервера;
    • В подсистеме MD улучшена поддержка программных RAID 10, в том числе устранены ранее наблюдаемые утечки памяти и зависания;
    • Увеличена производительности протокола SMB3 в реализации CIFS;
    • В файловую систему UBIFS добавлена поддержка аутентифицированного доступа ко всем файлами и метаданным для защиты от атак, проводимых через модификацию структур данных или файлов на носителе;
    • Проведена работа по увеличению производительности подсистемы FUSE, позволяющей создавать реализации файловых систем, работающие в пространстве пользователя. В частности, обеспечено кэширование операций readdir и readlink, максимальный размер блока ввода/вывода увеличен с 128 Кб до 1 Мб, увеличена производительность и масштабируемость очередей запросов. Добавлена поддержка операции copy_file_range, позволяющей ускорить копирование данных из одного файла в другой, благодаря выполнению операции только на стороне ядра без предварительного чтения данных в память процесса;
  • Виртуализация и безопасность
    • Для архитектуры arm64 предоставлена возможность использования PSTATE-бита SSBS (Speculative Store Bypass Safe), предоставляемого процессорами на базе обновлённой архитектуры ARMv8.5-A, для защиты от атак с использованием уязвимости Spectre 4;
    • Для более надёжной защиты от атак Spectre 2 реализовано более агрессивное использование MSR-команды IBPB (Indirect Branch Prediction Barriers) при переключении между несвязанными процессами. Проблемы с проседанием производительности при включении защиты от Spectre 2 решены путём отключения по умолчанию более надёжного, но и сильнее влияющего на производительность, механизма защиты, а также предоставления возможности включения защиты на уровне отдельных приложений;
    • Из ядра удалена поддержка блочного шифра Speck, разработанного Агентством национальной безопасности США, но, в конечном счёте, отклонённого комитетом ISO для стандартизации из-за опасения в подстановке скрытых уязвимостей;
    • Добавлены API и простая утилита для вывода статистики об использовании криптографической подсистемы ядра;
    • Добавлена поддержка GCC-плагина stackleak, обеспечивающего инициализацию всех хранимых в стеке переменных для предотвращения утечки информации из ядра через неинициализированные переменные, которые могут содержать остатки ранее сохранённых в стеке данных;
    • Началась реализация инфраструктуры для отладки фреймворка LSM (Linux Security Modules). Добавлен загрузочный параметр lsm.debug для включения отладочного вывода для LSM;
    • В гипервизоре KVM для архитектуры x86 включена по умолчанию поддержка вложенной виртуализации (в гостевой системе на базе KVM может быть запущена другая гостевая система);
    • В Apparmor добавлена возможность фильтрации сетевых пакетов на основе меток и правил secmark. В nf_tables добавлена возможность определения контекста безопасности пакета через привязку меток secmark;
    • В nf_tables добавлена поддержка выражений xfrm для извлечения
      исходного и целевого адресов для трафика в туннеле, идентификатора запроса и SPI;

    • Во встроенной реализации TLS появилась поддержка шифрования записей в асинхронном режиме для обеспечения более высокой производительности;
  • Память и системные сервисы
    • Значительно переработана обработка сигналов в ядре, что в результате позволило упростить код и повысить надёжность выполнения обработчиков. Модернизация привела к небольшому изменению размера структуры, доступной из пространства пользователя, но разработчики не выявили каких-либо программ, на которые могло бы повлиять внесённое изменение;
    • В состав ядра добавлена подсистема PSI (Pressure Stall Information), разработанная компанией Facebook в рамках проекта по созданию обработчика нехватки памяти в системе (OOM, Out Of Memory), вынесенного в пространство пользователя. PSI позволяет проанализировать информацию о времени ожидания получения различных ресурсов (CPU, память, ввод/вывод) для определённых задач или наборов процессов в cgroup. При помощи PSI обработчики в пространстве пользователя могут более точно оценить уровень загруженности системы и характер замедления работы, по сравнению с Load Average;
    • В подсистему PCI добавлена поддержка прямого доступа к содержимому памяти (P2P DMA) из одного периферийного устройства в другое, минуя использование CPU и системной памяти. Например, P2P DMA можно использовать для прямой отправки данных между NVMe SSD и сетевым адаптером при обработке RDMA-запросов;
    • Добавлена поддержка новой структуры данных XArray, полученной в результате модернизации структуры базисного дерева (Radix tree). На использование XArray переведён страничный кэш ядра;
    • Реализовано новое псевдо-устройство «udmabuf», позволяющее коду в пространстве пользователя сконвертировать регион memfd в структуру dma-buf (необходимо для QEMU). API dma-buf позволяет организовать совместное использования буферов драйверами и различными подсистемами (V4L2, DRI и т.п.). Механизм memfd позволяет идентифицировать область памяти через файловый дескриптор, который может передаваться между процессами;
    • Расширен синтаксис для доступа к внешним данным из kprobes и теперь позволяет обращаться к массивам и аргументам функций;
    • Код ядра избавлен от использования массивов переменной длины (VLA), реализуемых GCC-расширением VLAiS (Variable Length Arrays) и предоставляющих возможность использования переменной в качестве размера при создании массива, например «void foo(int n){ int m[n];»).
      При сборке по умолчанию включена опция «-Wvla» для вывода предупреждений при использовании в коде VLA. С практической стороны, кроме повышения безопасности избавление от VLA является очередным шагом в сторону обеспечения сборки с использованием Clang;

    • Добавлена поддержка двух новых типов BPF-отображений (map) — queue и stack, которые можно использовать для реализации очередей и стеков;
    • На системах с асимметричными CPU (например, big.LITTLE) планировщик задач теперь может определять «обделённые» процессы, которые нуждаются в ресурсах быстрого CPU, но которые оказались прикреплёнными к медленному CPU. После выполнения операции балансировки нагрузки планировщик попытается переместить подобные процессы на более подходящий CPU;
    • Переработана реализация механизма синхронизации RCU (Read-copy-update) и удалены многие разновидности RCU. Оставлены только две основные разновидности RCU, одна из которых адаптирована для задач реального времени (preemptible), а другая для обычного применения;
    • Для архитектуры RISC-V реализована поддержка системного вызова futex() для ожидания изменения значения по заданному адресу в памяти;
    • Для архитектуры MIPS обеспечена поддержка механизма kexec, позволяющего загрузить новый экземпляр ядра из уже работающего ядра Linux;
    • В мультимедийную подсистему V4L2 добавлен экспериментальный «request API» для управления захватом данных с камер на уровне отдельных кадров;
  • Оборудование
    • Добавлена поддержка 32-разрядной процессорной архитектуры C-SKY, развиваемой одноимённой китайской компанией для создания SoC для различных потребительских устройств;
    • Реализована поддержка китайского процессора Hygon Dhyana, поддерживающего расширенную функциональность AMD (разработка основана на лицензированнной у AMD микроархитектуре AMD Zen). Процессоры позиционируются для применения в центрах обработки данных и вычислительных кластерах;
    • Драйверы amdgpu и amdkfd (для дискретных GPU, такие как Fiji, Tonga, Polaris) объединены в один модуль ядра. Обеспечена поддержка APU Picasso и Raven2, а также поддержка GPU Vega20 и идентификаторов новых карт на базе Vega 10. Добавлена поддержка экранов ABGR/XBGR, VCN-движка для обработки jpeg, xGMI, Ycbcr 4:2:0, устройств 3D-стереовывода (Stereo 3D), LVDS, режима CEC-Tunneling-over-AUX в DisplayPort. Для GPU Raven обеспечена возможность загрузки прошивок DMCU;
    • В DRM-драйвере Intel отключен Resource Streamer API (поддержка не была принята в Mesa и не принесла ожидаемого роста производительности). Улучшена поддержка чипов Icelake и расширена поддержка прошивок DMC. Для Ivybridge, Haswell и Valleyview реализована полная поддержка PPGTT (Per-process Graphics Translation Tables);
    • В драйвере Nouveau реализована начальная поддержка HDMI 2.0 и поддержка режима CEC-Tunneling-over-AUX для DisplayPort;
    • В драйвер virtio-gpu (виртуальный GPU, развиваемый в рамках проекта Virgil) добавлена поддержка IOMMU;
    • Добавлен драйвер IGC с поддержкой 2.5-гигабитных Ethernet-контроллеров Intel;
    • Добавлен новый драйвер для RAID-контроллеров Mylex DAC960, в котором реализована поддержка работы через новый SCSI-интерфейс;
    • Добавлена поддержка звуковой подсистемы чипа AMD Stoney Ridge, звукового кодека Realtek ALC300, звуковых карт Creative Sound Blaster ZxR и Sound BlasterX AE-5;
    • Добавлены драйверы для камер с сенсорами Sony imx319 и imx355;
    • Добавлена поддержка новых ARM SoC и плат, в том числе Raspberry Pi 3 Compute Module, Banana Pi R64, Orange Pi Zero Plus2, Orange Pi One Plus, Pine64 LTS, Banana Pi M2+ H, ROC-RK3399-PC, Rock960, RockPro64,
      Moxa UC-2101 и GTA04A5 на базе TI OMAP, Clearfog (Marvell Armada 8040), Stardragon4800 и TiogaPass на базе ARM11 AST2500, ConnectCore 6UL SBC Pro (NXP i.MX), Hi3670, HiKey 370, Amlogic Meson-G12A, Renesas r8a774a1, NVIDIA Toradex Colibri T20, Synaptics AS370, Qualcomm MSM8998 SoC;

Одновременно Латиноамериканский Фонд свободного ПО сформировал
вариант полностью свободного ядра 4.20 — Linux-libre 4.20-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске отключен запрос блобов в драйверах MT76x0E, Lantiq/Intel GSWIP и Microsemi PHY. Обновлён код чистки блобов в драйверах и подсистемах btrtl, AMD GPU, i915 CSR, PSP crypto, MT76x0U, MT76x2E, MT76x2U, qtnfmac, Qualcomm ADSP и Hexagon V5 Remoteproc, x86 touchscreen, hda ca0132, ath10k и iwlwifi.