Релиз ядра Linux 4.10


После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 4.10. Среди наиболее заметных изменений: решение проблемы с подвисаниями при интенсивном копировании на медленные USB-носители, поддержка технологии виртуализации GPU, возможность привязки обработчиков BPF к cgroups, поддержка шифрования в UBIFS, реализация кэша обратной записи для MD RAID5, поддержка Intel Cache Allocation Technology, возможность использования объектов с сохранением состояния в netfilter, гибридный режим поллинга ввода/вывода для блочных устройств, средства для маршрутизации сетевых пакетов с учётом UID-идентификаторов процессов.

В новую версию принято около 13 тысяч исправлений от 1647 разработчиков, размер патча - 50 Мб (изменения затронули 11674 файлов, добавлено 743994 строк кода, удалено 249421 строк). Около 47% всех представленных в 4.10 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 15% связано с сетевым стеком, 4% - файловыми системами и 5% c внутренними подсистемами ядра. 13.7% изменений внесено сотрудниками компании Intel, 7.1% изменений подготовлено сотрудниками Red Hat, 4.3% - Samsung, 3.9% - Linaro, 3.7% - SUSE, 3.0% - IBM, 2.5% - AMD, 2.4% - Google, 1.4% - Oracle, 1.4% - ARM.

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

-Дисковая подсистема, ввод/вывод и файловые системы
Интегрированы патчи с улучшенной реализацией механизма фонового сброса данных на накопитель, решающие проблемы с подвисаниями во время копирования данных на медленный USB-накопитель. На системах с большим объёмом ОЗУ и медленными устройствами ввода/вывода переносимые на накопитель данные буферизируются в кэше обратной записи и копирование завершается в фоне. Ранее, операции сброса кэша обратной записи приводили к существенному снижению отзывчивости интерфейса приложений, подобных Firefox, вплоть до невозможности нормальной работы в течение нескольких минут. -Например, выполнение "dd if=/dev/zero of=foo bs=1M count=10k" или копирование большого файла на USB-накопитель не давало запустить браузер или любое крупное приложение пока оставался не сброшен кэш обратной записи.
-Предложенный в новом ядре режим "writeback throttling" решает указанную проблему благодаря урезанию интенсивности очистки кэша при наличии в очереди других операций ввода/вывода, что затрудняет монополизацию очереди ввода/вывода операциями интенсивной записи. Алгоритм урезания отслеживает появление задержек и изменение размера очереди, автоматически корректируя параметры для достижения оптимального результата. В итоге удалось решить проблемы с отзывчивостью за счёт незначительного увеличения времени сброса данных из кэша;

