Версия на ядрото на Linux 5.3

След два месеца разработка Линус Торвалдс подадено освобождаване на ядрото Linux 5.3. Сред най-забележителните промени: поддръжка за графични процесори AMD Navi, процесори Zhaoxi и технология за управление на захранването Intel Speed ​​​​Select, възможност за използване на инструкции umwait за изчакване без използване на цикли,
режим „затягане на използването“, който увеличава интерактивността за асиметрични процесори, системното извикване pidfd_open, възможността за използване на IPv4 адреси от подмрежата 0.0.0.0/8, възможността за хардуерно ускорение на nftables, поддръжка на HDR в подсистемата DRM, интегриране на ACRN хипервизор.

В съобщение нова версия, Линус напомни на всички разработчици основното правило на разработката на ядрото - поддържане на същото поведение за компонентите на потребителското пространство. Промените в ядрото не трябва по никакъв начин да прекъсват вече работещите приложения или да водят до регресия на ниво потребител. В този случай нарушението на поведението може да причини не само промяна в ABI, премахване на остарял код или поява на грешки, но и косвено въздействие на полезни подобрения, които работят правилно. Като нагледен пример имаше изхвърлени полезен оптимизация в код Ext4, което намалява броя на достъпите до устройството, като деактивира предварителното четене на inode таблицата за малки I/O заявки.

Оптимизацията доведе до факта, че поради намаляване на активността на диска, ентропията за генератора на случайни числа getrandom() започна да се натрупва по-бавно и в някои конфигурации, при определени обстоятелства, можеше да се наблюдава замръзване по време на зареждане, докато ентропийният пул не беше запълнена. Тъй като оптимизацията е наистина полезна, сред разработчиците възникна дискусия, в която беше предложено да се реши проблемът чрез деактивиране на режима на блокиране по подразбиране на повикването getrandom() и добавяне на незадължителен флаг за изчакване на ентропия, но такава промяна би засегнала качество на произволните числа в началния етап на зареждане.

Новата версия включва 15794 1974 корекции от XNUMX XNUMX разработчици,
размер на корекцията - 92 MB (промените засегнаха 13986 файла, бяха добавени 258419 реда код,
599137 премахнати реда). Около 39% от всички представени в 5.3
промените са свързани с драйвери на устройства, приблизително 12% от промените са
отношение към актуализирането на кода, специфичен за хардуерните архитектури, 11%
свързани с мрежовия стек, 3% с файловите системи и 3% с вътрешните
подсистеми на ядрото.

