После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.1. Среди наиболее заметных изменений: новый интерфейс для асинхронного ввода/вывода io_uring, возможность использования NVDIMM в качестве ОЗУ, поддержка в Nouveau разделяемой виртуальной памяти, поддержка масштабируемого мониторинга очень больших ФС через fanotify, возможность настройки уровней сжатия Zstd в Btrfs, новый обработчик cpuidle TEO, реализация системных вызовов для решения проблемы 2038 года, возможность загрузки с устройств device-mapper без initramfs, LSM-модуль SafeSetID, поддержка комбинированных live-патчей.

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

  • Дисковая подсистема, ввод/вывод и файловые системы
    • Реализован новый интерфейс для асинхронного ввода/вывода — io_uring, который примечателен поддержкой поллинга ввода/вывода и возможностью работы как с буферизацией, так и без буферизации. Напомним, что предлагаемый ранее механизм асинхронного ввода/вывода «aio» не поддерживал буферизированный ввод/вывод, мог работать только в режиме O_DIRECT (без буферизации и в обход кэша), имел проблемы с возникновением блокировок из-за ожидания доступности метаданных и демонстрировал большие накладные расходы из-за копирования данных в памяти.

      В рамках API
      io_uring разработчики попытались устранить недостатки старого интерфейса aio. По производительности io_uring очень близок к SPDK и существенно опережает libaio при работе с включенным поллингом. Для использования io_uring в конечных приложениях, работающих в пространстве пользователя, подготовлена библиотека liburing, предоставляющая высокоуровневую обвязку над интерфейсом ядра;

    • В механизм отслеживания событий в ФС fanotify() добавлена поддержка отслеживания ситуаций изменения суперблока и структуры dirent (события создания, удаления и перемещения каталогов). Представленные возможности помогают решить проблемы с масштабируемостью, возникающие при создании рекурсивных отслеживаний изменений в очень больших ФС при помощи механизма inotify (изменения dirent ранее можно было отследить только через inotify, но
      эффективность в условиях рекурсивного отслеживания больших вложенных каталогов оставляла желать лучшего). Теперь подобный мониторинг можно эффективно производить через fanotify;

    • В файловой системе Btrfs добавлена возможность настройки уровня сжатия для алгоритма zstd, который может рассматриваться как оптимальный компромисс, между быстрым но неэффективным lz4 и медленным но хорошо сжимающим xz. По аналогии с тем как раньше можно было устанавливать уровень сжатия при применении zlib для zstd добавлена поддержка опции монтирования «-o compress=zstd:level». При тестировании минимальный первый уровень обеспечил сжатие данных в 2.658 раз при скорости сжатия 438.47 MB/s, скорости распаковки 910.51 MB/s и потреблении памяти 780 MB, а максимальный 15 уровень — в 3.126 раз, но при скорости сжатия в 37.30 MB/s, распаковки 878.84 MB/s и потреблении памяти 2547 MB.

      Из других улучшений в Btrfs можно отметить добавление отложенного выполнения операций сканирования поддерева для снижения нагрузки и реализацию нового ioctl для управления отключением устройств;

    • Добавлена возможность загрузки с файловой системы, размещённой на устройстве device-mapper, без применения initramfs. Начиная с текущего выпуска ядра устройства device-mapper можно напрямую использовать в процессе загрузки, например, как раздел с корневой ФС. Настройка раздела осуществляется при помощи загрузочного параметра «dm-mod.create». Среди разрешённых для загрузки модулей device-mapper: «crypt», «delay», «linear», «snapshot-origin» и «verity»;
    • В ориентированную на Flash-накопители файловую систему F2FS добавлен флаг F2FS_NOCOW_FL (checkpoint=disable), позволяющий отключить режим copy-on-write для заданного файла;
    • Из ядра удалена файловая система Exofs, представляющая собой вариант ext2, адаптированный для работы с хранилищами объектов OSD (Object-based Storage Device). Также удалена поддержка SCSI-протокола для подобных устройств хранения объектов;
    • В XFS реализован режим always_cow, при котором вместо замены данных в блоках по месту применяется модель COW (для изменений создаётся копия блока). Для включения режима можно использовать команду «echo 1 > /sys/fs/xfs/debug/always_cow»;
    • В CIFS обеспечено кэширование данных FILE_ALL_INFORMATION, что позволяет выполнять вызовы подобные «stat /mountpoint» на основе данных в кэше без обращения к серверу по сети. Добавлена возможность отправки запросов SMB3 FSCTL к серверу из утилит в пространстве пользователя, например, из smbinfo;
    • В EXT4 добавлен новый атрибут, доступный через sysfs (/sys/fs/ext4/{disk}/journal_task). Атрибут может оказаться полезным для перемещения потока обработки журнала в cgroup или его трассировки при помощи ftrace, perf или blktrace;
    • В EXT2 добавлена поддержка системного вызова statx c реализацией более эффективного и функционального варианта stat(), возвращающего расширенную информацию о файле, включая время создания файла и специфичные для файловых систем флаги;
    • Внесены исправления, нацеленные на увеличение масштабируемости и производительности файловых систем, работающих через механизм FUSE;
  • Виртуализация и безопасность
    • В prctl() добавлена опция PR_SPEC_DISABLE_NOEXEC для управления спекулятивным выполнением инструкций для выбранного процесса. Новая опция позволяет выборочно управлять защитой от спекулятивного выполнения для процессов, которые потенциально могут быть атакованы при помощи атаки типа Spectre. В случае активации опции при запуске нового процесса выполняется очистка бита SSBD в структуре задач;
    • Реализован LSM-модуль SafeSetID, позволяющий системным сервисам безопасно управлять пользователями без повышения привилегий (CAP_SETUID) и без получения полномочий пользователя root. Назначение привилегий осуществляется через определение в securityfs правил на основе белого списка допустимых привязок (в форме «UID1:UID2»);
    • Добавлены низкоуровневые изменения, необходимые для стековой организации загрузки модулей безопасности (возможность загрузки одного LSM-модуля поверх другого). Представлен параметр загрузки ядра «lsm», позволяющий управлять тем, какие модули загружаются и в каком порядке;
    • В подсистему аудита добавлена поддержка пространств имён файлов;
    • Расширены возможности GCC-плагина structleak, позволяющего блокировать потенциальные утечки содержимого памяти Обеспечена инициализация любых переменных, которые используются в коде через обращение по ссылке в стеке;
  • Сетевая подсистема
    • Для сокетов реализована новая опция «SO_BINDTOIFINDEX», похожая на
      «SO_BINDTODEVICE», но принимающая в качестве аргумента индексный номер сетевого интерфейса вместо имени интерфейса. Для IPv6 добавлена опция сокетов IPV6_ROUTER_ALERT_ISOLATE, позволяющая ограничить приём анонсов ротеров (RA) только собственным пространством имён сокета;

    • В стек mac80211 добавлена возможность назначения одному устройству нескольких BSSID (MAC-адресов). В рамках проекта по оптимизации производительности WiFi в стек mac80211 добавлен учёт распределения эфирного времени и возможность распределять эфирное время между несколькими станциями (при работе в режиме точки доступа выделение меньшего времени на передачу медленным беспроводным станциям, вместо равномерного распределения времени между всеми станциями);
    • В модуль cfg80211/nl80211 при работе в режиме точки доступа добавлена возможность выноса обработчика аутентификации в пространство пользователя (Authentication offload);
    • Добавлен механизм «devlink health», предоставляющий уведомления при возникновении проблем с сетевым интерфейсом. Кроме того, в devlink реализован API для получения информации об устройстве и добавлена команда «flash update» для обновления прошивок сетевого адаптера;
    • Для сетевых мостов добавлена поддержка протокола MLD (Multicast Router Discovery, RFC4286);
    • Обеспечена возможность применения режима TCP Fast Open вместе с операциями zerocopy (отправка сообщений в sendmsg с флагом MSG_ZEROCOPY);
    • Добавлен интерфейс для диагностики сокетов AF_XDP;
    • Во встроенную реализацию протокола TLS добавлена поддержка TLS 1.3, помимо ранее поддерживаемого TLS 1.2;
  • Память и системные сервисы
    • Реализована безопасная доставка сигналов, учитывающая возможность повторного использования PID. Например, при выполнении вызова kill ранее могла возникнуть ситуация, когда сразу после отправки сигнала целевой PID мог быть освобождён из-за завершения работы процесса и занят другим процессом, и в итоге сигнал передавался другому процессу. Для исключения подобных ситуаций добавлен новый системный вызов pidfd_send_signal, который использует файловые дескрипторы из /proc/pid для обеспечения стабильной привязки к процессу. Даже если PID будет повторно задействован во время обработки системного вызова, файловый дескриптор не изменится и его можно безопасно использовать для отправки сигнала процессу;
    • Добавлена возможность использования устройств постоянной памяти (persistent-memory, например NVDIMM) в качестве ОЗУ. До сих пор в ядре подобные устройства поддерживались в качестве устройств хранения, но теперь их можно также применять как дополнительную оперативную память. Возможность реализована в ответ на пожелания пользователей, готовых мириться с отставанием производительности и желающих использовать штатный API управления памятью ядра Linux вместо применения имеющихся систем распределения памяти в пространстве пользователя, работающих поверх mmap для dax-файла;
    • Добавлен новый обработчик простоя CPU (cpuidle, решает когда можно перевести CPU в глубокие режимы экономии энергии, чем глубже режим — тем большая экономия, но и больше времени требуется для выхода из режима) — TEO (Timer Events Oriented Governor). До сих пор предлагалось два обработчика cpuidle — «menu» и «ladder», отличающиеся эвристикой. В обработчике «menu» имеются известные проблемы с принятием эвристических решений, для устранения которых было решено подготовить новый обработчик. TEO позиционируется как альтернатива обработчику «menu», позволяющая добиться более высокой производительности с сохранением того же уровня энергопотребления.
      Активировать новый обработчик можно при помощи загрузочного параметра «cpuidle.governor=teo»;

    • В рамках работы по устранению проблемы 2038 года, вызванной переполнением 32-разрядного типа time_t, в состав включены системные вызовы, предлагающие для 32-разрядных архитектур 64-разрядные счётчики времени . В итоге, 64-разрядную структуру time_t теперь можно применять на всех архитектурах. Аналогичные изменения также реализованы в сетевой подсистеме для опций timestamp сетевых сокетов;
    • В систему горячего наложения патчей на ядро (live patching) добавлена возможность «Atomic Replace» для атомарного применения серии изменений к одной функции. Указанная возможность позволяет распространять сводные патчи, охватывающие сразу несколько изменений, вместо достаточно сложного для сопровождения процесса поэтапного наложения live-патчей в строго определённом порядке. Если раньше каждое следующее изменение должно было отталкиваться от состояния функции после прошлого изменения, то теперь возможно распространение сразу нескольких изменений, привязанных к одному исходному состоянию (т.е. сопровождающие могут поддерживать один сводный патч относительно базового ядра вместо цепочки из зависящих друг от друга патчей);
    • Объявлена устаревшей поддержка формата исполняемых файлов a.out и
      удалён код для формирования core-файлов в формате a.out, который находится в заброшенном состоянии. Формат a.out давно не применяется на системах с Linux, а генерация файлов a.out уже давно не поддерживается современными инструментальными средствами в конфигурациях для Linux по умолчанию. Кроме того, загрузчик для a.out файлов может быть реализован целиком в пространстве пользователя;

    • В механизм верификации BPF-программ добавлена возможность определения и удаления неиспользуемого кода. Включены патчи с поддержкой spinlock для подсистемы BPF, предоставляющие дополнительные возможности по управлению паралелльным выполнением BPF-программ. Добавлена возможность добавления через BPF-программы дополнительных заголовков в инкапсулированные пакеты IP (IP/GRE, GUE, IPIP). В eBPF реализована новая инструкция jmp32 и поддержка типа «__int128». В утилиту bpftool добавлена команда для вывода списка параметров eBPF.
      На базе BPF реализован фреймворк Host Bandwidth Manager, позволяющий ограничивать исходящую пропускную способность через cgroups. Добавлена документация по подсистеме BPF;

    • В команду «perf diff» добавлены новые опции-фильтры «—time», «—cpu», «—pid» и «—tid»;
    • Добавлена загрузочная опция «driver_async_probe» для указания списка драйверов, инициализация которых будет проводится в асинхронном режиме (позволяет ускорить процесс загрузки ядра);
    • Убрано устаревшее поведение OOM killer, в соответствии с которым предпочтение при принудительном завершении отдавалось дочерним процессам наиболее агрессивного процесса, а не самому агрессивному процессу;
    • Добавлен sysctl kernel/sched_energy_aware для отключения планирования задач с учётом оптимизации энергопотребления (по умолчанию подобный режим отключен для большинства платформ);
  • Оборудование
    • В драйвер Nouveau добавлена поддержка гетерогенного управления памятью, обеспечивающего возможность обращения CPU и GPU к общим синхронизированным областям памяти. Система разделяемой виртуальной памяти (SVM, shared virtual memory) реализована на базе подсистемы HMM (Heterogeneous memory management), позволяющей использовать устройства с собственными блоками управления памятью (MMU, memory management unit), которые могут получать доступ к основной памяти. В том числе при помощи HMM можно организовать совместное адресное пространство между GPU и CPU, в котором GPU может получить доступ к основной памяти процесса. Поддержка SVM пока включена только для GPU семейства Pascal, хотя поддержка обеспечена и для GPU Volta и Turing. Кроме того, в Nouveau добавлен новый ioctl для управления миграцией областей памяти процессов в память GPU;
    • В DRM-драйвере Intel для GPU Skylake и новее (gen9+) включён по умолчанию режим fastboot, исключающий лишние смены режимов во время загрузки. Добавлены новые идентификаторы устройств на базе микроархитектур Coffelake и Ice Lake. Для чипов Coffelake добавлена поддержка GVT (виртуализация GPU). Для виртуальных GPU реализована поддержка VFIO EDID. Для LCD панелей MIPI/DSI добавлена поддержка элементов ACPI/PMIC. Реализованы новые TV-режимы 1080p30/50/60 TV;
    • В драйвер amdgpu добавлена поддержка GPU Vega10/20 BACO. Реализованы средства управления питанием Vega 10/20 и таблицы управления кулером Vega 10. Добавлены новые PCI-идентификаторы устройств для GPU Picasso. Добавлен интерфейс управления планируемыми зависимостями для исключения взаимных блокировок;
    • Добавлен DRM/KMS-драйвер для ускорителей экранных операций ARM Komeda (Mali D71);
    • Добавлена поддержка экранных панелей Toppoly TPG110, Sitronix ST7701, PDA 91-00156-A0, LeMaker BL035-RGB-002 3.5 и Kingdisplay kd097d04;
    • Добавлена поддержка звуковых кодеков Rockchip RK3328, Cirrus Logic CS4341 и CS35L36, MediaTek MT6358, Qualcomm WCD9335 и Ingenic JZ4725B, а также звуковой платформы Mediatek MT8183;
    • Добавлена поддержка NAND-контроллеров Flash STMicroelectronics FMC2, Amlogic Meson;
    • Добавлена поддержка Habana Goya, ускорителей операций для нейронных сетей;
    • Добавлена поддержка гигабитных Ethernet-контроллеров NXP ENETC и беспроводных интерфейсов MediaTek MT7603E (PCIe) и MT76x8;
    • Добавлена поддержка новых ARM SoC: Socionext SC2000 (Milbeaut), Bitmain BM1880, Renesas RZ/A2M (R7S9210), Renesas RZ/G2E (r8a774c0), NXP i.MX8QuadXPlus, Mediatek MT7629;
    • Добавлена поддержка новых ARM плат и платформ: NVIDIA Shield TV (Darcy) на базе Tegra210, Bosch Guardian, Winterland IceBoard, Inspur on5263m5, Zodiac Digital Tapping Unit, Phicomm K3, X96 Max, FriendlyElec NanoPC-T4, NanoPi M4, Radxa ROCK Pi 4, Logic PD i.MX6QD, Y Soft IOTA Draco/Hydra/Ursa, Phytec phyCORE i.MX6 UltraLite, MYIR Tech MYD-LPC4357, Chameleon96, Oxalis Evalkit V100, Elgin RV1108 R, Si-Linux CAT874, Si-Linux EK874, Raspberry Pi Model 3 A+,

Одновременно Латиноамериканский Фонд свободного ПО сформировал
вариант полностью свободного ядра 5.1 — Linux-libre 5.1-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске отключена загрузка блобов в драйверах mt7603 и goya. Обновлён код чистки блобов в драйверах и подсистемах wilc1000, iwlwifi, soc-acpi-intel, brcmfmac, mwifiex, btmrvl, btmtk и touchscreen_dmi. Прекращена чистка блобов в загрузчике прошивок lantiq xrx200 из-за его удаления из ядра.