После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 4.16. Среди наиболее заметных изменений: интеграция гипервизора Jailhouse, блокирование некоторых операций копирования данных между ядром и пространством пользователя,
учёт режимов энергосбережения CPU в планировщике deadline,
подготовка к прекращению поддержки IPX и NCPFS, поддержка механизма AMD Secure Encrypted Virtualization в KVM.

В новую версию принято около 13 тысяч исправлений от 1500 разработчиков, размер патча – 48 Мб (изменения затронули 11986 файлов, добавлено 508425 строк кода,
удалено 314376 строк). Около 49% всех представленных в 4.16
изменений связаны с драйверами устройств, примерно 19% изменений имеют
отношение к обновлению кода специфичного для аппаратных архитектур, 13%
связано с сетевым стеком, 4% – файловыми системами и 3% c внутренними
подсистемами ядра.

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

  • Виртуализация и безопасность
    • Обеспечена начальная поддержка гипервизора Jailhouse, развиваемого компанией Siemens и поддерживающего работу на системах x86_64 с расширениями VMX+EPT или AMD-V/SVM+NPT (поддержка ARMv7 и ARMv8, а также компоненты для корневого окружения, пока не приняты в основное ядро). Отличительными особенностями Jailhouse являются легковесная реализация и ориентация на привязку виртуальных машин к фиксированному CPU, области ОЗУ и аппаратным устройствам. Т.е. на одном физическом многопроцессорном сервере обеспечивается работа нескольких независимых виртуальных окружений, каждое из которых закреплено за своим процессорным ядром. Такой подход позволяет свести к минимуму накладные расходы от работы гипервизора и обеспечить гарантированный доступ к ресурсам и предсказуемую производительность, подходящие для виртуализации задач режима реального времени;
    • Добавлена реализация механизма защиты копирования данных между ядром и пространством пользователя, блокирующего использование вызова usercopy при проведении некоторых видов атак. Суть предложенного метода в запрете применения usercopy для прямого копирования между пространством пользователя и некоторыми областями ядра с введением белого списка допустимых для использования областей памяти. Так как подобный подход потенциально может нарушить работу приложений, использующих usercopy, предусмотрен fallback-режим (HARDENED_USERCOPY_FALLBACK или slab_common.usercopy_fallback). В настоящее время механизм активирован в режиме информирования, при котором в лог записываются предупреждения о проблемных операциях, без их фактического блокирования;
    • Продолжена реализация техник защиты от атак Meltdown и Spectre. Например, проведены оптимизации для снижения накладных расходов от PTI, добавлен код для обеспечения защиты от первого варианта атаки Spectre (CVE-2017-5753) и для блокирования атак Meltdown и Spectre на процессорах с архитектурой ARM64 и S390. Защита от Spectre v1 реализована через добавление макроса array_index_nospec(), предотвращающего выполнение спекулятивных операций, которые могут вызвать обход проверки границ массива. В код для защиты от Spectre v2 добавлена возможность использование MSR-команды IBPB (Indirect Branch Prediction Barriers), представленной в обновлении микрокода. Защита от Meltdown для ARM64 реализована через классический патч PTI, а от Spectre v2 через возможность выборочного отключения блока предсказания переходов. На системах S390 для блокирования Spectre задействован модифицированный вариант защиты retpoline (expoline) и макрос array_index_nospec();
    • В гипервизор KVM добавлена поддержка доступного в процессорах AMD механизма Secure Encrypted Virtualization (SEV), который предоставляет средства шифрования памяти для виртуальных машин. Суть метода защиты в интеграции в архитектуру виртуализации AMD-V возможности для прозрачного шифрования памяти виртуальных машин, при которой доступ к расшифрованным данным имеет только текущая гостевая система, а остальные виртуальные машины и даже гипервизор при попытке обращения к этой памяти получают зашифрованные данные;
    • В состав включены драйверы для ускорения работы гостевых систем под управлением VirtualBox: Vboxvideo для обеспечения доступа к GPU и Vboxguest с поддержкой средств для переноса данных между гостевой системой и хостом, а также с возможностью проброса команд OpenGL. Не перенесённым в основной состав пока остаётся только драйвер
      Vboxsf, предоставляющий функции проброса каталогов;

    • По умолчанию для архитектур x86/x86_64 и ARM64 включена опция CONFIG_STRICT_DEVMEM, ограничивающая доступ к /dev/mem из пространства пользователя. Без выключении данной опции root может получить доступ ко всем областям памяти ядра и приложений, а при включении доступ ограничивается только областями отражённой памяти периферийных устройств;
  • Дисковая подсистема, ввод/вывод и файловые системы
    • Подсистема MultiMediaCard, отвечающая за обработку таких устройств хранения, как SD-карты, переведена на многоуровневую систему очередей (multiqueue), позволяющую организовать многопоточный доступ к данным на многоядерных системах;
    • В планировщиках ввода/вывода обеспечена поддержка заблокированных зон на блочных устройствах, что позволяет исключить выполнение перегруппировки операций записи на зонированных устройствах, операции записи на которых должны выполняться последовательно;
    • В файловой системе XFS снят флаг экспериментальной разработки с механизма обратного маппинга (rmap, reverse-mapping), позволяющего файловой системе определить владельца любого блока на устройстве хранения. Reverse-mapping может быть использован как основа для реализации таких возможностей, как reflink(), режим copy-on-write для данных, дедупликация, расширенные средства информирования о bad-блоках и дополнительные средства восстановления повреждений;
    • В файловую систему CIFS добавлена поддержка режима SMB Direct, который позволяет использовать сетевые адаптеры с функцией удаленного доступа к памяти (RDMA) для увеличения скорости передачи SMB-пакетов;
    • В файловой системе Btrfs улучшен код перестроения повреждённых массивов RAID5/6 и реализована поддержка управления резервированием пустых областей через вызов fallocate() в режиме FALLOCATE_FL_ZERO_RANGE;
    • В NFS-клиенте изменён метод вызова statx() для исключения обращения к внешнему серверу, если необходимая информация доступна локально.
    • Добавлена поддержка экспорта Overlayfs через NFS;
    • В системный вызов pwritev2() добавлен флаг RWF_APPEND, при котором данные прикрепляются к хвосту файла, независимо от текущего смещения;
    • В AFS добавлена поддержка динамического создания точек монтирования;
    • Переработан код обновления поля i_version в inode, которое раньше инкрементировалось при каждом обновлении связанных с inode данных или метаданных, что не востребовано на практике (обычно осуществляется проверка времени изменения, а не версии inode). В новом выпуске сокращено число ситуаций, при которых выполняется обновление i_version, что позволило ускорить операции ввода/вывода небольшого размера. Например, при тестировании утилитой fio конфигурации с XFS поверх DAX и размером записываемого блока 4K пропускная способность чтения/записи увеличилась на 244%;
  • Память и системные сервисы
    • В планировщике задач deadline, реализующем алгоритм EDF (Earliest Deadline First), основанный на идее выбора задачи из очереди ожидающих процессов, наиболее близкой к истечению крайнего расчётного времени, добавлен учёт изменения частоты CPU и параметров вольтажа, что позволяет обеспечить его оптимальную работу без отключения функций энергосбережения;
    • В планировщике CFS (Fair) ограничена автоматическая миграция задач между ядрами CPU – в процессе выполнения прерывания задача теперь может быть перемещена на другое ядро только если новое и старое ядра используют общий кэш;
    • В виртуальную машину BPF (Berkeley Packet Filter) добавлена возможность определения и вызова функций в BPF-программах;
    • В системный вызов membarrier(), обеспечивающий установку барьеров на память для всех работающих в системе потоков, добавлена новая реализация режима MEMBARRIER_CMD_SHARED_EXPEDITED, позволяющего значительно ускорить выполнение вызова, ценой применения IPI (inter-processor interrupt). В новой реализации проведена работа по предоставлению возможности исключение процессов, для которых отсутствует необходимость в обработке барьеров. Кроме того, процесс теперь должен явно заявить о намерении участия в операциях с глобальными барьерами (MEMBARRIER_CMD_GLOBAL_EXPEDITED) при помощи вызова membarrier() с командой MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED;
    • Добавлена новая опция командой строи console_msg_format, которую можно использовать для определения формата в printk(), используемого при выводе записей в syslog;
    • Добавлена возможность партицирования L2-кэша CPU для процессоров Intel с поддержкой технологии RDT L2 CDP (Resource Director Technology L2 Code and Data Prioritization), позволяющей управлять размещение кода и данных в L2-кэше. Появление данного режима ожидается в будущих моделях процессоров Intel Atom;
    • Flex и Bison добавлены в число зависимостей, необходимых для сборки ядра;
  • Сетевая подсистема
    • Добавлено новое виртуальное устройство “netdevsim”, которое позволяет симулировать различные hardware-offload операции без наличия фактической их поддержки в оборудовании, что может использоваться для тестирования возможностей сетевого стека, связанных с привлечением механизмов аппаратного ускорения обработки пакетов. Например, netdevsim уже применяется для тестирования поддержки offload в BPF;
    • Реализация протоколов Netware IPX и NCPFS перемещена в промежуточную staging-ветку ядра и в одном из будущих выпусков будет удалена. Прекращение поддержки IPX и NCPFS обусловлено устаревшим кодом, отсутствием сопровождения и невостребованностью;
    • Заметно сокращён размер некоторых структур, используемых для хранения данных маршрутизации. Например, размер записи в структурах rtable и dst_entry сокращён на 48 байт, а в rt6_info на 64 байта;
    • Добавлен второй хэш для слушающих TCP-сокетов (listener);
    • Избавлен от блокировок код планировщика qdisc (queuing discipline);
  • Поддержка архитектур
    • В системах на базе архитектуры ARM64 теперь поддерживается использование 52-разрядной физической адресации;
    • Для архитектуры PowerPC реализована поддержка механизма PKU (Memory Protection Keys for Userspace), который можно применять для защиты доступа к страницам памяти из пространства пользователя, без изменения таблиц страниц памяти при изменении домена защиты. Например, указанные системные вызовы можно использовать для дополнительной защиты размещения в памяти ключей шифрования, предоставив возможность чтения только для одного потока в многопоточной программе шифрования;
  • Оборудование
    • В DRM-драйвере Intel улучшена поддержка чипов Cannonlake (Gen 10), добавлена поддержка новых прошивок для чипов Skylake и Kabylake и улучшены средства виртуализации GPU (GVT-g);
    • В DRM-драйвере Nouveau добавлена поддержка GPU GP108, применяемого в видеокартах серии GeForce GT 1030;
    • В DRM-драйвере AMDGPU улучшена поддержка GPU Vega и Raven, в прослойку AMD DC (Display Core) добавлен код для синхронизации между несколькими экранами;
    • Добавлена поддержка звуковых подсистем SoC Allwinner A83T, Maxim MAX89373, SocioNext UiniPhier, EVEA Tempo Semiconductor TSCS42xx, TI PCM816x, TAS5722 и TAS6424;
    • Для SoC Tegra TX2 реализована поддержка HDMI и I2C;
    • Добавлена поддержка новых ARM-устройств, включая Orange Pi R1, D-Link DNS-313 NAS, Actions S700 SoC, Libre Computer Board ALL-H3-CC H3, FreeScale Hummingboard2, Variscite DART-MX6, TS-4600, TS-7970 и Toradex Colibri;
    • Удалены старые драйверы для инфракрасных портов LIRC, которые уже давно были объявлены устаревшими.
    • Добавлена настройка CONFIG_SATA_MOBILE_LPM_POLICY, позволяющая продлить время автономной работы ноутбуков на базе чипов Intel за счёт использовании более агрессивных настроек ALPM (ATA Link Power Management). При помощи данной опции можно добиться снижения энергопотребления в режиме простоя примерно на 1 Вт;
    • Добавлена настройка BT_HCIBTUSB_AUTOSUSPEND, позволяющая включить
      автоматический перевод в спящий режим устройств Bluetooth, подключенных через USB, что позволяет снизить энергопотребление примерно на 0.4 Вт;

Одновременно Латиноамериканский Фонд свободного ПО сформировал
вариант полностью свободного ядра 4.16 – Linux-libre 4.16-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске переработана реализация reject_firmware_nowait, почищены сообщения, которые могут предлагать установку несвободного микрокода, очищен от блобов драйвер mt76x2e. Обновлён код чистки блобов в драйверах i915, nouveau, imx-sdma, iwlwifi, raydium-i2c и silead_dmi. Прекращена чистка драйвера lirc_zilog, в связи с удалением из ядра.