Реліз ядра Linux 5.7

Після двох місяців розробки Лінус Торвальдс представив реліз ядра 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% з внутрішніми
підсистемами ядра.

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

  • Дискова підсистема, введення/виведення та файлові системи
    • Додано нову реалізацію драйвера exFAT, заснована на актуальній кодовій базі "sdfat" (2.x), що розвивається компанією Samsung для своїх Android-смартфонів. Раніше доданий до ядра драйвер був заснований на застарілому коді Samsung (версія 1.2.9) і відставав за продуктивністю від нового драйвера приблизно на 10%. Нагадаємо, що додавання підтримки exFAT в ядро ​​стало можливим після того, як компанія Microsoft опублікувала загальнодоступні специфікації та надала можливість безоплатного використання патентів на exFAT у Linux.
    • У Btrfs реалізовано нову команду ioctl() — BTRFS_IOC_SNAP_DESTROY_V2, що дозволяє видаляти підрозділ за його ідентифікатором. Забезпечено повну підтримку клонування inline-екстентів. Розширено кількість точок скасування операцій перерозподілу, що дозволило скоротити тривалі очікування під час виконання команди 'balance cancel'. Прискорено визначення зворотних посилань на екстенти (наприклад час виконання тестового сценарію зменшився з години до декількох хвилин). Додана можливість прикріплення до кожного inode дерева екстентів файлу. Перероблено схему блокування, яка використовується при записі в підрозділи і при виключенні NOCOW. Підвищено ефективність виконання fsync для діапазонів.
    • У XFS покращено перевірку метаданих та виконання fsck для активних розділів. Запропоновано бібліотеку для перебудови структур btree, яка у майбутньому буде використана для переробки xfs_repair та реалізації можливості відновлення без відмонтування розділу.
    • У CIFS додано експериментальну підтримку розміщення розділу підкачки в SMB3-сховищах. Реалізовані POSIX-розширення в readdir, визначені у специфікації SMB3.1.1. Підвищено продуктивність запису для сторінок розміром 64KB при включенні режиму cache=strict та використання версій протоколу 2.1+.
    • ФС EXT4 переведена з bmap та iopoll на використання iomap.
    • У F2FS реалізовано опціональну підтримку стиснення даних з використанням алгоритму zstd. За замовчуванням для стиснення задіяно алгоритм LZ4. Додано підтримку команди «chattr -c commit». Забезпечено відображення часу монтування. Доданий ioctl F2FS_IOC_GET_COMPRESS_BLOCKS для отримання відомостей про кількість стислих блоків. Додані дані про стискування, що виводяться через statx.
    • У файловій системі Ceph додано можливість локального виконання операцій створення та видалення (unlink) файлу без очікування відповіді від сервера (робота в асинхронному режимі). Зміна, наприклад, дозволяє помітно підняти продуктивність під час роботи утиліти rsync.
    • У OVERLAYFS додано можливість використання virtiofs як ФС верхнього рівня.
    • Переписано код обходу шляхів у VFS, перероблений код аналізу символічних посилань та уніфікований обхід точок монтування.
    • У підсистемі scsi непривілейованим користувачам дозволено виконання команд ZBC.
    • У dm_writecache реалізована можливість поступового очищення кешу на основі параметра max_age, що задає максимальний час життя блоку.
    • У dm_integrity додано підтримка операції Discard.
    • У null_blk додано підтримка підстановки помилок для симуляції збоїв під час проведення тестування.
    • Додана можливість надсилання udev-повідомлень про зміну розміру блокового пристрою.
  • Мережева підсистема
    • У Netfilter включені зміни, що значно прискорюють обробку великих списків зіставлення (nftables set), в яких потрібна перевірка поєднання підмереж, мережевих портів, протоколу та MAC-адрес.
      Оптимізації внесені модуль nft_set_pipapo (PIle PAcket POlicies), що вирішує завдання зіставлення вмісту пакета з застосовуваними в правилах фільтрації довільними діапазонами стану полів, такими як діапазони IP і мережевих портів (nft_set_rbtree і nft_set_hash маніпулюють зіставленням інтерв. Векторизована за допомогою 256-розрядних інструкцій AVX2 версія pipapo на системі з процесором AMD Epyc 7402 показала приріст продуктивності на 420% при розборі 30 тисяч записів, що включають зв'язки порт-протокол. Приріст при зіставленні зв'язки з підмережі та номера порту при аналізі 1000 записів становив 87% для IPv4 і 128% для IPv6.

    • доданий модуль bareudp, що дозволяє інкапсулювати в UDP-тунель різні L3-протоколи, такі як MPLS, IP та NSH.
    • Продовжено інтеграцію компонентів MPTCP (MultiPath TCP), розширення протоколу TCP для організації роботи TCP-з'єднання з доставкою пакетів одночасно по кількох маршрутах через різні мережеві інтерфейси, прив'язані до різних IP-адрес.
    • Додана підтримка механізмів апаратного прискорення інкапсуляції Ethernet-кадрів 802.11 (Wi-Fi).
    • При переміщенні пристрою з одного простору імен мережної підсистеми (network namespace) в інше забезпечено коригування прав доступу та власника відповідних файлів у sysfs.
    • Надано можливість використання прапора SO_BINDTODEVICE користувачами, які не мають прав root.
    • Прийнято третину патчів, що переводять інструментарій ethtool з ioctl() використання інтерфейсу netlink. Новий інтерфейс спрощує додавання розширень, покращує обробку помилок, дозволяє надсилати повідомлення при зміні стану, спрощує взаємодію між ядром та простором користувача та скорочує кількість синхронізованих іменованих списків.
    • Додано можливість використання спеціальних апаратних прискорювачів для виконання операцій відстеження з'єднань.
    • У netfilter доданий хук для підключення класифікаторів вихідних пакетів (egress), що доповнив собою хук для вхідних пакетів (ingress), що раніше був присутнім.
  • Віртуалізація та безпека
    • Додано апаратну реалізацію аутентифікації покажчиків (Автентифікація вказівника), що використовує спеціалізовані інструкції CPU ARM64 для захисту від атак, що використовують прийоми зворотно-орієнтованого програмування (ROP) при яких атакуючий не намагається розмістити свій код у пам'яті, а оперує шматками машинних інструкцій, що вже є в завантажених бібліотеках, завершуються інструкцією повернення управління. Захист зводиться до використання цифрових підписів для перевірки адрес повернення на рівні ядра. Підпис зберігається в верхніх бітах самого покажчика, що не використовуються. На відміну від програмних реалізацій створення та перевірка цифрових підписів здійснюється за допомогою спеціальних інструкцій CPU.
    • Додана можливість захисту області пам'яті від запису за допомогою системного виклику userfaultfd(), призначеного для обробки page faults (звернення до невиділених сторінок пам'яті) у просторі користувача. Ідея в тому, щоб використовувати userfaultfd() і для відстеження порушення доступу до сторінок, помічених захищеними від запису, та виклику обробника, який може реагувати на подібні спроби запису (наприклад, для обробки змін у процесі створення live-снапшотів працюючих процесів, фіксації стану) при скиданні дампів пам'яті на диск, реалізації розділеної пам'яті, відстеження змін у пам'яті). Функціональність еквівалентна застосування mprotect() у зв'язці з обробником сигналу SIGSEGV, але працює помітно швидше.
    • У SELinux оголошено застарілим параметр "checkreqprot", що дозволяє вимкнути перевірку захисту пам'яті при обробці правил (допускав використання областей пам'яті, що виконуються, незалежно від приписів, заданих у правилах). Символічним посиланням kernfs дозволено успадкування контексту батьківських каталогів.
    • До складу включений модуль KRSI, що дозволяє прикріплювати BPF-програми до будь-яких LSM-хуків в ядрі. Зміна дозволяє створювати LSM-модулі (Linux Security Module) у формі BPF-програм для вирішення задач аудиту та мандатного контролю доступу.
    • Проведено оптимізація продуктивності /dev/random за рахунок пакетної передачі значень CRNG замість окремого виклику інструкцій RNG. Покращено роботу getrandom та /dev/random на системах ARM64, що надають інструкції RNG.
    • Реалізація еліптичної кривої Curve25519 замінена на варіант із бібліотеки HACL, для котрого наведено математичне підтвердження формальної верифікації надійності.
    • доданий механізм інформування про вільні сторінки пам'яті. За допомогою даного механізму гостьові системи можуть передавати хост-системі відомості про сторінки, які більше не використовуються, і дані сторінки хост може забрати назад.
    • У vfio/pci додано підтримка SR-IOV (Single-Root I/O Virtualization).
  • Пам'ять та системні сервіси
    • З 80 до 100 символів збільшено обмеження на максимальну довжину рядка у вихідних текстах. При цьому розробникам, як і раніше, рекомендується триматися в межах 80 символів у рядку, але це тепер не є жорстким лімітом. Крім того, перевищення ліміту на розмір рядка тепер призводитиме до виведення попередження при складанні тільки якщо утиліта checkpatch запущена з опцією «—strict'. Зміна дасть можливість не відволікати розробників на маніпуляції з пробілами і більш вільно почуватися при вирівнюванні коду, а також запобігатиме зайве розбиття рядків, що заважає сприйняттю коду та пошуку.
    • Додана підтримка змішаного режиму завантаження EFI, що дозволяє без застосування спеціалізованого завантажувача завантажити 64-розрядне ядро ​​з 32-розрядної прошивки, що виконується на 64-розрядному CPU.
    • включена система виявлення та налагодження розщеплених блокувань («роздільний замок«), що виникають при доступі до невирівняних даних у пам'яті через те, що під час виконання атомарної інструкції дані перетинають дві лінії кеша CPU. Подібні блокування призводять до значного падіння продуктивності (на 1000 циклів повільніше атомної операції з даними, що потрапляють в одну лінію кеша). Залежно від завантажувального параметра split_lock_detect ядро ​​може на льоту виявляти подібні блокування і виводити попередження або відправляти сигнал SIGBUS додатку, що викликав блокування.
    • У планувальнику завдань забезпечено відстеження показників датчиків температури (Thermal Pressure) і реалізовано облік перегріву під час розміщення завдань. Користуючись статистикою, що обробляється, обробник температури (thermal governor) може коригувати максимальну частоту CPU при перегріві, а планувальник завдань тепер враховує зниження обчислювальної потужності через подібне урізання частоти при плануванні запуску завдань (раніше планувальник реагував на зміну частоти з певною затримкою, якийсь час приймаючи рішення на основі завищених припущень про доступні обчислювальні ресурси).
    • У планувальнику завдань задіяні інваріантні показники відстеження навантаження, що дозволяє коректно оцінити навантаження, незалежно від поточної частоти роботи CPU. Зміна дозволяє більш точно прогнозувати поведінку задач в умовах динамічної зміни вольтажу та частоти CPU. Наприклад, завдання, яка споживала 1/3 ресурсів CPU при частоті 1000 MHz, споживатиме 2/3 ресурсів при зниженні частоти до 500 MHz, що раніше створювало помилкове припущення про роботу на повну потужність (тобто завдання для планувальника здавалися більшими тільки за рахунок зниження частоти, що призводило до прийняття невірних рішень в schedutil cpufreq governor).
    • Драйвер Intel P-state, який відповідає за вибір режимів продуктивності, переведений на використання розклад.
    • Реалізовано можливість використання підсистеми BPF під час роботи ядра як реального часу (PREEMPT_RT). Раніше при включенні PREEMPT_RT наказувалося відключення BPF.
    • Додано новий тип BPF-програм — BPF_MODIFY_RETURN, які можуть прикріплюватися до функції в ядрі і змінювати значення, що повертається даною функцією.
    • Додана можливість використання системного виклику clone3() для створення процесу в cgroup, що відрізняється від батьківського cgroup, що дозволяє батьківському процесу застосувати обмеження та включити обліковий запис відразу після породження нового процесу або потоку. Наприклад, сервісний менеджер може безпосередньо виділяти нові послуги в окремі cgroup, а нові процеси при поміщенні в «заморожені» cgroup і будуть відразу зупинені.
    • у Kbuild додано підтримка змінної оточення "LLVM=1" для перемикання на інструментарій Clang/LLVM при складанні ядра. Піднято вимоги до версії binutils (2.23).
    • У debugfs додано секцію /sys/kernel/debug/kunit/ з результатами тестів kunit.
    • Додано параметр завантаження ядра pm_debug_messages (аналог/sys/power/pm_debug_messages), що включає виведення налагоджувальної інформації про роботу системи керування живленням (корисно при налагодженні проблем зі сплячим і режимом очікування).
    • В інтерфейс асинхронного введення/виводу io_uring додано підтримку зрощення () и атомарного вибору буферів.
    • Покращено профіль cgroup за допомогою інструментарію perf. Раніше perf міг профілювати завдання тільки в певному cgroup і не міг дізнатися, до якої cgroup належить поточний зразок. Тепер perf отримує відомості про cgroup для кожної вибірки, що дозволяє профілювати більше одного cgroup і застосовувати сортування по
      cgroup у звітах.

    • У cgroupfs, псевдо-ФС для управління cgroups, додано підтримку розширених атрибутів (xattrs) за допомогою яких, наприклад, можна залишати додаткову інформацію для обробників у просторі користувача.
    • У cgroup memory controller доданийа підтримка рекурсивного захисту значення memory.low, що регулює мінімальний обсяг оперативної пам'яті, наданої учасникам групи. При монтуванні ієрархії cgroup з опцією memory_recursiveprot значення memory.low, яке встановлено для нижніх вузлів, автоматично буде розподілятися для всіх дочірніх вузлів.
    • доданий фреймворк Uacce (Unified/User-space-access-intended Accelerator Framework) для спільного використання віртуальних адрес (SVA, Shared Virtual Addressing) між CPU та периферійними пристроями, що дозволяє апаратним прискорювачам отримати доступ до структур даних в основному CPU.
  • Апаратні архітектури
    • Для архітектури ARM реалізовано можливість гарячого виймання пам'яті.
    • Для архітектури RISC-V додано підтримку гарячого підключення та вилучення CPU (CPU hotplug). Для 32-розрядних RISC-V реалізовано eBPF JIT.
    • Прибрано можливість використання 32-розрядних ARM-систем для запуску гостьових оточень KVM.
    • Видалено «фіктивну» реалізацію NUMA для архітектури s390, для якої так і не знайдено сценаріїв використання, що дозволяють досягти підвищення продуктивності.
    • Для ARM64 додано підтримку розширення AMU (Activity Monitors Unit), визначеного в ARMv8.4 і надає лічильники продуктивності, які використані для розрахунку коефіцієнтів корекції масштабування частоти у планувальнику завдань.
  • Обладнання
    • Додана підтримка пристроїв vDPA, у яких використовується канал обміну даних, що відповідає специфікаціям virtio. vDPA-пристрої можуть бути як фізично підключеним обладнанням, так і програмними віртуальними пристроями, що емульуються.
    • У підсистемі GPIO з'явилася нова команда ioctl() для моніторингу змін, що дозволяє налагодити інформування про зміну стану будь-якої лінії GPIO. Як приклад використання нової команди запропонована утиліта gpio-watch.
    • У DRM-драйвері i915 для відеокарт Intel включено за замовчуванням підтримки чіпів Tigerlake («Gen12») та додана початкова підтримка керування підсвічуванням OLED. Поліпшено підтримку чіпів Ice Lake, Elkhart Lake, Baytrail і Haswell.
    • У драйвері amdgpu додано можливість завантаження прошивок у чіп USBC для ASIC. Поліпшено підтримку чіпів AMD Ryzen 4000 «Renoir». З'явилася підтримка керування OLED-панелями. Забезпечено відображення стану прошивки у debugfs.
    • У DRM-драйвері vmwgfx для систем віртуалізації VMware додана можливість використання OpenGL 4 в гостьових системах (раніше підтримувався OpenGL 3.3).
    • Додано новий DRM-драйвер tidss для дисплейної системи платформи TI Keystone.
    • Додані драйвери для LCD-панелей: Feixin K101 IM2BA02, Samsung s6e88a0-ams452ef01, Novatek NT35510, Elida KD35T133, EDT, NewEast Optoelectronics WJFH116008A, Rocktech RK101
    • У систему керування харчуванням додано підтримка платформи Intel Jasper Lake (JSL) з урахуванням Atom.
    • Додано підтримку ноутбука Pinebook Pro на базі Rockchip RK3399, планшета Pine64 PineTab та смартфона PinePhone на базі Allwinner A64.
    • Додано підтримку нових звукових кодеків та чіпів:
      Amlogic AIU, Amlogic T9015, Texas Instruments TLV320ADCX140, Realtek RT5682, ALC245, Broadcom BCM63XX I2S, Maxim MAX98360A, Presonus Studio 1810c, MOTU MicroBook IIc.

    • Додана підтримка ARM-плат і платформ Qualcomm Snapdragon 865 (SM8250), IPQ6018, NXP i.MX8M Plus, Kontron «sl28», 11 варіантів плати i.MX6 TechNexion Pico, три нові варіанти Toradex Colibri, Samsung S7710 Gala -Ericsson u2, DH Electronics DHCOM SoM та PDK8500, Renesas M2ULCB, Hoperun HiHope, Linutronix Testbox v3, PocketBook Touch Lux 2.

Джерело: opennet.ru

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