Реліз ядра Linux 5.19

Після двох місяців розробки Лінус Торвальдс презентував реліз ядра Linux 5.19. Серед найбільш помітних змін: підтримка процесорної архітектури LoongArch, інтеграція патчів BIG TCP, режим on-demand у fscache, видалення коду для підтримки формату a.out, можливість застосування ZSTD для стиснення прошивок, інтерфейс для управління витісненням пам'яті з простору користувача , підвищення надійності та продуктивності генератора псевдовипадкових чисел, підтримка розширень Intel IFS (In-Field Scan), AMD SEV-SNP (Secure Nested Paging), Intel TDX (Trusted Domain Extensions) та ARM SME (Scalable Matrix Extension).

В анонсі Лінус повідомив, що швидше за все наступному випуску ядра буде присвоєно номер 6.0, так як у гілці 5.x накопичилося достатньо випусків для зміни першого числа в номері версії. Зміна нумерації здійснюється з естетичних міркувань і є формальним кроком, що знімає дискомфорт через накопичення великої кількості випусків у серії.

Також Лінус згадав, що використав для формування релізу ноутбук Apple на базі архітектури ARM64 (Apple Silicon) із Linux-оточенням на базі дистрибутива Asahi Linux. Це не основна робоча станція Лінуса, але він використав цю платформу, щоб перевірити її придатність для роботи над ядром і бути впевненим у тому, що зможе формувати випуски ядра у поїздці, маючи під рукою легкий ноутбук. До цього багато років тому Лінус мав досвід використання обладнання Apple для розробки колись він користувався комп'ютером на базі CPU ppc970 і ноутбуком Macbook Air.

