Linux Linux 5.14

Linux Linux 5.14

Після двох місяців розробки Лінус Торвальдс представив випуск ядра Linux 5.14. Серед найбільш помітних змін: нові системні виклики quotactl_fd() та memfd_secret(), видалення драйверів ide і raw, новий контролер пріоритетів вводу/виводу для cgroup, режим планування задач SCHED_CORE, інфраструктура для створення завантажувачів верифікованих програм BPF.

У нову версію прийнято 15883 виправлень від 2002 розробників, розмір патчу - 69 МБ (зміни торкнулися 12580 файлів, додано 861501 рядків коду, видалено 321654 рядків). Близько 47% всіх представлених у 5.14 змін пов'язані з драйверами пристроїв, приблизно 14% змін стосуються оновлення коду, специфічного для апаратних архітектур, 13% пов'язано з мережевим стеком, 3% — з файловими системами і 3% з внутрішніми підсистемами ядра.

Основні нововведення:

  • дискова підсистема, введення/виведення та файлові системи:
    • для cgroup реалізований новий контролер пріоритету введення/виводу — rq-qos, який може керувати пріоритетом обробки запитів до блокових пристроїв, що генеруються учасниками кожної cgroup. Підтримка нового контролера пріоритету додана до планувальника вводу/виводу mq-deadline;
    • у файловій системі ext4 реалізована нова ioctl-команда EXT4_IOC_CHECKPOINT, що примусово скидає на диск усі очікувані транзакції з журналу і пов'язані з ними буфери, а також перезаписує область, що використовується журналом, у сховище. Зміна підготовлена ​​в рамках ініціативи щодо запобігання витоку інформації з файлових систем;
    • у Btrfs внесені оптимізації продуктивності: рахунок виключення зайвого журналювання розширених атрибутів у процесі виконання fsync продуктивність інтенсивних операцій із розширеними атрибутами збільшилася до 17%. Крім того, при виконанні операцій усічення, що не торкаються екстентів, відключено виконання повної синхронізації, що скоротило час виконання операції на 12%. У sysfs додано налаштування обмеження пропускної спроможності вводу/вывода під час перевірки ФС. Додані ioctl-дзвінки для скасування операцій зміни розміру та видалення пристрою;
    • у XFS перероблена реалізація буферного кеша, який переведено виділення сторінок пам'яті в пакетному режимі. Підвищено ефективність роботи кешу;
    • у F2FS додано опцію для роботи в режимі тільки для читання та реалізовано режим кешування стислих блоків (compress_cache) для підвищення продуктивності випадкового читання. Реалізовано підтримку стиснення файлів, відбитих на згадку з допомогою операції mmap(). Для вибіркового відключення стиснення файлів по масці запропоновано нову опцію монтування nocompress;
    • у драйвері exFAT проведено роботу щодо покращення сумісності зі сховищами деяких цифрових камер;
    • додано системний виклик quotactl_fd(), який дозволяє керувати квотами не через файл спеціального пристрою, а через вказівку файлового дескриптора, пов'язаного з файловою системою, для якої застосовується квота;
    • з ядра видалено старі драйвери для блокових пристроїв з інтерфейсом IDE, на зміну яким вже давно прийшла підсистема libata. Підтримка старих пристроїв збережена в повному обсязі, зміни стосуються лише можливості використання старих драйверів, під час яких накопичувачі іменувалися /dev/hd*, а не /dev/sd*;
    • з ядра видалено драйвер «raw», що надає небуферизований доступ до блокових пристроїв через інтерфейс /dev/raw. Зазначена функціональність давно реалізується у додатках за допомогою прапора O_DIRECT;
  • пам'ять та системні служби:
    • у планувальнику завдань реалізовано новий режим планування SCHED_CORE, що дозволяє керувати тим, які процеси можуть виконуватися спільно на одному ядрі CPU. Кожному процесу може бути призначений cookie-індентифікатор, який визначає область довіри між процесами (наприклад, належність одного користувача або контейнера). При організації виконання коду планувальник може забезпечити спільне використання одного ядра CPU тільки для процесів, пов'язаних з одним власником, що може використовуватися для блокування деяких атак класу Spectre за рахунок запобігання виконання в одному потоці SMT (Hyper Threading), що заслуговують і не заслуговують на довіру завдань;
    • для механізму cgroup реалізована підтримка операції kill, що дозволяє разом завершити всі прив'язані до групи процеси (надіслати SIGKILL), через запис «1» у віртуальний файл cgroup.kill;
    • розширені можливості, пов'язані з реагуванням на виявлення розщеплених блокувань (split lock), що виникають при доступі до невирівняних даних у пам'яті через те, що при виконанні атомарної інструкції дані перетинають дві лінії кеша CPU. Подібні блокування призводять до значного падіння продуктивності, тому раніше яром надавалася можливість примусового завершення програми, що викликала блокування. У новому випуску доданий параметр командного рядка ядра split_lock_detect = ratelimit: N, що дозволяє визначити загальносистемний ліміт інтенсивності операцій блокування в секунду, після перевищення якого будь-який процес, що став джерелом розщепленого блокування, замість завершення буде припинено на 20 мс;
    • в cgroup-контролері пропускної спроможності CFS (CFS bandwidth controller), що визначає як багато процесорного часу можна виділити кожній cgroup, реалізована можливість визначення лімітів, обмежених заданим часом дії, що дозволяє краще регулювати навантаження, чутливі до затримок. Наприклад, встановлення значення cpu.cfs_quota_us у 50000 і cpu.cfs_period_us у 100000 дасть можливість групі процесів кожні 100ms витрачати 50ms часу CPU;
    • додано початкова інфраструктура для створення завантажувачів BPF-програм, яка надалі дозволить дозволити завантаження тільки BPF-програм, підписаних цифровим ключем, що заслуговує на довіру;
    • додано нову futex-операцію FUTEX_LOCK_PI2, яка використовує монотонний таймер для розрахунку таймууту, який враховує час, проведений системою в сплячому режимі;
    • для архітектури RISC-V реалізовано підтримку великих сторінок пам'яті (Transparent Huge-Pages) та можливість застосування механізму KFENCE виявлення помилок під час роботи з пам'яттю;
    • у системний виклик madvise(), що надає засоби для оптимізації управління пам'яттю процесу, додані прапори MADV_POPULATE_READ та MADV_POPULATE_WRITE для генерації «page fault» у всіх сторінках пам'яті, відображених для операцій читання або запису, без фактичного читання або запису (prefault). Застосування прапорів може бути корисним для зниження затримок у процесі роботи програми завдяки попереджувальному виконанню обробника «page fault» разом для всіх невиділених сторінок, не чекаючи фактичного звернення до них;
    • у системі unit-тестування kunit додано підтримка запуску тестів в оточенні QEMU;
    • додано нові трасувальники: «osnoise» для відстеження затримок у додатках, викликаних обробкою переривань, та «timerlat» для виведення детальної інформації про затримки при пробудженнях сигналу таймера;
  • віртуалізація та безпека:
    • доданий системний виклик memfd_secret(), що дозволяє створити приватну область пам'яті в ізольованому просторі адрес, видиму тільки процесу-власнику, яка не відображається в інші процеси і безпосередньо недоступне ядру;
    • в системі фільтрації системних викликів seccomp при виносі обробників блокування в простір користувача надано можливість використання однієї атомарної операції для створення файлового дескриптора для завдання, що ізолюється, і його повернення при обробці системного виклику. Запропонована операція вирішує проблему з перериванням оброблювача у просторі користувача під час надходження сигналу;
    • доданий новий механізм для керування обмеженням ресурсів у просторі імен ідентифікаторів користувачів, який прив'язує окремі лічильники rlimit до користувача у user namespace. Зміна вирішує проблему із застосуванням загальних лічильників ресурсів під час запуску одним користувачем процесів у різних контейнерах;
    • в гіпервізор KVM для систем ARM64 додано можливість використання в гостьових системах розширення MTE (MemTag, Memory Tagging Extension), що дозволяє прив'язати теги до кожної операції виділення пам'яті та організувати перевірку коректності використання покажчиків для блокування експлуатації вразливостей, викликаних зверненням до вже звільнених блоків буфера, зверненнями до ініціалізації та використанням поза поточним контекстом;
    • Засоби для автентифікації покажчиків (Pointer Authentication), що надаються платформою ARM64, тепер можуть бути окремо налаштовані для ядра і простору користувача. Технологія дозволяє використовувати спеціалізовані інструкції ARM64 для перевірки адрес повернення за допомогою цифрових підписів, які зберігаються в верхніх бітах самого покажчика, що не використовуються;
    • у User-mode Linux додано підтримка використання драйверів до PCI-пристроїв з віртуальною шиною PCI, що реалізується драйвером PCI-over-virtio;
    • для систем x86 додано підтримку паравіртуалізованого пристрою virtio-iommu, що дозволяє відправляти IOMMU-запити, такі як ATTACH, DETACH, MAP і UNMAP, поверх транспорту virtio без емуляції таблиць сторінок пам'яті;
    • для CPU Intel, починаючи з сімейства Skylake і закінчуючи Coffee Lake, за замовчуванням відключено використання розширень Intel TSX (Transactional Synchronization Extensions), що надають засоби для підвищення продуктивності багатопотокових додатків за рахунок динамічного виключення зайвих операцій синхронізації. Розширення відключено через можливість здійснення атак Zombieload, що маніпулюють витоком відомостей по сторонніх каналах, що виникає при роботі механізму асинхронного переривання операцій (TAA, TSX Asynchronous Abort);
  • мережева підсистема:
    • продовжено інтеграцію в ядро ​​MPTCP (MultiPath TCP), розширення протоколу TCP для організації роботи TCP-з'єднання з доставкою пакетів одночасно по кількох маршрутах через різні мережеві інтерфейси, прив'язані до різних IP-адрес. У новому випуску доданий механізм для завдання власних політик хешування трафіку для IPv4 та IPv6 (multipath hash policy), що дають можливість із простору користувача визначати, які з полів у пакетах, у тому числі інкапсульованих, будуть використані при обчисленні хеша, що визначає вибір шляху пакета;
    • у віртуальний транспорт virtio додано підтримку сокетів SOCK_SEQPACKET (упорядкована та надійна передача датаграм);
    • розширено можливості механізму сокетів SO_REUSEPORT, який дозволяє відразу кільком слухаючим сокетам підключитися до одного порту для прийому з'єднань з розподілом запитів, що надходять одночасно по всіх підключених через SO_REUSEPORT сокетах, що спрощує створення багатопоточних серверних додатків. У новій версії додані засоби передачі управління іншому сокету у разі збою під час обробки запиту спочатку обраним сокетом (вирішує проблему з втратою окремих з'єднань при перезапуску сервісів);
  • обладнання:
    • у драйвері amdgpu реалізована підтримка нових серій GPU AMD Radeon RX 6000, що розвиваються під кодовими іменами «Beige Goby» (Navi 24) та «Yellow Carp», а також покращена підтримка GPU Aldebaran (gfx90a) та APU Van Gogh. Додано можливість одночасної роботи з кількома панелями eDP. Для APU Renoir реалізовано підтримку роботи з шифрованими буферами у відеопам'яті (TMZ, Trusted Memory Zone). Додано підтримку гарячого вилучення графічних карт (hot-unplug). Для GPU Radeon RX 6000 (Navi 2x) та старих GPU AMD включена за промовчанням підтримка механізму енергозбереження ASPM (Active State Power Management), який раніше був активований тільки для GPU Navi 1x, Vega та Polaris;
    • для чіпів AMD додано підтримку віртуальної пам'яті (SVM, shared virtual memory) на базі підсистеми HMM (Heterogeneous memory management), що дозволяє використовувати пристрої з власними блоками управління пам'яттю (MMU, memory management unit), які можуть отримувати доступ до основної пам'яті. В тому числі за допомогою HMM можна організувати спільний адресний простір між GPU та CPU, в якому GPU може отримати доступ до основної пам'яті процесу;
    • додано початкову підтримку технології AMD Smart Shift, що динамічно змінює параметри енергоспоживання CPU і GPU на ноутбуках з чіпсетом і відеокартою AMD для форсування продуктивності при іграх, редагуванні відео та 3D-рендерингу;
    • у драйвері i915 для відеокарт Intel включено підтримка чіпів Intel Alderlake P;
    • додано драйвер drm/hyperv для віртуального графічного адаптера Hyper-V;
    • доданий графічний драйвер simpledrm, що використовує для виведення фреймбуфер EFI-GOP або VESA, що надається UEFI-прошивкою або BIOS. Основним призначенням драйвера є надання можливості графічного виведення на початкових стадіях завантаження, перш ніж стане можливим використання повноцінного DRM-драйвера. Драйвер також може використовуватися як тимчасове рішення для обладнання, для якого поки що відсутні рідні DRM-драйвери;
    • додано підтримка комп'ютера-моноблоку Raspberry Pi 400;
    • додано драйвер dell-wmi-privacy для підтримки апаратних вимикачів камери та мікрофона, що постачаються в ноутбуках Dell;
    • для ноутбуків Lenovo доданий WMI-інтерфейс для зміни параметрів BIOS через sysfs /sys/class/firmware-attributes/;
    • розширена підтримка пристроїв із інтерфейсом USB4;
    • додано підтримка звукових карт та кодеків AmLogic SM1 TOACODEC, Intel AlderLake-M, NXP i.MX8, NXP TFA1, TDF9897, Rockchip RK817, Qualcomm Quinary MI2 та Texas Instruments TAS2505. Покращено підтримку звуку на ноутбуках HP і ASUS. Додані патчі зниження затримок перед початком відтворення звуку на пристроях з інтерфейсом USB.

Джерело – opennet.ru.

Джерело: linux.org.ru