Основната иновации:

  • Памет и системни услуги
    • Продължаващо развитие на функционалността „pidfd“ за подпомагане справянето със ситуации на повторно използване на PID (pidfd е свързан с конкретен процес и не се променя, докато PID може да бъде свързан с друг процес, след като текущият процес, свързан с този PID, приключи). Преди това беше добавен към ядрото
      системното извикване pidfd_send_signal() и флага CLONE_PIDFD в извикването clone() за получаване на pidfd за използване в idfd_send_signal(). Използването на clone() с флага CLONE_PIDFD може да причини проблеми с мениджърите на услуги или системата за принудително прекратяване на липсата на памет на платформата Android. В този случай за стартиране се използва извикване на fork() или clone() без CLONE_PIDFD.

      Ядрото 5.3 въведе системния разговор pidfd_open(), което ви позволява да получите проверяем pidfd за произволен съществуващ процес, който не е създаден чрез извикване на clone() с флага CLONE_PIDFD. Също така е добавена поддръжка за анкетиране на pidfd с помощта на poll() и epoll(), което позволява на мениджърите на процеси да проследяват прекратяването на произволни процеси, без да се страхуват от състояние на състезание, ако PID е присвоен на нов процес. Механизмът за уведомяване, че процес, свързан с pidfd, е прекратен, е същият като уведомяването, че неговият дъщерен процес е прекратен;

    • Поддръжката на механизма за фиксиране на натоварването е добавена към планировчика на задачи (Захващане за използване), което ви позволява да се придържате към минималните или максималните честотни диапазони, в зависимост от задачите, активни на процесора. Представеният механизъм ускорява задачите, които пряко влияят върху качеството на потребителското изживяване, като изпълнява тези задачи поне в долния край на „заявената“ честота. Задачите с нисък приоритет, които не засягат работата на потребителя, се стартират с помощта на горната граница на „разрешената“ честота. Ограниченията се задават чрез атрибутите sched_uclamp_util_min и sched_uclamp_util_max в системното извикване sched_setattr().
    • Добавена е поддръжка за технология за управление на енергията Intel Speed ​​​​Select, наличен на избрани сървъри с процесори Intel Xeon. Тази технология ви позволява да задавате настройки за производителност и пропускателна способност на дялове за различни ядра на процесора, което ви позволява да приоритизирате производителността за задачи, изпълнявани на определени ядра, като жертвате производителността на други ядра;
    • Процеси в потребителското пространство предоставено способността да изчаквате за кратко време, без да използвате цикли, използвайки инструкцията umwait. Тази инструкция, заедно с инструкциите за umonitor и tpause, ще бъдат предложени в предстоящите чипове „Tremont“ на Intel и ще позволят прилагането на закъснения, които са енергийно ефективни и не влияят върху производителността на други нишки при използване на Hyper Threading;
    • За архитектурата RISC-V е добавена поддръжка за големи страници с памет;
    • Механизмът за проследяване на kprobes добави възможността за дерефериране на указатели на ядрото към потребителско пространство, което може да се използва, например, за оценка на съдържанието на структури, предадени на системни извиквания. Добавена е и възможност за инсталиране на проверки на етапа на зареждане.
    • Добавена е опция PREEMPT_RT към конфигурационния файл за работа в реално време. Самият код за поддръжка на режим в реално време все още не е добавен към ядрото, но появата на опцията е добър знак, че дългосрочната епопея интеграция Realtime-Preempt корекциите са към завършване;
    • Добавено системно извикване clone3() с внедряване на по-разширяема версия на интерфейса clone(), което позволява указване на по-голям брой флагове;
    • Добавен манипулатор bpf_send_signal(), позволяващ на BPF програмите да изпращат сигнали до произволни процеси;
    • За perf събития в средата на KVM хипервайзор е добавен нов механизъм за филтриране на събития, позволяващ на администратора да определи типовете събития, които са разрешени или не разрешени за наблюдение от страна на системата за гости;
    • Възможността за обработка на програми с цикли е добавена към механизма за проверка на приложението eBPF, ако изпълнението на цикъла е ограничено и не може да доведе до превишаване на ограничението за максимален брой инструкции;
  • Дискова подсистема, I/O и файлови системи
    • Файловата система XFS вече поддържа многонишков байпас на inode (например при проверка на квоти). Добавени са нови ioctl BULKSTAT и INUMBERS, осигуряващи достъп до функциите, които се появиха в петото издание на FS формата, като време на раждане на inode и възможност за задаване на параметрите BULKSTAT и INUMBERS за всяка AG група (групи за разпределение);
    • В Ext4 добавена поддръжка празнини в директории (несвързани блокове).
      Осигурена обработка флаг “i” (неизменен) за отворени файлове (забранено е записването в ситуация, ако флагът е зададен в момент, когато файлът вече е бил отворен);

    • Btrfs предоставя дефиниция за бързо внедряване на crc32c на всички архитектури;
    • В CIFS кодът за поддръжка на smbdirect е премахнат като експериментална разработка. SMB3 добави възможност за използване на криптографски алгоритми в режим GCM. Добавена е нова опция за монтиране за извличане на параметри на режима от записи на ACE (Access Control Entry). Оптимизира производителността на open() повикването;
    • Добавена е опция към F2FS за ограничаване на събирача на боклук, когато работи в режим checkpoint=disable. Добавен е ioctl за премахване на блокови диапазони от F2FS, което позволява корекции на размера на дяла в движение. Добавена е възможност за поставяне на суап файл във F2FS, за да се осигури директен I/O. Добавена е поддръжка за фиксиране на файл и разпределяне на блокове за подобни файлове за всички потребители;
    • Добавена е поддръжка за асинхронни операции sendmsg() и recvmsg() към интерфейса за асинхронен вход/изход io_uring;
    • Поддръжка за компресия с помощта на алгоритъма zstd и възможност за проверка на подписани FS изображения са добавени към файловата система UBIFS;
    • Ceph FS вече поддържа SELinux етикети за сигурност за файлове;
    • За NFSv4 е внедрена нова опция за монтиране „nconnect=“, която определя броя на връзките, установени със сървъра. Трафикът между тези връзки ще бъде разпределен чрез балансиране на натоварването. В допълнение, NFSv4 сървърът вече създава директория /proc/fs/nfsd/clients с информация за текущите клиенти, включително информация за файловете, които те са отворили;
  • Виртуализация и сигурност
    • Ядрото включва хипервизор за вградени устройства ACRN, който е написан с оглед на готовност за задачи в реално време и пригодност за използване в критични за мисията системи. ACRN осигурява минимални разходи, гарантира ниска латентност и адекватна реакция при взаимодействие с оборудването. Поддържа виртуализация на CPU ресурси, I/O, мрежова подсистема, графики и звукови операции. ACRN може да се използва за стартиране на множество изолирани виртуални машини в електронни контролни блокове, табла, автомобилни информационни системи, потребителски IoT устройства и други вградени технологии;
    • В потребителски режим Linux добавено Режим на пътуване във времето, който ви позволява да забавите или ускорите времето във виртуална UML среда, за да улесните отстраняването на грешки в кода, свързан с времето. Освен това е добавен параметър
      time-travel-start, което позволява на системния часовник да започне от определен момент във формат на епоха;

    • Добавени са нови опции на командния ред на ядрото „init_on_alloc“ и „init_on_free“, когато е посочено, е разрешено нулиране на разпределени и освободени области на паметта (запълване с нули за malloc и free), което позволява повишена сигурност поради допълнителни разходи за инициализация;
    • Добавен нов драйвер virtio-iommu с внедряването на паравиртуализирано устройство, което ви позволява да изпращате IOMMU заявки като ATTACH, DETACH, MAP и UNMAP през virtio транспорта, без да емулирате таблици на страници в паметта;
    • Добавен нов драйвер virtio-pmem, представляващ достъп до устройства за съхранение, нанесени на физическо адресно пространство, като NVDIMM;
    • Реализирана е възможността за прикачване на криптографски ключове към потребителско или мрежово пространство от имена (ключовете стават недостъпни извън избраното пространство от имена), както и защита на ключове с помощта на ACL;
    • Към крипто подсистемата добави поддръжка за много бърз некриптографски алгоритъм за хеширане xxhash, чиято скорост зависи от производителността на паметта;
  • Мрежова подсистема
    • Активирана обработка на IPv4 адреси в диапазона 0.0.0.0/8, който преди това не беше достъпен за използване. Представяне на тази подмрежа ще позволи разпределете още 16 милиона IPv4 адреса;
    • В Netfilter за nftables добави поддръжка на механизми за хардуерно ускорение за филтриране на пакети чрез използване на добавени драйвери Flow Block API. Цели таблици с правила с всички вериги могат да бъдат поставени отстрани на мрежовите адаптери. Активирането се извършва чрез обвързване на флага NFT_TABLE_F_HW към таблицата. Поддържа прости метаданни на протокола Layer 3 и Layer 4, действия за приемане/отхвърляне, съпоставяне по IP и мрежови портове на подател/получател и тип протокол;
    • Добавено от вградена поддръжка за проследяване на връзката за мрежови мостове, която не изисква използването на емулиращия слой br_netfilter;
    • В nf_tables добави поддръжка на модула SYNPROXY, който репликира подобна функционалност от iptables, както и възможност за проверка на правила за отделни опции в IPv4 хедъра;
    • Добавена е възможност за прикачване на BPF програми към системните повиквания setsockopt() и getsockopt(), което например ви позволява да прикачвате свои собствени манипулатори за достъп към тези повиквания. Освен това е добавена нова точка за повикване (кука), с която можете да организирате повикване към програмата BPF веднъж за всеки RTT интервал (време за двупосочно пътуване, време за пинг);
    • За IPv4 и IPv6 добавено нов механизъм за съхранение на данни за маршрутизиране на nexthop, насочен към увеличаване на скалируемостта на таблиците за маршрутизиране. Тестовете показаха, че при използване на новата система набор от 743 хиляди маршрута е зареден в ядрото само за 4.3 секунди;
    • За Bluetooth изпълнени функционалност, необходима за поддръжка на LE ping;
  • Оборудование
    • Добавено от поддръжка за x86-съвместими процесори на компанията Жаоксин, разработен в резултат на съвместен проект между VIA Technologies и община Шанхай. Семейството ZX CPU е изградено върху архитектурата x86-64 Isaiah, продължавайки развитието на технологиите VIA Кентавър;
    • Подсистемата DRM (Direct Rendering Manager), както и графичните драйвери amdgpu и i915, добавиха поддръжка за анализиране, обработка и изпращане на HDR (висок динамичен диапазон) метаданни през HDMI порта, което позволява използването на HDR панели и екрани, способни на показване на допълнителни диапазони на яркост;
    • Драйверът amdgpu добави първоначална поддръжка за AMD NAVI GPU (RX5700), която включва базовия драйвер, код за взаимодействие с екрана (DCN2), GFX и изчислителна поддръжка (GFX10),
      SDMA 5 (система DMA0), управление на захранването и мултимедийни енкодери/декодери (VCN2). amdgpu също подобрява поддръжката за карти, базирани на GPU Vega12 и Vega20, за които са добавени допълнителни възможности за памет и управление на захранването;

    • Добавена е поддръжка за карти, базирани на VegaM GPU към драйвера amdkfd (за дискретни GPU, като Fiji, Tonga, Polaris);
    • В DRM драйвера за видеокарти Intel за чипове Icelake изпълнени нов многосегментен режим на гама корекция. Добавена е възможност за извеждане през DisplayPort във формат YCbCr4:2:0. Добавен нов фърмуер GuC за SKL, BXT, KBL, GLK и ICL. Реализирана е възможността за изключване на захранването на екрана в асинхронен режим. Добавено от поддръжка за запазване и възстановяване на контекста на рендиране за чипове Ironlake (gen5) и gen4 (Broadwater - Cantiga), което ви позволява да възстановите състоянието на GPU от потребителското пространство, когато преминавате от една партидна операция към друга;
    • Драйверът Nouveau осигурява откриване на чипсета NVIDIA Turing TU116;
    • Възможностите на драйвера DRM/KMS за екранни ускорители ARM Komeda (Mali D71) са разширени, има поддръжка за мащабиране, разделяне/сливане на слоеве, ротация, отложен запис, AFBC, SMMU и формати за кодиране на цветове Y0L2, P010, YUV420_8/10BIT добавено е;
    • Драйверът MSM добавя поддръжка за серията A540 GPU Adreno, използвана в процесорите на Qualcomm, както и поддръжка за контролера MSM8998 DSI за Snapdragon 835;
    • Добавени драйвери за LCD панели Samsung S6E63M0, Armadeus ST0700, EDT ETM0430G0DH6, OSD101T2045-53TS,
      Evervision VGG804821, FriendlyELEC HD702E, KOE tx14d24vm1bpa, TFC S9700RTWV43TR-01B, EDT ET035012DM6 и VXT VL050-8048NT-C01;

    • Добавено драйвер за активиране на инструменти за ускоряване на декодиране
      видеоклипове, налични в Amlogic Meson SoC;

    • В драйвера v3d (за Broadcom Video Core V GPU, използван в Raspberry Pi) се появи подкрепа изпращане на изчислителни шейдъри;
    • Добавено драйвер за SPI клавиатури и тракпадове, използвани в съвременните модели лаптопи Apple MacBook и MacBookPro;
    • Добавено от допълнителна защита за ioctl повиквания, свързани с флопи драйвера, а самият драйвер е маркиран като неподдържан
      („осиротяло“), което предполага прекратяване на тестването му. Драйверът все още се съхранява в ядрото, но правилната му работа не е гарантирана. Драйверът се счита за остарял, тъй като е трудно да се намери работещо оборудване за тестването му - всички текущи външни устройства, като правило, използват USB интерфейса.

    • Добавено cpufreq драйвер за Raspberry Pi платки, който ви позволява динамично да контролирате промените в честотата на процесора;
    • Добавена е поддръжка за нов ARM SoC Mediatek mt8183 (4x Cortex-A73 + 4x Cortex-A53), TI J721E (2x Cortex-A72 + 3x Cortex-R5F + 3 DSP + MMA) и Amlogic G12B (4x Cortex-A73 + 2x Cortex- A53 ), както и табла:
      • Пуризъм Librem5,
      • Aspeed BMC,
      • Microsoft Olympus BMC,
      • Kontron SMARC,
      • Novtech Meerkat96 (i.MX7),
      • ST Micro Avenger96,
      • Google Cheza (Qualcomm SDM845),
      • Qualcomm Dragonboard 845c (Qualcomm SDM845),
      • Hugsun X99 TV Box (Rockchip RK3399),
      • Khadas Edge/Edge-V/Captain (Rockchip RK3399),
      • HiHope RZ/G2M,
      • NXP LS1021A-TSN.

В същото време латиноамериканската фондация за свободен софтуер образувани
вариант напълно безплатно ядро ​​5.3 - Linux-libre 5.3-gnu, изчистени от елементи на фърмуера и драйвера, съдържащи несвободни компоненти или кодови секции, чийто обхват е ограничен от производителя. В новата версия зареждането на петна е деактивирано в драйверите qcom, hdcp drm, allegro-dvt и meson-vdec.
Актуализиран код за почистване на петна в драйвери и подсистеми amdgpu, i915, netx, r8169, brcmfmac, rtl8188eu, adreno, si2157, pvrusb2, touchscreen_dmi, звуков драйвер за skylake, както и в документацията на микрокода.

Източник: opennet.ru

Добавяне на нов коментар