Après deux mois de développement, Linus Torvalds a présenté la version du noyau Linux 5.12. Parmi les changements les plus notables : la prise en charge des appareils de bloc zonés dans Btrfs, la possibilité de mapper les identifiants d'utilisateurs pour le système de fichiers, le nettoyage des anciennes architectures ARM, le mode d'écriture « impatient » dans NFS, le mécanisme LOOKUP_CACHED pour déterminer les chemins de fichiers à partir du cache, la prise en charge des instructions atomiques dans BPF, le système de débogage KFENCE pour identifier les erreurs de gestion de la mémoire, un mode de poll NAPI fonctionnant dans un thread séparé du noyau dans la pile réseau, l'hyperviseur ACRN, la possibilité de modifier à la volée le modèle de préemption dans le planificateur de tâches et la prise en charge des optimisations LTO lors de la compilation avec Clang.
La nouvelle version a reçu 14170 corrections (contre 15480 dans la version précédente) provenant de 1946 développeurs (1991), la taille du patch étant de 38 Mo (les modifications concernent 12102 fichiers, 538599 lignes de code ajoutées, 333377 lignes supprimées). Environ 43 % de toutes les modifications présentées dans la version 5.12 sont liées aux pilotes de périphériques, environ 17 % concernent la mise à jour de code spécifique aux architectures matérielles, 12 % sont liées à la pile réseau, 5 % aux systèmes de fichiers et 4 % aux sous-systèmes internes du noyau.
Les principales nouveautés :
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- La possibilité de mapper les identifiants d'utilisateurs pour les systèmes de fichiers montés a été mise en œuvre (il est possible d'associer les fichiers d'un utilisateur sur une partition montée d'un autre utilisateur à un autre utilisateur dans le système actuel). Le mappage est pris en charge pour les systèmes de fichiers FAT, ext4 et XFS. Cette fonctionnalité proposée permet de simplifier le partage de fichiers entre différents utilisateurs et sur différents ordinateurs, y compris le mappage qui sera appliqué dans le mécanisme des répertoires personnels portables systemd-homed, permettant aux utilisateurs de déplacer leurs répertoires personnels sur des supports externes et de les utiliser sur différents ordinateurs dont la répartition des identifiants d'utilisateurs ne correspond pas. Une autre application utile est l'organisation du partage de fichiers depuis un hôte externe, sans modifier effectivement les données sur les propriétaires de fichiers dans le système de fichiers.
- Le noyau a intégré des correctifs LOOKUP_CACHED, permettant d'effectuer des opérations de résolution de chemins de fichiers à partir de l'espace utilisateur sans blocage, uniquement sur la base des données mises en cache. Le mode LOOKUP_CACHED est activé lors de l'appel openat2() en passant le drapeau RESOLVE_CACHED, où les données sont fournies uniquement à partir du cache, et si la résolution du chemin nécessite un accès au périphérique de stockage, une erreur EAGAIN est retournée.
- Le système de fichiers Btrfs a ajouté un support initial pour les dispositifs de blocs zonés (dispositifs sur disques durs ou SSD NVMe, dont l'espace de stockage est divisé en zones constituant des groupes de blocs ou de secteurs, où seules des écritures séquentielles de données sont autorisées avec une mise à jour de l'ensemble du groupe de blocs). En mode lecture seule, un support pour les blocs contenant des métadonnées et des données de taille inférieure à la page (subpage) a été mis en œuvre.
- Le système de fichiers F2FS a ajouté la possibilité de choisir l'algorithme et le niveau de compression. Un support pour un niveau élevé de compression pour l'algorithme LZ4 a été ajouté. Une option de montage checkpoint_merge a été mise en œuvre.
- Une nouvelle commande ioctl FS_IOC_READ_VERITY_METADATA a été mise en œuvre pour lire les métadonnées à partir de fichiers protégés par fs-verity.
- Le client NFS a introduit un mode d'écriture "eager" (writes=eager), dans lequel les opérations d'écriture dans le fichier sont immédiatement transmises au serveur, contournant le cache de pages. Ce mode permet de réduire la consommation de mémoire, offre une information immédiate sur la disponibilité de l'espace libre dans le FS et, dans certaines situations, permet d'améliorer les performances.
- Dans CIFS (SMB), de nouvelles options de montage ont été ajoutées : acregmax pour gérer la mise en cache des fichiers et acdirmax pour gérer la mise en cache des métadonnées de répertoire.
- Dans XFS, le mode de vérification des quotas multithreads a été activé, l'exécution de fsync a été accélérée, et le code de growfs a été préparé pour implémenter la fonctionnalité de réduction de la taille du FS.
- Mémoire et services système
- Un sous-système DTMP (Dynamic Thermal Power Management) a été ajouté, permettant de réguler dynamiquement la consommation d'énergie de divers dispositifs sur la base des contraintes de température globales définies.
- La possibilité de compiler le noyau avec le compilateur Clang incluant des optimisations au moment de la liaison (LTO, Link Time Optimization) a été réalisée. Les optimisations LTO diffèrent par la prise en compte de l'état de tous les fichiers participants au processus de compilation, alors que les modes d'optimisation traditionnels optimisent chaque fichier séparément sans tenir compte des conditions d'appel des fonctions définies dans d'autres fichiers. Par exemple, avec LTO, l'inlining des fonctions d'autres fichiers est possible, le code non utilisé n'est pas inclus dans l'exécutable, la vérification des types est effectuée, et une optimisation globale au niveau du projet est réalisée. Le support de LTO est actuellement limité aux architectures x86 et ARM64.
- La possibilité de choisir des modes de préemption (PREEMPT) dans le planificateur de tâches au moment du démarrage (preempt=none/voluntary/full) ou pendant l'exécution via debugfs (/debug/sched_debug) a été fournie, en cas d'indication de la configuration PREEMPT_DYNAMIC lors de la compilation du noyau. Auparavant, le mode de préemption ne pouvait être défini qu'au niveau des paramètres de compilation. Ce changement permet aux distributions de fournir des noyaux avec le mode PREEMPT activé, garantissant des délais minimaux pour les bureaux au prix d'une légère diminution de la capacité, et de revenir, si nécessaire, aux modes PREEMPT_VOLUNTARY (mode intermédiaire pour les bureaux) ou PREEMPT_NONE (assurant une capacité maximale). serveurs).
- La prise en charge des opérations atomiques BPF_ADD, BPF_AND, BPF_OR, BPF_XOR, BPF_XCHG et BPF_CMPXCHG a été ajoutée au sous-système BPF.
- Les programmes BPF ont désormais la possibilité d'accéder aux données de la pile via des pointeurs avec un décalage variable. Par exemple, auparavant, pour accéder à un tableau dans la pile, seule l'utilisation d'un index d'élément fixe était possible, mais maintenant, un index variable peut être utilisé. L'accès est contrôlé uniquement dans les limites existantes par le vérificateur BPF. Cette possibilité n'est disponible que pour les programmes privilégiés en raison de la crainte d'exploitation de vulnérabilités liées à l'exécution spéculative du code.
- La possibilité d'attacher des programmes BPF à des points de trace 'nus' (bare tracepoints), non liés aux événements de traçage visibles dans l'espace utilisateur (pour ces points de trace, la préservation de l'ABI n'est pas garantie), a été ajoutée.
- La prise en charge du bus CXL 2.0 (Compute Express Link) a été mise en œuvre, utilisée pour organiser une interaction haute vitesse entre le CPU et les dispositifs de mémoire (permettant d'utiliser des dispositifs de mémoire externes comme partie de la RAM ou de la mémoire persistante, comme si cette mémoire était connectée via un contrôleur de mémoire standard dans le CPU).
- Un pilote nvmem a été ajouté pour obtenir des données des zones de mémoire réservées par les firmwares, directement inaccessibles pour Linux (par exemple, la mémoire EEPROM, physiquement accessible uniquement par le firmware, ou des données accessibles uniquement à un stade précoce du démarrage).
- Le support du système de profilage « oprofile » a été supprimé, car il n'a pas été largement adopté et a été remplacé par le mécanisme plus moderne perf.
- L'interface d'entrée/sortie asynchrone io_uring a été intégrée avec les cgroups, contrôlant l'utilisation de la mémoire.
- Pour l'architecture RISC-V, le support des systèmes NUMA a été implémenté ainsi que les mécanismes kprobes et uprobes.
- Il est désormais possible d'utiliser l'appel système kcmp() indépendamment des fonctionnalités de snapshots d'état des processus (checkpoint/restore).
- Les macros EXPORT_UNUSED_SYMBOL() et EXPORT_SYMBOL_GPL_FUTURE() ont été supprimées, car elles ne sont plus utilisées en pratique depuis de nombreuses années.
- Virtualisation et sécurité
- Un mécanisme de protection KFence (Kernel Electric Fence) a été ajouté, qui capture les erreurs lors de la manipulation de la mémoire, telles que le dépassement de tampon et l'accès après libération de mémoire. Contrairement au mécanisme de débogage KASAN, la sous-système KFence se distingue par sa rapidité et ses faibles coûts, permettant de capturer les erreurs de gestion de la mémoire qui ne se manifestent que sur des systèmes de production ou lors d'une longue exécution.
- La prise en charge de l'hyperviseur ACRN a été ajoutée, écrit avec une attention particulière à sa capacité à exécuter des tâches en temps réel et à sa pertinence pour les systèmes critiques. ACRN garantit des frais généraux minimal, assure de faibles latences (low latency) et une réactivité adéquate lors des interactions avec le matériel. La virtualisation des ressources CPU, des entrées/sorties, des sous-systèmes réseau, des opérations graphiques et sonores est prise en charge. ACRN peut être utilisé pour exécuter plusieurs environnements isolés. machines virtuelles dans les blocs de commande électroniques, les tableaux de bord, les systèmes d'information automobile, les appareils IoT grand public et d'autres dispositifs embarqués. ACRN prend en charge deux types de systèmes invités : les Service VM privilégiées, qui sont utilisées pour gérer les ressources du système (CPU, mémoire, entrée/sortie, etc.), et les User VM, dans lesquelles peuvent être exécutés des distributions Linux, Android et Windows.
- Dans le sous-système IMA (Integrity Measurement Architecture), qui maintient une base de hachages pour la vérification de l'intégrité des fichiers et des métadonnées associées, il est désormais possible de vérifier l'intégrité des données du noyau lui-même, par exemple, pour suivre les modifications des règles SELinux.
- La possibilité d'intercepter les appels du système hyperviseur Xen et de les transmettre à un émulateur fonctionnant dans l'espace utilisateur a été ajoutée au hyperviseur KVM.
- Il est désormais possible d'utiliser Linux comme environnement racine pour l'hyperviseur Hyper-V. L'environnement racine a un accès direct au matériel et est utilisé pour exécuter des systèmes invités (analogue à Dom0 dans Xen). Jusqu'à présent, Hyper-V (Microsoft Hypervisor) ne prenait en charge Linux que dans des environnements invités, mais l'hyperviseur lui-même était géré depuis un environnement basé sur Windows.
- Ajout du support pour le chiffrement inline sur les cartes eMMC, permettant d'utiliser les mécanismes de chiffrement intégrés au contrôleur de stockage, qui effectuent un chiffrement et un déchiffrement transparents des entrées/sorties.
- La prise en charge des hachages RIPE-MD 128/256/320 et Tiger 128/160/192, ainsi que du chiffrement par flux Salsa20, a été supprimée du sous-système de cryptographie et remplacée par l'algorithme ChaCha20. L'algorithme blake2 a été mis à jour vers l'implémentation blake2s.
- Sous-système réseau
- Ajout de la possibilité de déplacer le gestionnaire de polling NAPI des dispositifs réseau dans un thread séparé du noyau, ce qui permet d'améliorer les performances pour certains types de charge. Auparavant, le polling était effectué dans le contexte de softirq et n'était pas couvert par le planificateur de tâches, ce qui compliquait l'optimisation fine pour maximiser les performances. L'exécution dans un thread séparé du noyau permet d'observer le gestionnaire de polling depuis l'espace utilisateur, de l'attacher à des coeurs CPU séparés et de le prendre en compte lors de la planification des commutations de tâches. Un paramètre /sys/class/net//threaded a été proposé dans sysfs pour activer le nouveau mode.
- L'intégration au noyau MPTCP (MultiPath TCP), une extension du protocole TCP pour l'établissement de connexions TCP permettant la livraison de paquets simultanément par plusieurs routes à travers différentes interfaces réseau liées à différentes adresses IP, a été prolongée. La nouvelle version permet d'attribuer des priorités à des flux spécifiques, ce qui permet, par exemple, de mettre en place des flux de secours qui s'activent uniquement en cas de problème avec le flux principal.
- Le support du mécanisme EHT (Explicit Host Tracking) a été ajouté dans IGMPv3.
- Dans le mécanisme de filtrage des paquets netfilter, il est désormais possible de posséder certaines tables pour obtenir un contrôle exclusif (par exemple, un processus en arrière-plan du pare-feu peut s'approprier certaines tables en interdisant à d'autres d'y intervenir).
- Matériel
- Un nettoyage des plateformes ARM obsolètes et sans support a été réalisé. Le code des plateformes efm32, picoxcell, prima2, tango, u300, zx et c6x, ainsi que leurs pilotes associés, a été supprimé.
- Le driver amdgpu a mis en œuvre la possibilité d'overclocking (OverDrive) pour les cartes basées sur le GPU Sienna Cichlid (Navi 22, Radeon RX 6xxx). Le support du format pixel FP16 pour le DCE (display controller engine) de 8e à 11e génération a été ajouté. Pour le GPU Navy Flounder (Navi 21) et l'APU Van Gogh, la possibilité de réinitialiser le GPU a été mise en œuvre.
- Dans le driver i915 pour les cartes graphiques Intel, le paramètre i915.mitigations a été introduit pour désactiver les mécanismes d'isolation et de protection au profit de l'amélioration des performances. Pour les puces à partir de Tiger Lake, le support du mécanisme VRR (Variable Rate Refresh) a été activé, permettant de modifier dynamiquement la fréquence de rafraîchissement de l'écran pour garantir une fluidité sans saccades pendant les jeux. Le support de la technologie Intel Clear Color pour améliorer la précision des couleurs a été inclus. Le support de DP-HDMI 2.1 a été ajouté. La possibilité de contrôler le rétroéclairage des panneaux eDP a été mise en œuvre. Pour les GPU Gen9 avec support LSPCON (Level Shifter and Protocol Converter), le support HDR a été activé.
- Le driver nouveau a ajouté un support initial des GPU NVIDIA basés sur l'architecture GA100 (Ampere).
- Le driver msm a ajouté le support des GPU Adreno 508, 509 et 512 utilisés dans les puces SDM (Snapdragon) 630, 636 et 660.
- Le support des cartes son Sound BlasterX AE-5 Plus, Lexicon I-ONIX FW810s et Pioneer DJM-750 a été ajouté. Le support de la sous-système audio Intel Alder Lake PCH-P a été ajouté. La prise en charge de la simulation logicielle de connexion et de déconnexion du port audio pour le débogage des gestionnaires dans l'espace utilisateur a été mise en œuvre.
- Ajout du support des consoles de jeux Nintendo 64, produites entre 1996 et 2003 (les précédentes tentatives de portage de Linux pour Nintendo 64 n'ont pas été menées à bien et avaient le statut de Vaporware). Comme motivation pour la création d'un nouveau port pour cette plateforme obsolète, qui n'est plus produite depuis presque vingt ans, on évoque le désir de stimuler le développement des émulateurs et de simplifier le portage des jeux.
- Ajout d'un pilote pour la manette de jeu Sony PlayStation 5 DualSense.
- Ajout du support pour les plateformes ARM, les appareils et les plates-formes : PineTab, Snapdragon 888 / SM8350, Snapdragon MTP, Two Beacon EmbeddedWorks, Intel eASIC N5X, Netgear R8000P, Plymovent M2M, Beacon i.MX8M Nano, NanoPi M4B.
- Ajout du support pour les smartphones Purism Librem5 Evergreen, Xperia Z3+/Z4/Z5, ASUS Zenfone 2 Laser, BQ Aquaris X5, OnePlus6, OnePlus6T, Samsung GT-I9070.
- Ajout du pilote bcm-vk pour les cartes accélératrices Broadcom VK (par exemple, les cartes PCIe Valkyrie et Viper), qui peuvent être utilisées pour décharger sur un appareil séparé les opérations de traitement audio, vidéo et images, ainsi que les actions liées au chiffrement.
- Ajout du support pour la plateforme Lenovo IdeaPad avec la possibilité de gérer la charge continue et l'éclairage du clavier. Le support du profil ACPI de la plateforme ThinkPad avec possibilité de gestion des modes de consommation d'énergie a également été assuré. Ajout d'un pilote pour le sous-système HID Lenovo ThinkPad X1 Tablet Gen 2.
- Ajout du pilote ov5647 avec support du module caméra pour Raspberry Pi.
- Ajout du support RISC-V SoC FU740 et des cartes HiFive Unleashed. Un nouveau pilote pour la puce Kendryte K210 a également été ajouté.
Source : opennet.ru
