Релиз ядра Linux 4.20

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

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

  • Сетевая подсистема
    • TCP-стек переведён на использование модели, определяющей наиболее раннее время отправления каждого пакета при распределении исходящего трафика. Реализованная модель пытается решить проблемы с масштабированием через использование вместо очередей исходящих пакетов закольцованной структуры на основе таймера, определяющего самое раннее время, в которое каждый пакет может быть отправлен. Подобная структура позволяет увеличить эффективность распределения отправляемых пакетов и более точно вычислять время приёма-передачи (RTT, round-trip time) при формировании потока;
    • Добавлена возможность загрузки в виде BPF-программ обработчиков, осуществляющих разбор заголовков пакетов в сетевом потоке (network flow dissectors), что позволяет добиться более высокой производительности и защищённости по сравнению c ранее предлагаемой реализацией на языке Си;
    • Реализован новый планировщик трафика «taprio», позволяющий управлять отправкой пакетов в соответствии с предварительно сгенерированным временным рядом. Метод планирования определён в спецификации IEEE 802.1Qbv, учитывает требования к передаче трафика, чувствительного ко времени доставки пакетов (например, видео и звуковые потоки) и использует разные временные интервалы для различных классов трафика;
    • Для протокола rtnetlink реализован режим строгой проверки («rigid checking»), дающий возможность убедиться, что в пространство пользователя передаётся актуальная информация, соответствующая поступившему запросу;
  • Дисковая подсистема, ввод/вывод и файловые системы
    • Большая часть драйверов блочных устройств переведена на новый API blk-mq (multiqueue), поддерживающий разделение очередей для блочных устройств. Поддержку старого API планируют прекратить в следующем выпуске ядра. Некоторые драйверы также переведена на базовый DMA mapping API;
    • К коду Btrfs применена серия патчей с оптимизациями производительности, позволивших увеличить скорость обработки файлов в тесте fsmark, увеличить производительность многопоточных операций (улучшились показатели тестов filebench и dbench), сократить число переключений контекста и повысить эффективность размещения данных в памяти. Ускорено переключение между режимами блочного доступа и доступа к накопителям с вращающимися дисками. Ускорены операции балансировки с использованием qgroups;
    • Изменения в Ext4 и XFS в основном были сосредоточены на исправлении ошибок и внесении мелких оптимизаций. В Ext4 добавлен новый механизм ожидающего резервирования блоков (pending reservation);
    • Реализованы две новые команды ioctl () для работы с зонированными блочными устройствами: BLKGETZONESZ для получения размера зоны и BLKGETNRZONES для получения числа зон. Для нормальных блочных устройств (без зонирования) обе команды выдают на выходе ноль;
    • В системный вызов fanotify_mark () добавлен новый тип маркеров — FAN_MARK_FILESYSTEM, который может использоваться для отслеживания всех событий с файловой системой;
    • В реализацию NFS 4.2 добавлена поддержка протокола асинхронного копирования данных на стороне сервера;
    • В файловую систему UBIFS добавлена поддержка аутентифицированного доступа ко всем файлами и метаданным для защиты от атак, проводимых через модификацию структур данных или файлов на носителе;
  • Виртуализация и безопасность
    • Для архитектуры arm64 предоставлена возможность использование PSTATE-бита SSBS (Speculative Store Bypass Safe), предоставляемого процессорами на базе обновлённой архитектуры ARMv8.5-A, для защиты от атак с использованием уязвимости Spectre 4;
    • Для более надёжной защиты от атак Spectre 2 при переключении между несвязанными процессами реализовано более агрессивное использование MSR-команды IBPB (Indirect Branch Prediction Barriers);
    • Из ядра удалена поддержка блочного шифра Speck, разработанного Агентством национальной безопасности США, но, в конечном счёте, отклонённого комитетом ISO для стандартизации из-за опасения в подстановке скрытых уязвимостей;
    • Добавлены API и простая утилита для вывода статистики об использовании криптографической подсистемы ядра;
    • Добавлена поддержка GCC-плагина stackleak, обеспечивающего инициализацию всех хранимых в стеке переменных для предотвращения утечки информации из ядра через неинициализированные переменные, которые могут содержать остатки ранее сохранённых в стеке данных;
  • Память и системные сервисы
    • Значительно переработана обработка сигналов в ядре, что в результате позволило простить код и повысить надёжность выполнения обработчиков. Модернизация привела к небольшому изменению размера структуры, доступной из пространства пользователя, но разработчики не выявили каких-либо программ, на которые могло бы повлиять внесённое изменение;
    • Для архитектуры RISC-V реализована поддержка системного вызова futex () для ожидания изменения значения по заданному адресу в памяти;
    • Добавлена поддержка двух новых типов BPF-отображений (map) — queue и stack, которые можно использовать для реализации очередей и стеков;
    • На системах с асимметричными CPU (например, big.LITTLE) планировщик задач теперь может определять «обделённые» процессы, которые нуждаются в ресурсах быстрого CPU, но которые оказались прикреплёнными к медленному CPU. После выполнения операции балансировки нагрузки планировщик попытается переместить подобные процессы на более подходящий CPU;
    • Переработана реализация механизма синхронизации RCU (Read-copy-update) и удалены многие разновидности RCU. Оставлены только две основные разновидности RCU, одна из которых адаптирована для задач реального времени (preemptible), а другая для обычного применения;
    • В подсистему PCI добавлена поддержка прямого доступа к содержимому памяти (P2P DMA) из одного периферийного устройства в другое, минуя использование системной памяти;
    • Для архитектуры MIPS обеспечена поддержка механизма kexec, позволяющего загрузить новый экземпляр ядра из уже работающего ядра Linux;
    • Добавлена поддержка процессорной архитектуры C-SKY, развиваемой одноимённой китайской компанией для использования в SoC для различных потребительских устройств;
    • В мультимедийную подсистему V4L2 добавлен экспериментальный «request API» для управления захватом данных с камер на уровне отдельных кадров;
    • Добавлена поддержка новой структуры данных XArray, полученной в результате модернизации структуры базисного дерева (Radix tree). На использование XArray переведён страничный кэш ядра;
  • Оборудование
    • Драйверы 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;

© OpenNet