След два месеца разработка, Линус Торвалдс представи изданието на ядрото Linux 7.2. Сред най-забележителните изменения са: механизма за потоково предаване на данни USB4STREAM, подобрения в производителността на btrfs, xfs и ext4, продължаващото премахване на кода за поддръжка на CPU i486, възможността за създаване на вложени планировчици SCHED_EXT, намалено потребление на памет в подсистемата за обмен на данни, ускорени неименувани канали, поддръжка на разширения Intel MBEC и AMD GMET в KVM, премахване на протокола AppleTalk и начална поддръжка на HDMI 2.1 FRL в драйвера AMDGPU.
Основни нововъведения в ядрото 7.2 (1, 2, 3):
- Дискова подсистема, вход/изход и файлови системи
- В механизма iomap е премахнат излишният извикване на функцията memset за вече завършени итерации във функцията iomap_iter(), което при висока интензивност на вход/изхода на бързи NVMe устройства увеличи в проведените тестове броя операции вход/изход в секунда (IOPS) с 5% при използване на файловите системи ext4 и xfs.
- В XFS е обявена стабилна поддръжка на зонирани устройства за съхранение (разделяне на зони на групи блокове или сектори, в които е разрешено само последователно добавяне на данни с обновяване на цялата група блокове).
- В Btrfs по подразбиране е включена поддръжка на големи страницы памет (large folios), което позволява намаляване на разходите и подобряване на производителността при интензивен последователен вход/изход. Добавена е експериментална поддръжка на огромни страницы («huge folios»), с размер до 2 MB. Въведен е нов ioctl GET_CSUMS за получаване на информация за контролни суми в потребителското пространство, например, за утилитата mkfs и оптимизация на дедупликацията. Повишена е производителността на последователното записване на данни с 15% и на директния вход/изход с 59%.
- В файловата система Ext4 значително е преработена реализацията на механизма «fast commit» за изключване на възможността от конкуриращи и взаимни блокировки. Добавен е експорт на статистиката за снапшотите inode чрез /proc/fs/ext4/*/fc_info. Оптимизирана е производителността на изчисляване на хешове на директории (за имена с размер 255 символа ускорението е почти двойно, 64 символа 27%, 32 символа — 11%).
- В F2FS е добавена поддръжка на връщане на грешки fserror, което позволява от потребителското пространство да се проследяват проблеми с файловата система. Намалено е времето, прекарано в контекста на обработка на прекъсвания.
- В Device Mapper (DM) е добавен нов обработчик dm-inlinecrypt за реализиране на прозрачно криптиране и декриптиране на блокови устройства, използвайки хардуерни устройства с функция за inline криптиране.
- Предложена е документация за добавяне на нови файлови системи в ядрото.
- В NFS размерът на блока по подразбиране е увеличен до 4 MB на системи с минимум 16 GB RAM (за ръчно променяне на размера на блока може да се използва /proc/fs/nfsd/max_block_size). Добавена е поддръжка на делегиране на управление на директорията на клиента (directory delegation), което позволява определен период от време да се извършват операции с тази директория без проверка на промените в състоянието. сървър.
- В SMB сървъра е добавена поддръжка за файлове, съхранявани в компресирана форма, както и компресия на данни при предаване по мрежата.
- В новата реализация на NTFS (ntfsplus) е добавена поддръжка на символни линкове на Windows и е осигурено коректно обработване на много видове повреди на метаданни.
- Премахнат е бекендът fscache за кеширане на данни за ФС EROFS (Enhanced Read-Only File System), който бе обявен за остарял преди две години.
- В Ceph ФС е добавена поддръжка на ръчно нулиране на клиентски сесии.
- В файловата система 9P са направени оптимизации, ускоряващи работата в сценарии като компилация на проекти.
- В системния повик file_getattr() са добавени флагове за получаване на информация относно чувствителността на регистъра на символите във файловата система. Флагът FS_XFLAG_CASEFOLD показва, че проверката на имената на файловете се извършва без оглед на чувствителността на регистъра, а флагът FS_XFLAG_CASENONPRESERVING указва, че при създаването на нови имена на файлове информацията за чувствителността на регистъра не се запазва. Указаните флагове могат да се използват в NFS клиенти, работещи без чувствителност към регистъра.
- В системния повик openat2() е добавен флагът O_EMPTYPATH, който позволява предаване на празен файлов път. В този случай пътят към отваряния файл се определя на базата на предадения файлов дескриптор.
- В системния повик openat2() е добавен флагът OPENAT2_REGULAR, който допуска отваряне само на обикновени файлове (при опит за отваряне на специален файл, например сокет, тръба или устройство, ще бъде върната грешка EFTYPE).
- Памет и системни услуги
- Реализиран е механизъм USB4STREAM за поточно предаване на данни между компютри, свързани с кабел през USB4 портовете. Добавено е устройството /dev/tbstreamX, с помощта на което могат да се четат и записват данни, използвайки стандартните функции read() и write(), подобно на четенето и записването на файлове. Например, на един хост може да се изпрати информация с командата „echo hello > /dev/tbstream0“, а на другия да се прочете с командата „cat /dev/tbstream0“. Механизмът USB4STREAM може да се комбинира с възможността за установяване на мрежова връзка през USB4 кабел (thunderbolt_net) или да се използва отделно при необходимост от предаване на данни между приложения, които не поддържат мрежови сокети.
- Включена е втора серия промени за прекратяване на поддръжката на процесорите i486. Премахнати са над 13 реда код, свързани с емулацията на блока за изчисления с плаваща запетая за процесори без FPU. Премахната е поддръжката на процесори i486 без хардуерни операции CX8 (сравни и разменяй 8 байта) и TSC (брояч на цикли на CPU, използван в планировчика на задачи), чийто код за емулация е премахнат.
- Обявена е поддръжката на процесорите AMD Geode, използвани в компютъра OLPC XO-1, като оставена без надзор (orphaned).
- Добавена е поддръжка за обновяване на реализацията на механизма Intel TDX (Trusted Domain Extensions), използван за криптиране на оперативната памет на гост системи. TDX е реализиран под формата на специален софтуерен runtime модул, който по време на начално зареждане се прехвърля от BIOS от Flash памет в оперативната памет. В ядрото са добавени възможности за управление на този модул и замяна на по-новата версия на работещата система без необходимост от перезареждане.
- Реализиран е нов планировчик за разпределение на ресурси GPU (Fair GPU scheduler), който се използва за определяне на реда на изпълнение на задачите на GPU, изпращани от процеси, използващи GPU. Вместо традиционната FIFO опашка за заявки към GPU, новият планировчик използва механизми за справедливо разпределение на ресурсите, вдъхновени от планировчика на задачи CFS (Completely Fair Scheduler), който прилага план за стартиране с време за превключване към изпълнение на следващия процес. Най-забележимият ефект от използването на новия планировчик се наблюдава при паралелно изпълнение на интерактивни задачи, които активно работят с GPU. В последния момент преди релиза на ядрото 7.2, включването на Fair GPU scheduler беше отменено и беше върнат старият FIFO планировчик заради необходимостта от отстраняване на проблеми, водещи до понижаване на производителността и 100% натоварване на GPU при стартиране на отделни игри в Proton.
- Промени в подсистемата eBPF: Добавена е възможността за прикрепване на една BPF програма към множество точки на проследяване (tracepoint). В BPF програмите, свързани с точки на проследяване, е добавена възможност за достъп до паметта на компоненти, работещи в потребителското пространство, с коректна обработка на достъпа до неразпределени страници на паметта (page fault). В системния повик bpf() е добавена поддръжка на типови атрибути (log_buf, log_size, log_level и log_true_size), което позволява унификация на предаване на метаданни за всички команди BPF, без да се ограничава до командите BPF_PROG_LOAD, BPF_BTF_LOAD и BPF_MAP_CREATE. Премахнато е ограничението за предаване на не повече от 5 параметъра в функцията BPF. Добавена е възможност за безопасен достъп до споделена памет bpf_arena без опасения от достъп до неразпределени страници на паметта (page fault). Реализиран е нов вариант на структурата BPF hash map, допускаща динамично изменение на размера.
- Оптимизирано е формирането на изхода от „/proc/interrupts“ със статистика за прекъсванията, а също така са модернизирани структурите за съхранение на броячи на прекъсвания и е добавено кеширане.
- Ускорена е генерацията на файла „/proc/filesystems“, използван в libselinux.
- В планировчика на задачите е реализирана поддръжка на балансировка на натоварването между ядрата на CPU, което отчита състоянието на вътрешната кеш памет на процесора. Планиращият сега се опитва да групира процеси, които използват общи ресурси, например потоци от един и същ процес, за да ги използва в контекста на един и същ кеш от най-високо ниво, което увеличава ефективността на достъпа до данни благодарение на повишената вероятност за намиране на необходимите данни в кеша.
- В механизма SCHED_EXT, който позволява използването на BPF за създаване на CPU планировчици, продължава реализацията на възможността за създаване на вложени планировчици (sub-scheduler), чрез които за всяка cgroup може да се задвижи собствен планировчик на задачи.
- Продължава преносът на промените от клона Rust-for-Linux, свързани с използването на езика Rust като втори език за разработка на драйвери и модули на ядрото (поддръжката на Rust не е активна по подразбиране и не води до включване на Rust в списъка с задължителни зависимости при компилация на ядрото). Възможността за използване на Rust в ядрото е реализирана за архитектурата s390. Включен е пакетът "zerocopy" с бързи примитиви за работа с паметта за код в режим "unsafe".
- Минималната версия на инструментариума LLVM, необходима за компилация на ядрото, е увеличена до 17.0.1.
- В минималистичната C-библиотека nolibc, която се предоставя в комплект с изходния код на ядрото на Linux и предлага обвивка над основните системни повиквания, е реализирана поддръжка на архитектурите OpenRISC и 32-битов PA-RISC.
- В подсистемата за своп (swap) са направени оптимизации, които увеличават производителността и намаляват потреблението на памет в самата подсистема, като изключват разходите за съхранение на статични метаданни и унифицират работата с анонимна и споделена памет при използване на фолианти. Намалението на потреблението на памет е значително, например, при монтиране на своп дял с размер 1 TB, се наблюдава намаление на паметта с около 512 MB.
- Увеличена е ефективността на механизма за изхвърляне на памет, който премахва или прехвърля в своп зоните на паметта за освобождаване на памет при недостиг в системата. В някои видове натоварвания, например, при тестване на MongoDB с YCSB (Yahoo! Cloud Serving Benchmark), се наблюдава увеличаване на производителността с до 30%.
- В сборочната система е добавена команда «make sbom» за генериране на списъци SBOM (Software Bill Of Materials), отразяващи компонентите, библиотеките и зависимостите, използвани в текущото изграждане на ядрото, както и информация за техните лицензи, получена от заглавията SPDX в файловете с код.
- В реализацията на неназованите канали (pipe) е проведена оптимизация на работата с блокировките (операциите по разпределение на паметта са извън обхвата на блокировката), което е повишило производителността на неназованите канали с 21-48% и е намалило забавянето с 17-33%.
- Виртуализация и безопасност
- В механизма за разпределение на паметта slab (slab allocator) е добавена възможността за използване на токени за разпределение на паметта (Allocation Token), реализирани в компилатора Clang 22. Токените позволяват маркирането на операции по разпределение на паметта с уникални идентификатори и организирането на отделно разпределяне на различни типове обекти, за усложняване на експлоатацията на уязвимости, причинени от препълване на буфера (при разделяне, препълването на буфера в един тип обекти не е лесно да се използва за повреждане на други типове обекти).
- Механизмът AF_ALG, експлоатиран в уязвимостта Copy Fail за модификация на данни в страничния кеш, е обявен за остарял и планиран за премахване в един от бъдещите версии. AF_ALG позволява използването на хардуерни ускорители за криптографски изчисления в Crypto API на ядрото, но се прилага в доста специфични ситуации. В ядрото 7.2 в AF_ALG е премахната поддръжката на асинхронен вход/изход, стари драйвери и механизма zero-copy в реализацията skcipher и aead. Останали са само софтуерните реализации на криптоалгоритмите, а поддръжката на хардуерни криптоускорители в crypto API на ядрото е премахната, тъй като AF_ALG значително разширява повърхността на атака, но не предоставя предимства в производителността в сравнение с реализацията на криптографията в потребителското пространство. AF_ALG е използван в инструмента Cryptsetup, но поддръжката му беше премахната в неотдавнашната версия 2.8.7.
- В механизма IMA (Integrity Measurement Architecture), който позволява на външна услуга да верифицира състоянието на подсистемите на ядрото, за да се увери в тяхната автентичност, е добавена поддръжка за експортиране на вътрешни таблици с резултати от измервания в потребителското пространство, с премахване от буферите на ядрото за спестяване на памет.
- В модула Landlock, който предоставя на непривилегировани програми средства за ограничаване на използването на обекти в ядрото на Linux (файлови иерархии, мрежови сокети, ioctl и др.), е добавена поддръжка за управление на достъпа до UDP-сокети, а също така възможност за селективно деактивиране на записите в лога за блокиране на обекти, за да се предотврати запълването на лога с незначителна информация.
- Ядрото се освободи от използването на функцията strncpy(), която копира зададен брой байтове от входящ низ. Използването на strncpy() създаваше риск от грешки поради пропуск на нулевия символ в края на низа или добавъчно запълване с нули. Препоръчва се вместо strncpy() да се използват функциите strscpy() и strscpy_pad() за копиране на низове, завършващи с нулев символ, а също и strtomem_pad(), memcpy_and_pad() и memcpy() за копиране на низове с известен фиксиран размер. Работата по освобождаването на ядрото от използването на strncpy() започна през 2020 година и изискваше приемането на 362 изменения от 70 разработчици.
- В хипервизора KVM Добавена е поддръжка на разширенията Intel MBEC (Mode-Based Execution Control) и AMD GMET (Guest-Mode Execution Trap), които позволяват в таблиците за транслация на паметта да се обработват отделно правата за изпълнение на код за ядрото и пространството на потребителя в гостуващите системи. По-рано разширенията за хардуерна виртуализация на Intel и AMD позволяваха маркирането на страници в паметта като достъпни за изпълнение само с един бит с софтуерно разделяне на правата за ядрото и пространството на потребителя на ниво хипервизор. Използването на MBEC и GMET дава възможност за изключване на проверките на правомощията от страна на хипервизора и значително намалява честотата на ресурсопотребителната предаване на управление от гостуващата система към хипервизора (VMexit).
- Мрежовата подсистема
- Реализацията на разширението TCP-AO (TCP Authentication Option, RFC 5925) е преобразувана, за да използва новата криптографска библиотека libcrypto, което е позволило опростяване на кода и повишаване на ефективността. TCP-AO дава възможност за верифициране на TCP-заглавията чрез MAC-кодове (Message Authentication Code), използвайки по-съвременни алгоритми HMAC-SHA-1-96 и AES-128-CMAC-96 вместо преди наличната опция TCP-MD5 на базата на остарелия алгоритъм MD5.
- Броят на субпотоковете, поддържани за връзки Multipath TCP (MPTCP), е увеличен от 8 на 64.
- Продължава работата по намаляване на използването на глобалната блокировка rtnl_lock в мрежовия стек на ядрото.
- От ядрото е премахната реализация на протоколния стек AppleTalk, който е използван в компютрите на Apple от 1985 година и беше заменен с TCP/IP през 90-те години. Освен това, премахнати са компонентите на технологията за предаване на данни ATM, несвързани с PPPoATM, както и мрежовите интерфейси ARCnet на база шини ISA и PCMCIA, Bluetooth адаптери с интерфейс PCMCIA, TLS ускорители Chelsea, код за интеграция на TLS с sockmap и поддръжката на честотни диапазони 5/10 MHz в безжичния стек cfg80211/mac80211. Поради нерешени проблеми с блокировките и липсата на поддръжка, специфичната реализация на ускоряване на обработката на TLS на базата на TCP Offload Engine е премахната (по-разпространената реализация на TLS offload е запазена). Изключен и планиран за премахване е кодът за съвместимост с 32-битови x_tables на 64-битови системи.
- В драйвера pppoe е добавена поддръжка на механизмите GRO (Generic Receive Offload) и GSO (Generic Segmentation Offload) за апаратно ускорение на повторното сглобяване и сегментиране на пакетите. Използването на GRO и GSO позволява значително увеличение на пропускателната способност за входящ трафик, например, на устройства MediaTek MT7621 в конфигурация с транслационен адрес, максималната пропускателна способност се е повишила от 130 Mbit/s на 630 Mbit/s.
- Оборудване
- В драйвера AMDGPU е добавена начална поддръжка на технологията HDMI 2.1 FRL (Fixed Rate Link), позволяваща предаване на несжат видеосигнал с качество 4K/120Hz и 8K/60Hz. Преди това поддръжката на HDMI 2.1 дълго време не можеше да бъде реализирана в отворени драйвери поради лицензионните изисквания на HDMI Forum, но сега компания AMD успя да постигне споразумение за подобна реализация.
- В драйвера i915 е добавена поддръжка за настройка на дисплея от дисплейния контролер за фонов цвят. Реализиран е параметърът pin_params.needs_low_address.
- Продължава работата върху drm драйвера (Direct Rendering Manager) Xe за GPU базирани на архитектурата Intel Xe, използвана в графичните карти на Intel от семейството Arc и интегрираната графика, започвайки с процесорите Tiger Lake. Добавена е начална поддръжка на платформата CRI (Crescent Island). За dGPU платформите Xe3p е реализиран системен контролер.
- В драйвера Nouveau са решени проблемите с GPU NVIDIA GA100.
- В драйвера v3d е добавена възможност за управление на енергопотреблението на v3D GPU на платките Raspberry Pi.
- Продължена интеграция на компонентите на драйвера Nova за GPU NVIDIA, с GSP фърмуер, използвани от серията NVIDIA GeForce RTX 2000 на базата на микроархитектура Turing. Драйверът е написан на Rust. Добавена е поддръжка за GPU NVIDIA GA100 и сериите Hopper и Blackwell.
- Добавена е поддръжка за ARM платформи, SoC и устройства: Apple t8122 (M3), Motorola Edge 30, Nothing Phone 3a, Google Pixel 3a XL, Qualcomm Dragonwing IPQ9650, Huawei Hawi, ZTE zx297520v3, Renesas R-Car M3Le, ASPEED AST27xx, Cortina Gemini, NXP i.MX6/8/9, NXP LX2160A, TI K3 AM62x.
Същевременно Латиноамериканският фонд за свободен софтуер разработи вариант на напълно свободното ядро 7.2 — Linux-libre 7.2-gnu, очистено от елементи на фърмуер и драйвери, съдържащи несвободни компоненти или части от код, чиято област на приложение е ограничена от производителя. В изданието 7.2 е проведена очистка от блобове на новите драйвери rt722-sdca и tac5xx2. Актуализиран е кодът за очистка в драйверите amdgpu, nova core, qcom iris, q6v5, iwlwifi, amdxnda, adreno, r8152 и mt792x. Направена е корекция на интерфейсите за зареждане на фърмуери. Извършена е очистка на имената на блобовете в dts файловете (devicetree) за ARM чипове.
Източник: opennet.ru