-В подсистему MD RAID добавлена поддержка флага failfast, который может быть привязан к дискам в процессе создания массивов RAID1 или RAID10, и активирует режим быстрого перевода устройства в режим сбоя. В случае неудачного завершения операции ввода/вывода диск будет сразу выведен из массива, без проведения полноценной обработки ошибки и повторных попыток проведения операции чтения;
-В MD RAID также реализован кэш обратной записи для RAID5, позволяющий агрегировать операции записи для последующей единовременной записи блока чётности, что позволяет добиться повышения производительности в условиях последовательной записи данных с дальнейшим выполнением операции fsync;
-В дополнение к появившейся в ядре 4.4 поддержке поллинга ввода/вывода для блочных устройств (I/O polling), в новой версии представлен режим гибридного адаптивного поллинга для блочных устройств. Поллинг позволяет уменьшить нагрузку на систему при использовании высокопроизводительных устройств за счёт периодического опроса состояния вместо генерации прерываний, при этом эффективность поллинга высока только при высокой нагрузке, иначе затраты ресурсов CPU на периодический опрос могут привышать затраты на обработку прерываний. Гибридный режим, вместо выполнения поллинга после завершения операции ввода/вывода, выполняет поллинг через искусственную задержку (например, если операция ввода/вывода длится 8 мкс, то опрос инициируется через 4 мкс), что позволяет инициировать цикл пробуждения до завершения операции, а не пробудиться уже после завершения. Данный подход позволяет значительно сократить задержки без повышения нагрузки на CPU. По умолчанию гибридный режим отключен и для активации требует установки параметра /sys/block/{dev}/queue/io_poll_delay;
-В F2FS, развиваемой компанией Samsung высокопроизводительной файловой системе для Flash-накопителей, появилась возможность объединения нескольких устройств в рамках одного большого виртуального раздела с одним экземпляром F2FS;
-В файловую систему UBIFS, предназначенную для Flash-накопителей, добавлена поддержка шифрования;
-В файловой системе Ext4 добавлена защита от включения режима журналирования данных для зашифрованных разделов (функции журналирования и шифрования данных не совместимы, но ранее могли быть активированы вместе из-за ошибки в настройках). Реализация DAX (прямой доступ к файлам) переведена на использование инфраструктуры iomap. Повышена стойкость к атакам, проводимым через монтирование специальным образом повреждённой ФС;
-В XFS реализован более быстрый метод поиска в используемых для кэша буферах, iomap задействован для прямого ввода/вывода (Direct I/O), объявлены устаревшими опции монтирования barrier/nobarrier;
-В CIFS добавлена новая опция монтирования "snapshot=время", позволяющая примонтировать прошлую версию внешнего раздела;
-Добавлена поддержка зонированных блочных устройств, необходимых для использования накопителей, в которых используется технология SMR (Shingled magnetic recording);
-В NBD (Network Block Device) добавлена поддержка установки множественных подключений к одному устройству;
-Из состава ядра удалена файловая система logfs, которая несколько лет находится без сопровождения и на практике не используется;
-Добавлена поддержка высокоприоритетных команд ATA, передаваемых устройству вне очереди. По умолчанию данный режим отключен;
-Виртуализация и безопасность
Реализована технология виртуализации GPU Intel GVT-g для гипервизора KVM (KVMGT), которая позволяет предоставить для каждого виртуального окружения отдельный виртуальный GPU, в котором при выполнении требующих высокой производительности операций могут быть задействованы ресурсы реального системного GPU. Виртуальный GPU позволяет использовать внутри гостевых систем обычные видеодрайверы, не требующие вмешательства гипервизора для обеспечения должной производительности. В итоге, KVMGT позволяет добиться хорошего баланса между производительностью, функциональностью и совместным использованием ресурсов, приближая производительность виртуализированной графической подсистемы к конфигурациям с полным пробросом GPU, но предоставляя возможность совместного использования GPU между виртуальными машинами без применения полной эмуляции или трансляции API DirectX/OpenGL;
-На системах с прошивками EFI ядро получило возможность сохранять некоторые случайные данные в виде EFI-переменных и затем на этапе загрузки использовать их для инициализации генератора псевдослучайных чисел. Данная возможность позволяет получить высокое качество энтропии сразу после начала загрузки.
-В криптографические компоненты ядра включена новая подсистема "acomp", позволяющая сжимать данные в асинхронном режиме;
-В подсистему virtio включено новое устройство virtio-crypto для обеспечения шифрования, предоставляющее типовые криптографические операции для виртуализированных гостевых систем;
-Для архитектуры PowerPC реализована поддержка системного вызова kexec_file_load(), позволяющего выполнить проверку по цифровой подписи для нового ядра, перед его запуском с использованием механизма kexec. Для PowerPC также обеспечена возможность сборки ядра с опциями защиты стека;
-Сетевая подсистема
В сетевом стеке обеспечена поддержка маршрутизации сетевых пакетов с учётом UID-идентификатора процесса получателя или отправителя. Возможность перенесена из платформы Android, на которой используется для создания политик маршрутизации, привязанных к отдельным приложениям. Например, администратор теперь может использовать правила вида "ip rule add uidrange 100-200 lookup 123" для задания иных правил маршрутизации для процессов с UID c 100 по 200;
-Для IPv6 реализована поддержка Segment Routing (SR-IPv6), одной из новых техник маршрутизации от источника (source-routing);
-В подсистему netfilter добавлена поддержка объектов с сохранением состояния (stateful objects), которые могут быть идентифицированы уникальным именем, заданным пользователем, и прикреплены к таблицам пакетного фильтра. В настоящее время поддерживается два типа таких объектов - счётчики и квоты;
-В nftables добавлена поддержка выражения "rt nexthop", позволяющего проверить nexthop (IP-адрес шлюза для отправки исходящих пакетов). Например правило "nft add rule filter postrouting ip daddr 192.168.1.0/24 rt nexthop != 192.168.0.1 drop", заблокирует любой трафик к подсети 192.168.1.0/24, маршрутизируемый не через шлюз 192.168.0.1;
-Добавлена возможность привязки программы BPF к cgroups для обеспечения фильтрации и учёта сетевого трафика для всех процессов, которые подпадают под эти cgroups. Возможность реализована через новый тип BPF-программ BPF_PROG_TYPE_CGROUP_SKB и две новые команды систменого вызова bpf - BPF_PROG_ATTACH и BPF_PROG_DETACH. Дополнительно реализован тип BPF_PROG_TYPE_CGROUP_SOCK, позволяющий привязать BPF-обработчик к открытию любого сокета AF_INET или AF_INET6 процессом из заданного cgroups;
-Добавлена возможность привязки программы BPF к инфраструктуре легковесных сетевых туннелей для контроля за передаваемым трафиком или для его модификации на лету;
-Память и системные сервисы
-Добавлена поддержка технологии CAT (Cache Allocation Technology), присутствующей в некоторых процессорах Intel Xeon и позволяющей определить политику распределения L2/L3 кэшей в CPU, например задачам реального времени может быть выделен отдельный участок кэша;
-Добавлен механизм устройств-посредников ("mediated device"), реализованных программно через интерфейс VFIO (Virtual Function I/O, виртуализированные драйверы устройств, работающие в пространстве пользователя). Например, представленный интерфейс использован в технологии виртуальных GPU, работа которых обеспечивается за счёт привлечения возможностей имеющегося физического GPU;
-Добавлен драйвер uleds (Userspace LEDs), позволяющий эмулировать LED-индикаторы или создавать драйверы для LED-индикаторов, работающие в пространстве пользователя. Взаимодействие между ядром и драйвером в пространстве пользователя производится через устройство /dev/uleds;
-В BPF появилась поддержка новой map-структуры с реализацией LRU-списка c вытеснением записей, которые не использовались дольше всех;
-Расширены средства фильтрации точек трассировки (tracepoint - вариант динамических printf(), выставляемых разработчиками программ для анализа поведения системы, к которым затем можно обращаться из LTTng, perf, SystemTap, ftrace). Если раньше можно было определять только простейшие маски, то теперь средства фильтрации точек трассировки значительно расширены и по своим возможностям напоминают шаблоны для выбора имени файла в командных оболочках;
-Реализован новый инструмент "perf c2c" (c2c - "cache to cache"), предназначенный для выявления и анализа проблем с производительностью, вызванных некорректной организацией совместной работы с памятью на системах NUMA. В частности, на многопроцессорных системах NUMA разные модули памяти физически закреплены за разными CPU, при этом доступ к локальной памяти текущего процессора осуществляется быстрее, чем к памяти, закреплённой за другим CPU. В многопоточных приложениях разные потоки могут выполняться на разных CPU, но работать с одной памятью, что в условиях архитектуры NUMA может привести к снижению производительности. При помощи "perf c2c" можно выявить подобные обращения к памяти чужого CPU, оценить задержки и узнать на работу каких процессов и функций они влияют;
-Подготовлен отчёт 'perf sched timehist' для анализа событий планирования выполнения задач, включая время ожидания выполнения, задержки и фактическое время выполнения задачи. Например, "perf sched record -- sleep 1; perf sched timehist":

