После двух месяцев разработки Линус Торвальдс анонсировал релиз ядра Linux 3.17. Среди наиболее заметных улучшений: новые системные вызовы getrandom и seccomp, возможность обращения к областям памяти через файловый дескриптор (memfd), поддержка ограничения операций с файлом через дескриптор, включена по умолчанию реализация Render Nodes, поддержка dma-buf cross-device synchronization, прекращена поддержка архитектур POWER3 и rs64.

В новую версию принято около 12 тысяч исправлений от 1300 разработчиков, размер патча - 54 Мб (изменения затронули 10605 файлов, добавлено 653577 строк кода, удалено 668166 строк). Около 46% всех представленных в 3.17 изменений связаны с драйверами устройств, примерно 18% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 5% - файловыми системами и 3% c внутренними подсистемами ядра.

Из наиболее интересных новшеств можно отметить:

 
  • Память и системные сервисы
    • Поддержка техники маппинга памяти memfd, при которой область памяти идентифицируется через файловый дескриптор, который может передаваться между процессами. По сути можно выделить память как по malloc, но обращаться к ней как с файлом, по файловому дескриптору. Управление производится через системный вызов memfd_create();
    • Представлена техника запечатывания файла (file sealing), которая позволяет ограничить выполняемые над файлом операции, например, запретить на уровне файлового дескриптора изменение содержимого файла, увеличение или уменьшение размера, т.е. можно передать дескриптор другому процессу защитив данные от изменения. С практической стороны данная функциональность необходима для заморозки содержимого memfd, чтобы после передачи файлового дескриптора не позволить другим процессам изменять связанную с memfd область памяти. File sealing и memfd являются ключевыми компонентами, необходимыми для реализации kdbus (аналог D-Bus внутри ядра);
    • Включена по умолчанию технология Render Nodes, подразумевающая разделение монолитных устройств /dev/dri/card{num} на две категории: Rendering Nodes (/dev/dri/renderD{num}), отвечающие за аппаратное ускорение рендеринга и обсчет вычислительных заданий GPGPU, и ModeSetting Nodes (/dev/dri/modeset{num}), обеспечивающие переключение видеорежимов и управление экраном. Таким образом предоставлены более гибкие средства для управления правами доступа и возможность выполнения вычислений на GPU или рендеринга без вывода на экран и без привязки к активному дисплею. До реализации Render Nodes все операции рендеринга и смены видеорежимов выполнялись через один интерфейс, что приводило к невозможности независимого выставления прав на выполнение операций ускорения рендеринга и переключение видеорежимов. Поддержка Render Nodes присутствует в драйверах i915, Radeon и Nouveau;
    • Доступна переписанная реализация API DMA-BUF, позволяющего организовать совместное использования буферов драйверами и различными подсистемами (V4L2, DRI и т.п.). В API добавлены средства для синхронизации DMA-буферов между разными устройствами (cross-device synchronization) и координации взаимодействия между ними. API доступен для всех модулей ядра и экспортируется в категории EXPORT_SYMBOL, а не только для распространяемых под лицензией GPL (EXPORT_SYMBOL_GPL), что позволяет решить проблемы с организацией взаимодействия свободных и проприетарных драйверов при организации работы гибридных графических систем. Например, в проприетарном драйвере NVIDIA может быть реализована поддержка технологии Optimus, дающей возможность на лету переключаться между встроенной энергоэффективной видеокартой на базе GPU Intel и дискретной картой NVIDIA (использование DMA-BUF в драйвере NVIDIA требуется для организации записи во фреймбуфер драйвера Intel); .
    • В утилиту perf добавлена возможность трассировки обращений к невыделенным страницам памяти (page-fault) и генерации связанной с такими обращениями статистики. В команде "perf timechart" реализована генерация диаграмм, отображающих события ввода/вывода;
    • Внесена серия исправлений, связанных с решением проблемы 2038 года, которая приведёт к переполнению 32-разрядных эпохальных счётчиков времени;
  • Сетевая подсистема
    • В netfilter прекращена поддержка цели "ULOG", которая давно объявлена устаревшей (c 2006 года рекомендуется использовать "NFLOG");
  • Дисковая подсистема, ввод/вывод и файловые системы
    • Для работы файловой системы XFS теперь необходима сборка ядра с 64-разрядным числом секторов. Добавлен раздел XFS в sysfs с параметрами для тестирования файловой системы;
    • В клиенте NFS добавлена поддержка выборок на основе механизма синхронизации RCU (Read-copy-update), позволивших ускорить нахождение файлов при наличии информации в кэше;
    • Начальная поддержка Multiqueue SCSI, рассчитанного на организацию многопоточного доступа к данным на многоядерных системах и позволяющего эффективно использовать возможности современных SSD-накопителей. Архитектура Multiqueue SCSI основана на двухуровневой модели очередей: на первом уровне функционируют очереди для передачи запросов ввода/вывода, привязанные к каждому CPU. Из данных очередей запросы направляются в очереди второго уровня, которые координируют обращение к оборудованию. В зависимости от конфигурации системы, числа CPU и накопителей соотношение между очередями первого и второго уровня может составлять от 1 к 1 до N к M.
  • Виртуализация и безопасность
    • Добавлен системный вызов kexec_file_load(), позволяющий выполнить проверку по цифровой подписи для нового ядра, перед его запуском с использованием механизма kexec. Ранее функцию загрузки нового ядра из уже запущенного ядра Linux (kexec) приходилось отключать при использовании UEFI Secure Boot, так как невозможно было гарантировать сохранение цепочки доверия;
    • В криптографическую подсистему добавлена поддержка детерминированного генератора псевдослучайных чисел, соответствующего спецификации NIST SP800-90A. Также обеспечена возможность разбора подписанных сообщений PKCS#7 и проверки цифровых подписей;
    • Добавлен системный вызов getrandom(), который является аналогом системного вызова getentropy, присутствующего в OpenBSD. Getrandom предоставит надёжную защиту от атак, основанных на исчерпании доступных файловых дескрипторов. При отсутствии свободных дескрипторов невозможно задействовать /dev/urandom, поэтому библиотеками активируется запасной вариант, использующий менее надёжный PRNG. Getrandom предоставит возможность получения случайных чисел от системного PRNG даже в условиях отсутствия свободных файловых дескрипторов.
    • В подсистему LSM (linux security module) добавлен новый hook kernel_fw_from_file(), который можно использовать для проверки целостности бинарных прошивок перед их загрузкой ядром;
    • Добавлен новый системный вызов seccomp для управления режимом работы и фильтрами механизма ограничения доступа к системным вызовам для приложений. Новый системный вызов позволяет решить проблемы с использованием Seccomp filter для многопоточных приложений (ранее фильтры Seccomp привязывались только на уровне процесса через prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, filter));
  • Аппаратные архитектуры
    • Прекращена поддержка архитектур POWER3 и rs64, связанный с которыми код уже достаточно давно находился в неработоспособном состоянии;
    • Прекращена поддержка систем Samsung S5P6440, S5P6450 и S5PC100;
    • Для архитектуры ARM64 добавлена поддержка четырёхуровневых таблиц страниц памяти, что позволило значительно расширить размер адресуемой виртуальной памяти;
    • Гипервизор KVM адаптирован для big-endian ARM-систем;
  • Оборудование
    • В DRM-драйвере Nouveau устранены проблемы с использованием GPU Kepler, добавлена поддержка режима Zero Bandwidth Clear для GPU Fermi, Kepler и Maxwell;
    • В DRM-драйвер Radeon добавлена поддержка чипов "Hawaii" (Radeon R9 290);
    • В DRM-драйвере Intel проведена подготовка к поддержке Atom SoC Cherry Trail, добавлена поддержка Universal plane;
    • Добавлен драйвер для контроллера Xbox One;
    • В драйвере b43 добавлена поддержка новых беспроводных адаптеров на чипах Broadcom;