У нову версію прийнято 16401 виправлень від 2190 розробників (у минулому випуску було 16206 виправлень від 2127 розробників), розмір патча - 90 МБ (зміни торкнулися 13847 файлів, додано 1149456 рядків коду, видалено 349177). Близько 39% всіх представлених у 5.19 змін пов'язані з драйверами пристроїв, приблизно 21% змін мають відношення до оновлення коду, специфічного для апаратних архітектур, 11% пов'язано з мережевим стеком, 4% з файловими системами і 3% з внутрішніми підсистемами ядра.

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

  • Дискова підсистема, введення/виведення та файлові системи
    • Файлова система EROFS (Enhanced Read-Only File System), призначена для використання на розділах, доступних у режимі тільки для читання, перекладена використання підсистеми fscache, що забезпечує кешування даних. Зміна дозволила помітно підняти продуктивність систем, у яких з образу на базі EROFS запускається велика кількість контейнерів.
    • У підсистему fscache доданий режим читання на вимогу («on-demand»), який задіяний для оптимізації EROFS. Новий режим дозволяє організувати кешування читання з образів ФС, що у локальної системі. На відміну від доступного режиму роботи, орієнтованого на кешування в локальній файловій системі даних, що передаються через мережні файлові системи, режим «on-demand» делегує функції вилучення даних та їх запису в кеш окремому фоновому процесу, що виконується в просторі користувача.
    • У XFS забезпечено можливість зберігання мільярдів розширених атрибутів у i-node. Максимальна кількість екстентів для одного файлу збільшена з 4 мільярдів до 247. Реалізовано режим для атомарного оновлення одразу декількох розширених атрибутів файлу.
    • У файловій системі Btrfs оптимізована робота з блокуваннями, що дозволило досягти збільшення продуктивності приблизно на 7% при прямому записі в режимі nowait. Продуктивність операцій у режимі NOCOW (без copy-on-write) підвищена приблизно на 3%. Знижено навантаження на сторінковий кеш під час роботи команди «send». Мінімальний розмір підсторінок знижено з 64К до 4K (можна використовувати підсторінки розміром менше сторінок ядра). Здійснено перехід із використання базисного дерева (radix tree) на алгоритм XArrays.
    • У NFS-сервер додано режим продовження збереження стану блокування, виставленого клієнтом, який перестав відповідати на запити. Новий режим дозволяє затримати очищення блокування аж до доби, якщо інший клієнт не запросить конкуруючі блокування. У штатному режимі блокування очищається через 90 секунд після того, як клієнт перестав відповідати.
    • У підсистемі відстеження подій у ФС fanotify реалізований прапор FAN_MARK_EVICTABLE, за допомогою якого можна вимкнути закріплення цільових i-node у кеші, наприклад, для ігнорування підвіток без закріплення їх частин у кеші.
    • У драйвер ФС FAT32 додана підтримка отримання відомостей про час створення файлу через системний виклик statx c реалізацією більш ефективного і функціонального варіанту stat(), що повертає розширену інформацію про файл.
    • Внесені значні оптимізації в драйвер exFAT, пов'язані із забезпеченням одночасного очищення групи секторів при активному режимі 'dirsync' замість послідовного посекторного очищення. За рахунок скорочення числа запитів блоків після внесення оптимізації продуктивність створення великої кількості каталогів на карті SD зросла більш ніж на 73-85% залежно від розміру кластера.
    • До складу ядра включено перше коригуюче оновлення драйвера ntfs3. З моменту включення ntfs3 до складу ядра 5.15 у жовтні минулого року драйвер не оновлювався, а з розробниками було втрачено зв'язок, але тепер розробники відновили публікацію змін. У запропонованих патчах усунуто помилки, що призводять до витоків пам'яті та аварійних завершень, вирішено проблеми з виконанням xfstests, проведено чищення коду, що не використовується, та виправлені помилки.
    • Для OverlayFS реалізована можливість мапінгу ідентифікаторів користувачів примонтованих файлових систем, що використовується для зіставлення файлів певного користувача на чужому розділі з іншим користувачем в поточній системі.
  • Пам'ять та системні сервіси
    • Додана початкова підтримка архітектури набору команд LoongArch, що застосовується в процесорах Loongson 3 5000 і реалізує новий RISC ISA, схожий на MIPS та RISC-V. Архітектура LoongArch доступна у трьох варіантах: урізаний 32-розрядний (LA32R), звичайний 32-розрядний (LA32S) та 64-розрядний (LA64).
    • Видалено код для підтримки формату виконуваних файлів a.out, який було переведено до розряду застарілих у випуску 5.1. Формат a.out давно не застосовується на системах з Linux, а генерація файлів a.out не підтримується сучасними інструментальними засобами конфігурацій для Linux за замовчуванням. Завантажувач для файлів a.out може бути реалізований повністю в просторі користувача.
    • Припинено підтримку завантажувальних опцій, специфічних для архітектури x86: nosep, nosmap, nosmep, noexec та noclflush).
    • Припинено підтримку застарілої архітектури CPU h8300 (Renesas H8/300), що давно залишилася без супроводу.
    • Розширено можливості, пов'язані з реагуванням на виявлення розщеплених блокувань (split lock), що виникають при доступі до невирівняних даних у пам'яті через те, що при виконанні атомарної інструкції дані перетинають дві лінії кеша CPU. Такі блокування призводять до значного падіння продуктивності. Якщо раніше за умовчанням ядро ​​видавало попередження з інформацією про процес, що викликав блокування, то тепер проблемний процес додатково буде уповільнений, щоб зберегти продуктивність іншої системи.
    • Додано підтримку реалізованого в процесорах Intel механізму IFS (In-Field Scan), що дозволяє запускати низькорівневі діагностичні тести CPU, здатні виявляти проблеми, що не визначаються штатними засобами на основі кодів корекції помилок (ECC) або бітів парності. Тести, що виконуються, оформляються у формі завантажуваної прошивки, оформленої за аналогією з оновленнями мікрокоду. Результати тестування доступні через sysfs.
    • Додана можливість вбудовування в ядро ​​файлу bootconfig, що дозволяє, крім опцій командного рядка, визначати параметри роботи ядра через файл з налаштуваннями. Вбудовування здійснюється за допомогою складальної опції 'CONFIG_BOOT_CONFIG_EMBED_FILE="/PATH/TO/BOOTCONFIG/FILE"'. Раніше bootconfig визначався через прикріплення до образу initrd. Вбудовування в ядрі дозволяє використовувати bootconfig в конфігураціях без initrd.
    • Реалізовано можливість завантаження прошивок, стислих за допомогою алгоритму Zstandard. У sysfs доданий набір файлів керування /sys/class/firmware/*, що дозволяє ініціювати завантаження прошивок з простору користувача.
    • В інтерфейсі асинхронного введення/виводу io_uring запропонований новий прапор IORING_RECVSEND_POLL_FIRST, при виставленні якого мережева операція спочатку буде передана для обробки з використанням полінгу (polling), що може заощадити ресурси в ситуаціях, коли допустима обробка операції з деякою затримкою. У io_uring також додана підтримка системного виклику socket(), запропоновані новий прапори для спрощення управління файловими дескрипторами, доданий режим «multi-shot» для прийому у викликі accept() разом кількох з'єднань, додані операції для прокидання команд NVMe безпосередньо до пристрою.
    • Для архітектури Xtensa забезпечена підтримка інструменту налагодження KCSAN (Kernel Concurrency Sanitizer), призначеного для динамічного виявлення станів гонки всередині ядра. Також додано підтримку сплячого режиму та співпроцесорів.
    • Для архітектури m68k (Motorola 68000) реалізовано віртуальну машину (симулятор платформи), засновану на емуляторі Android Goldfish.
    • Для архітектури AArch64 реалізовано підтримку розширень Armv9-A SME (Scalable Matrix Extension).
    • У підсистемі eBPF дозволено зберігання типізованих покажчиків у map-структурах, а також додано підтримку динамічних покажчиків.
    • Запропоновано новий попереджувальний механізм витіснення пам'яті, що підтримує керування із простору користувача за допомогою файлу memory.reclaim. Запис числа у вказаний файл призведе до спроби витіснення відповідного числа байт із набору, пов'язаного з cgroup.
    • Підвищена точність обліку використання пам'яті під час стиснення даних у розділі підкачки за допомогою механізму zswap.
    • Для архітектури RISC-V забезпечена підтримка запуску 32-розрядних файлів, що виконуються на 64-розрядних системах, доданий режим для прив'язки обмежуючих атрибутів до сторінок пам'яті (наприклад, для заборони кешування) і реалізована функція kexec_file_load().
    • Реалізація підтримки 32-розрядних систем Armv4T та Armv5 адаптована для використання в універсальних багатоплатформних складаннях ядра, що підходять для різних ARM-систем.
  • Віртуалізація та безпека
    • У підсистемі EFI реалізовано можливість конфіденційної передачі гостьовим системам секретної інформації без її розкриття хост-системі. Дані надаються через каталог security/coco у securityfs.
    • У режимі захисту Lockdown, який обмежує доступ користувача root до ядра і блокує шляхи обходу UEFI Secure Boot, усунена лазівка, що дозволяла обходити захист через маніпуляції з відладчиком ядра.
    • Включено патчі, націлені на підвищення надійності та продуктивності генератора псевдовипадкових чисел.
    • При складанні Clang 15 реалізована підтримка механізму рандомізації структур ядра.
    • У механізм Landlock, що дозволяє обмежити взаємодію групи процесів із зовнішнім оточенням, надано підтримку правил, що дозволяють контролювати виконання операцій перейменування файлів.
    • Підсистема IMA (Integrity Measurement Architecture), призначена для перевірки цілісності компонентів операційної системи за цифровими підписами та хешами, перекладена використанням модуля fs-verity для верифікації файлів.
    • Змінено логіку дій при відключенні непривілейованого доступу до підсистеми eBPF — раніше відключалися всі команди, пов'язані із системним викликом bpf(), а починаючи з версії 5.19 залишено доступ до команд, які не призводять до створення об'єктів. При подібній поведінці для завантаження програми BPF потрібен привілейований процес, але потім непривілейовані процеси можуть взаємодіяти з цією програмою.
    • Додано підтримку розширення AMD SEV-SNP (Secure Nested Paging), що забезпечує безпечну роботу з вкладеними таблицями сторінок пам'яті та захищає від атак undeSErVed і SEVerity на процесори AMD EPYC, що дозволяють обійти механізм захисту AMD SEV (Secure Encrypted Virtu).
    • Додано підтримку механізму Intel TDX (Trusted Domain Extensions), що дозволяє блокувати спроби стороннього доступу до зашифрованої пам'яті віртуальних машин.
    • У драйвер virtio-blk, який використовується для емуляції блокових пристроїв, додано підтримку введення/виводу з використанням полінгу (polling), що за проведеними тестами дозволило скоротити затримки приблизно на 10%.
  • Мережева підсистема
    • До складу включена серія патчів BIG TCP, що дозволяють збільшити максимальний розмір пакету TCP-пакета до 4ГБ для оптимізації роботи високошвидкісних внутрішніх мереж дата-центрів. Подібне збільшення розміру пакета при 16-бітному розмірі поля в заголовку досягається через реалізацію «jumbo»-пакетів, розмір IP-заголовку яких виставляється в 0, а фактичний розмір передається в окремому 32-розрядному полі в окремому заголовку. При тестуванні продуктивності виставлення розміру пакета в 185 КБ дозволило збільшити пропускну здатність на 50% значно скоротити затримки передачі.
    • Продовжено роботу з інтеграції в мережевий стек коштів для відстеження причин відкидання пакетів (коди reason). Код причини передається під час звільнення пам'яті, пов'язаної з пакетом, і дозволяє враховувати такі ситуації, як відкидання пакету через помилки заповнення полів у заголовку, виявлення спуфінгу фільтром rp_filter, неправильна контрольна сума, брак пам'яті, спрацювання правил IPSec XFRM, неправильний номер послідовності TCP тощо.
    • Додана підтримка відкату з'єднань MPTCP (MultiPath TCP) на використання звичайного TCP у ситуаціях, коли певні можливості MPTCP не можуть бути використані. MPTCP являє собою розширення протоколу TCP для організації роботи TCP-з'єднання з доставкою пакетів одночасно по декількох маршрутах через різні мережеві інтерфейси, прив'язані до різних IP-адрес. Доданий API для керування потоками MPTCP із простору користувача.
  • Обладнання
    • Додано більше 420 тисяч рядків коду, пов'язаних з драйвером amdgpu, з яких близько 400 тисяч рядків припадає на автоматично згенеровані файли заголовків з даними для регістрів ASIC в драйвері для GPU AMD, а ще 22.5 тисяч рядків забезпечують початкову реалізацію підтримки AMD SoC21. Загальний розмір драйвера для GPU AMD перевищив 4 млн. рядків коду. Крім SoC21 у драйвері AMD включена підтримка SMU 13.x (System Management Unit), оновлено підтримку USB-C та GPUVM, проведено підготовку до підтримки наступних поколінь платформ RDNA3 (RX 7000) та CDNA (AMD Instinct).
    • У драйвері i915 (Intel) розширено можливості, пов'язані з керуванням енергоспоживанням. Додані ідентифікатори GPU Intel DG2 (Arc Alchemist), що використовуються на ноутбуках, забезпечена початкова підтримка платформи Intel Raptor Lake-P (RPL-P), додана інформація про графічні карти Arctic Sound-M), реалізований ABI для обчислювальних двигунів, для карт DG2 додано Підтримка формату Tile4 для систем на базі мікроархітектури Haswell реалізована підтримка DisplayPort HDR.
    • У драйвері Nouveau здійснено перехід на використання обробника drm_gem_plane_helper_prepare_fb, для деяких структур та змінних застосовано статичне виділення пам'яті. Що стосується використання в Nouveau відкритих компанією NVIDIA вихідних текстів модулів ядра, то робота поки що зводиться до виявлення та усунення помилок. Надалі опубліковану прошивку планується використовуватиме підвищення продуктивності драйвера.
    • Доданий драйвер для контролера NVMe, який використовується в комп'ютерах Apple на базі чіпа M1.

Одночасно латиноамериканський Фонд вільного програмного забезпечення сформував варіант повністю вільного ядра 5.19 - Linux-libre 5.19-gnu, очищеного від елементів прошивок і драйверів, що містять невільні компоненти або ділянки коду, область застосування яких обмежена виробником. У новому випуску проведено чищення драйверів для pureLiFi X/XL/XC та TI AMx3 Wkup-M3 IPC. Оновлено код чищення блобів у драйверах та підсистемах Silicon Labs WFX, AMD amdgpu, Qualcomm WCNSS Peripheral Image Loader, Realtek Bluetooth, Mellanox Spectrum, Marvell WiFi-Ex, Intel AVS, IFS, pu3-imgu drivers. Реалізовано обробку devicetree-файлів Qualcomm AArch64. Додано підтримку нової схеми найменування компонентів Sound Open Firmware. Припинено чищення драйвера ATM Ambassador, видаленого з ядра. Управління чищенням блобів у HDCP та Mellanox Core перенесено в окремі теги kconfig.

Джерело: opennet.ru

Додати коментар або відгук