Розділи сайту Всі
#ядро
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.7. Среди наиболее заметных изменений: новая реализация ФС exFAT, модуль bareudp для создания UDP-туннелей, защита на основе аутентификации указателей для ARM64, возможность прикрепления BPF-программ к LSM-обработчикам, новая реализация Curve25519, детектор "split-lock", совместимость BPF с PREEMPT_RT, снятие ограничения на 80-символьный размер строки в коде, учёт показателей температуры CPU в планировщике задач, возможность использования clone() для порождения процессов в другом cgroup, защита от записи в память при помощи userfaultfd.

В новую версию принято 15033 исправлений от 1961 разработчиков, размер патча - 39 МБ (изменения затронули 11590 файлов, добавлено 570560 строк кода, удалено 297401 строк). Около 41% всех представленных в 5.7 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 13% связано с сетевым стеком, 4% - с файловыми системами и 4% c внутренними подсистемами ядра.
Разработчики подсистемы фильтрации и модификации сетевых пакетов Netfilter опубликовали набор патчей, значительно ускоряющих обработку больших списков сопоставления (nftables set), в которых требуется проверка сочетания подсетей, сетевых портов, протокола и MAC-адресов. Патчи уже приняты в ветку nf-next, которая будет предложена для включения в состав ядра Linux 5.7. Наиболее заметного ускорения удалось добиться благодаря задействованию инструкций AVX2 (в дальнейшем планируется опубликовать подобные оптимизации на базе инструкций NEON для ARM).

Оптимизации внесены в модуль nft_set_pipapo (PIle PAcket POlicies), решающий задачу сопоставления содержимого пакета с применяемыми в правилах фильтрации произвольными диапазонами состояния полей, такими как диапазоны IP и сетевых портов (nft_set_rbtree и nft_set_hash манипулируют сопоставлением интервалов и прямым отражением значений). Векторизированная при помощи 256-разрядных инструкций AVX2 верcия pipapo на системе с процессором AMD Epyc 7402 показала прирост производительности на 420% при разборе 30 тысяч записей, включающих связки порт-протокол. Прирост при сопоставлении связки из подсети и номера порта при разборе 1000 записей составил 87% для IPv4 и 128% для IPv6.
 
Другая оптимизация, позволяющая использовать 8-битовые группы сопоставления вместо 4-битовых, также показала ощутимый прирост производительности: 66% при разборе 30 тысяч записей порт-протокол, 43% - подсеть_IPv4-порт и 61% - подсеть_IPv6-порт. В сумме, с учётом оптимизаций AVX2, производительность pipapo увеличилась в указанных тестах на 766%, 168% и 269% соответственно. Полученные для сложных сопоставлений характеристики опережают проверки единичных полей в rbtree (за исключением теста связки порт+протокол), но пока отстают от прямых проверок при помощи хэшей и drop-обработчиков на базе netdev.
 
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.0. Среди наиболее заметных изменений в ядре 5.0: из Android перенесён энегоэффективный планировщик задач для CPU ARM big.LITTLE, добавлен механизм шифрования файловых систем Adiantum, в драйвере AMDGPU добавлена поддержка технологии FreeSync, реализована файловая система BinderFS, появилась возможность размещения файла подкачки в Btrfs, в UDP добавлена поддержка флага MSG_ZEROCOPY и GRO (Generic Receive Offload), в seccomp реализована возможность выноса обработчиков блокировок в пространство пользователя.

Значительная смена номера версии не является индикатором особых изменений, а сформирована из эстетических соображений и лишь свидетельствует о накоплении в ветке 4.x достаточного для начала новой нумерации числа выпусков. Смена первого номера в версии ядра является формальным шагом, снимающих дискомфорт из-за накопления большого числа выпусков в серии. Напомним, что переход к версиям 3.x был осуществлён в 2011 году, когда в ветке 2.6.x накопилось 39 релизов, а ветка 4.x была создана в 2015 году после подготовки 20 выпусков 3.x. При этом смена версий 3.x и 4.x хорошо коррелировала с числом git-объектов в репозитории - ядро 3.0 было выпущено, когда в репозитории находилось примерно 2 млн объектов, а ядро 4.0 - 4 млн объектов. Выпуск 5.0 разрывает данную логическую цепочку, так как в настоящее время репозиторий включает примерно 6.5 млн git-объектов.