time cpu task name wait time sch delay run time
[tid/pid] (msec) (msec) (msec)
-------- ------ ---------------- --------- --------- --------
1.874569 [0011] gcc[31949] 0.014 0.000 1.148
1.874591 [0010] gcc[31951] 0.000 0.000 0.024
1.874603 [0010] migration/10[59] 3.350 0.004 0.011
1.874604 [0011] 1.148 0.000 0.035
1.874723 [0005] 0.016 0.000 1.383
1.874746 [0005] gcc[31949] 0.153 0.078 0.022

-Переработан интерфейс информирования о состоянии сна в режиме "suspend-to-idle" (PM_SUSPEND_FREEZE). В sysfs добавлен новый файл /sys/power/mem_sleep, который информирует о режиме сна, активированном через запись значения "mem" в "/sys/power/state" (по умолчанию suspend-to-RAM, но может меняться на suspend-to-idle);
-Оборудование
-Добавлена поддержка новых устройств с процессорами на базе архитектуры ARM: смартфоны Huawei Nexus 6P и LG Nexus 5x, телеприставки Nexbox A1 и A95X Android TV, платы Pine64 на базе процессоров Allwinner A64, платы Globalscale Marvell ESPRESSOBin на основе Armada 3700 и платы Renesas "R-Car Starter Kit Pro" (M3ULCB), предназначенные для автоматизации информационно=развлекательных автомобильных систем;
-В DRM-драйвер (Direct Rendering Manager) Nouveau добавлена поддержка чипсетов GP102 и GP106 (GeForce 1060), реализован режим атомарного переключения видеорежимов, добавлена поддержка MST (Displayport 1.2 Multistream, для подключения экранов с разрешением 4K и выше через DisplayPort) и возможность NvBoost для ручного повышения частоты для увеличения производительности;
-В драйвере AMDGPU появилась поддержка виртуальных устройств, реализована возможность экспорта информации из видео-BIOS, добавлен новый менеджер видеопамяти, разбивающий операции распределения VRAM на блоки в 4MB. Добавлена поддержка ещё не поступивших в продажу графических карт AMD Polaris12;
-В драйвер для GPU Intel улучшена поддержка HDMI на системах с Core i-6000 и других процессоров семейства Skylake. Добавлена поддержка технологии разгона процессоров Turbo Boost Max 3.0, реализованной в CPU семейства Broadwell-E и позволяющей увеличить производительность однопоточных приложений за счёт завышения тактовой частоты, при удержании допустимых границ мощности и температуры;
-В драйвер MSM добавлена поддержка 500 серии GPU Adreno, применяемой в новых процессорах Qualcomm;
-Для упрощения поиска решения проблемы, связанной с недоступностью SSD-накопителя некоторых ноутбуков Lenovo, при обнаружении выставления режима RAID для накопителя теперь выводится предупреждение с рекомендаций выставить в BIOS режим AHCI. Напомним, что по умолчанию некоторые ноутбуки Lenovo поставляются с SSD в режиме RAID, который требует отдельных проприетарных драйверов Intel, недоступных для Linux;
-Добавлен драйвер для Amlogic Meson Graphic Controller, используемого в SoC GXBB/GXL/GXM;
Добавлен драйвер для графической подсистемы ZTE VOU;
-Добавлена поддержка семейства процессоров AMD Fam17h (AMD Ryzen);
-Добавлена поддержка звуковых кодеков Cirrus Logic CS35L34/CS42L42, Cirrus Logic wm8581, Qualcomm MSM8916 WCD, Realtek rt5665;
-Включены наработки, направленные на повышение производительности драйвера Ath9k для беспроводных чипов Atheros/Qualcomm, который позволили сократить задержки, повысить пропускную способность и минимизировать обрывы соединений по таймауту;
-Для архитектуры ARM64 добавлена поддержка системы контрольных проверок uprobes (userspace probes), используемой для анализа поведения приложений, выполняемых в пространстве пользователя. Для ARM64 также обеспечена эмуляция режима предотвращения привилегированного доступа ("privileged access never"), не позволяющего ядру неявно обращаться к памяти пространства пользователя;
-Латиноамериканский Фонд свободного ПО оперативно сформировал вариант полностью свободного ядра 4.10 - Linux-libre 4.10-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске очищен от блобов драйвер st_fdma. Обновлён код чистки блобов для драйверов amdgpu, adreno, i915, radeon, iwlwifi, slicoss, bfad, проведена чистка документации alsa. Прекращено вырезание блобов для драйвера STE-Modem, который исключён из ядра. Выделены типовые маски для
префиксов в именах блобов в драйвере iwlwifi.