Après deux mois de développement, Linus Torvalds a présenté la version 6.16 du noyau Linux. Parmi les changements les plus notables : un pilote pour accélérer OpenVPN, le mécanisme Kexec HandOver, l'activation par défaut des tables de pages mémoire à cinq niveaux pour x86, la suppression du protocole DCCP, le pilote de bloc zloop, la possibilité d'envoyer des core dumps via un socket UNIX, la prise en charge de l'écriture atomique dans XFS, le traitement offload du son pour les dispositifs USB, des optimisations dans Ext4, un pilote virtuel TPM (Trusted Platform Module), une implémentation complète de Device Memory TCP, la prise en charge des canaux anonymes dans io_uring, la préparation à l'intégration du pilote DRM Asahi, le mécanisme « usermode queue » dans le pilote AMDGPU, et la prise en charge de Intel TDE (Trusted Domain Extensions) et Intel APE (Advanced Performance Extensions).
La nouvelle version comprend 15 924 corrections de la part de 2 145 développeurs, la taille du patch étant de 50 Mo (les modifications ont touché 13 793 fichiers, 655 451 lignes de code ajoutées et 316 441 lignes supprimées). Lors de la dernière version, il y avait 15 945 corrections de 2 154 développeurs, et la taille du patch était de 59 Mo. Environ 45 % des changements introduits dans la version 6.16 concernent les pilotes de périphériques, environ 16 % des changements sont liés à la mise à jour de code spécifique aux architectures matérielles, 13 % concernent la pile réseau, 4 % concernent les systèmes de fichiers et 3 % les sous-systèmes internes du noyau.
Les principales nouveautés du noyau 6.16 :
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- Un pilote zloop a été ajouté pour créer des dispositifs de boucle zonés, montés en mode loop. Le pilote simule le fonctionnement de dispositifs de bloc ordinaires, utilisant plusieurs fichiers d'un système de fichiers existant (un fichier pour stocker chaque zone). Cette possibilité peut être utile pour tester des systèmes de fichiers, des gestionnaires de mappage de périphériques et des applications en termes de support des dispositifs zonés, appliquant une séparation en zones de groupes de blocs ou de secteurs, où seule une addition séquentielle de données est autorisée avec la mise à jour de l'ensemble du groupe de blocs.
- Dans le système de fichiers XFS, la prise en charge de l'écriture atomique de gros volumes de données a été implémentée : plusieurs blocs peuvent désormais être écrits en mode atomique (soit tous les blocs sont correctement écrits, soit aucun bloc n'est écrit).
- Dans le système de fichiers Ext4, la performance du mécanisme « fast commit » a été améliorée. Le support des grandes pages de mémoire (large folios) pour les fichiers normaux a été ajouté, ce qui a augmenté les performances de 37% lors de tests d'E/S séquentielles intensives. Le support des opérations d'écriture atomiques couvrant plusieurs blocs a également été ajouté.
- Dans le pilote pour le système de fichiers ext2, le support du mécanisme DAX, qui permet un accès direct au système de fichiers en contournant le cache de pages, a été déclaré obsolète. La suppression de DAX du pilote ext2 est prévue pour la fin de l'année. La raison mentionnée est la considération du pilote ext2 comme une réalisation de référence stable, où l'utilisation de fonctionnalités spécifiques, qui n'ont pas eu une large adoption, est inacceptable.
- Les systèmes de fichiers OrangeFS, UFS, BFS et OMFS ont été mis à jour pour utiliser une nouvelle API de montage des partitions.
- Une nouvelle configuration vfs_cache_pressure_denom a été ajoutée à sysctl pour gérer le nombre d'entrées dans le cache « dentry » (représentation interne des éléments de répertoire) en cas de pénurie de mémoire dans le système. Plus la valeur est élevée, plus les entrées peuvent être expulsées du cache (moins d'entrées resteront dans le cache) en cas de manque de mémoire.
- Dans le système de fichiers Bcachefs, une option « rebalance_on_ac_only » a été ajoutée, interdisant l'exécution d'opérations de rééquilibrage et de compression en arrière-plan lorsque le système fonctionne sur batterie. Les opérations de suppression de snapshots et de dispositifs ont été accélérées. La consommation de mémoire lors du montage en mode lecture seule a été réduite. Il est désormais possible de lancer certaines opérations de récupération après défaillance en arrière-plan, sans interrompre le fonctionnement du système de fichiers.
- Le sous-système de gestion de l'alimentation est désormais autorisé à geler de manière autonome les systèmes de fichiers et les variables EFI pour les modes veille et sommeil (si les systèmes de fichiers sont déjà gelés par un gestionnaire en espace utilisateur, un nouveau gel ne sera pas effectué).
- Il est désormais possible d'accélérer le fonctionnement d'EROFS à l'aide de l'accélérateur intégré QAT (QuickAssist Technology) dans les processeurs Intel, qui offre des outils pour accélérer les calculs liés à la compression et au chiffrement.
- Dans NFS, la taille maximale des lots de données pour les opérations de lecture et d'écriture a été augmentée de 1 à 4 Mo (la valeur par défaut est fixée à 1 Mo car tous les clients ne prennent pas en charge une taille plus grande).
- Les utilisateurs non privilégiés disposant des droits CAP_SYS_ADMIN dans un espace de noms d'identificateur utilisateur (user namespace), mais sans droits étendus dans l'espace de noms racine, ont la possibilité d'utiliser le mécanisme fanotify pour surveiller les modifications dans les systèmes de fichiers.
- Pour les systèmes de fichiers utilisant le sous-système FUSE, une fonctionnalité a été ajoutée pour purger toutes les entrées mises en cache concernant les répertoires (dentries) en une seule fois. Le sous-système FUSE a intégré le support pour de grandes pages mémoire.
- Dans le système de fichiers OverlayFS, la prise en charge de la création de couches de données dans des espaces de noms non privilégiés a été réalisée, utilisant un contrôle d'intégrité basé sur le module dm-verity. Cette possibilité permet de combiner des couches de métadonnées fiables avec des couches de données non fiables traitées dans des espaces de noms non privilégiés.
- Mémoire et services système
- Un mécanisme KHO (Kexec HandOver) a été ajouté pour démarrer un nouveau noyau à partir d'un ancien sans perte d'état du système. Avant de transférer le contrôle à la nouvelle version du noyau, l'état des sous-systèmes clés du noyau peut être sérialisé dans une zone de mémoire qui ne sera pas affectée par les opérations ultérieures. Le nouveau noyau, en prenant le contrôle, restaure l'état sérialisé. Sur la base de KHO, le sous-système Live Update Orchestrator (LUO) se développe, permettant de redémarrer le noyau sans arrêter le fonctionnement des dispositifs.
- Un paramètre de construction du noyau CONFIG_X86_NATIVE a été ajouté, permettant d'utiliser l'option « -march=native » lors de la compilation pour optimiser en fonction des capacités du processeur dans le système actuel.
- Le support pour l'extension de l'architecture du jeu d'instructions Intel APX (Advanced Performance Extension) a été ajouté, fournissant 16 registres généraux supplémentaires (en plus des 16 existants), ce qui permet de réduire le nombre d'opérations de lecture et d'écriture en mémoire pour améliorer les performances et réduire la consommation d'énergie.
- Un mode d'ajustement automatique de la politique de répartition de la mémoire dans les systèmes NUMA a été ajouté, dans lequel tous les poids des nœuds sont recalculés lors de l'apparition de nouvelles informations sur la bande passante pendant le chargement ou lors de l'ajout à chaud de mémoire.
- L'implémentation des futex a introduit le support d'une table de hachage locale des processus (local futex_hash_bucket), qui, contrairement à la table de hachage globale précédemment prise en charge pour tous les processus, est locale à un processus distinct et est partagée par tous les threads de ce processus. Les tables de hachage locales ne sont appliquées qu'aux opérations futex PROCESS_PRIVATE. De plus, dans cette nouvelle version, le support des options FUTEX2_NUMA et FUTEX2_MPOL a été ajouté, permettant d'influencer l'emplacement des futex en mémoire, pour les rapprocher des processus qui les utilisent.
- Pour les systèmes x86_64, le support permanent des tables de pages mémoire à cinq niveaux (le paramètre CONFIG_X86_5LEVEL, qui contrôlait l'activation des tables à cinq niveaux, a été supprimé) est intégré.
- Dans le pilote intel_pstate, qui gère les paramètres de consommation d'énergie (P-state) sur les systèmes avec processeurs Intel, le support de l'ordonnanceur de tâches prenant en compte la consommation d'énergie (EAS - Energy Aware Scheduling) a été ajouté pour les processeurs hybrides, combinant des cœurs CPU haute performance et économes en énergie, tels que l'Intel Lunar Lake.
- Des interfaces ont été ajoutées dans sysfs : « /sys/devices/system/cpu/cpuN/cpu_capacity » pour obtenir des informations sur les capacités des différents CPU dans les processeurs hybrides et « /sys/devices/system/cpu/cpuidle/intel_c1_demotion » pour gérer la possibilité de laisser le CPU dans un état plus performant, même si le noyau tente de faire passer le CPU dans un état de consommation d'énergie plus basse (par exemple, le noyau peut demander un passage dans l'état de consommation d'énergie C6, mais le firmware, en cas de forte intensité de réveil du CPU, peut le laisser dans l'état C1).
- Pour l'architecture ARM64, le support pour le mode de préemption paresseux (PREEMPT_LAZY, lazy preemption) a été intégré, qui correspond au mode de préemption totale (« full preemption ») pour les tâches en temps réel (RR/FIFO/DEADLINE), mais retarde la préemption des tâches normales (SCHED_NORMAL) jusqu'à la limite de tick.
- Pour l'architecture ARM64, le support des extensions SME (Scalable Matrix Extension) a été ajouté, activé par le paramètre CONFIG_ARM64_SME.
- La migration des modifications de la branche Rust-for-Linux se poursuit, concernant l'utilisation du langage Rust comme deuxième langage pour le développement de pilotes et de modules du noyau (le support de Rust n'est pas activé par défaut, et n'entraîne pas l'inclusion de Rust parmi les dépendances de construction obligatoires du noyau). Pour les modules écrits en Rust, il est maintenant possible d’utiliser configfs. Des abstractions nécessaires au développement de pilotes graphiques ont été ajoutées. Les capacités des modules alloc, time, str, list, workqueue et page ont été étendues. Le support du macro « assert! » a été ajouté pour les tests basés sur KUnit. Un ensemble d'abstractions pour gérer la fréquence du CPU et utiliser les API liées à la gestion de la consommation d'énergie a été ajouté. Le support de la structure de données ‘xarray’ a été introduit.
- Pour l'architecture RISC-V, l'implémentation de l'appel système getrandom() a été transférée, optimisée par le mécanisme vDSO (objet partagé dynamique virtuel), permettant de déplacer le gestionnaire de l'appel système du noyau vers l'espace utilisateur et d'éviter les changements de contexte. Les tests effectués montrent que l'optimisation a accéléré l'obtention de nombres aléatoires par 17 fois. Le support des extensions vectorielles Zicbop, Zabha et Svinval, utilisées dans les processeurs SiFive, a également été réalisé pour RISC-V.
- Pour l'architecture LoongArch, la limite du nombre de CPU dans le système a été portée de 256 à 2048. Le support du planificateur de tâches SCHED_MC (Multi-core) a été ajouté.
- La possibilité d'utiliser des sockets Unix pour la transmission de descripteurs de fichiers a été ajoutée. Pour désactiver cette fonctionnalité, les applications peuvent utiliser le flag SO_PASSRIGHTS dans setsockopt().
- Il est désormais possible de mapper le tampon circulaire, utilisé pour le traçage des opérations du noyau, en mémoire de l'espace utilisateur.
- Les gestionnaires de crash-dump, utilisés pour générer un rapport de problème après un crash du noyau, peuvent maintenant utiliser les clés LUKS utilisées par le noyau défaillant pour sauvegarder les crash-dumps dans des systèmes de fichiers chiffrés.
- L'opération IORING_OP_PIPE a été ajoutée au système d'entrée/sortie asynchrone io_uring pour créer des canaux anonymes, similaire à l'appel système pipe2, à l'exception du support des descripteurs de fichiers fixes.
- Une option de ligne de commande du noyau « rt_group_sched » a été ajoutée pour contrôler l'activation du planificateur d'exécution des groupes de tâches realtime (SCHED_RR). Cette option est similaire au paramètre RT_GROUP_SCHED dans Kconfig.
- Pour les dispositifs basés sur le bus CXL (Compute Express Link), utilisé pour organiser une interaction à haute vitesse entre le CPU et les dispositifs de mémoire, la prise en charge des extensions RAS (Reliability, Availability, Serviceability) a été mise en œuvre, permettant d'implémenter différents schémas de détection et de correction des erreurs. CXL permet de connecter de nouveaux domaines de mémoire, fournis par des dispositifs de mémoire externes, et de les utiliser comme ressources supplémentaires dans l'espace d'adressage physique pour étendre la mémoire vive système (DDR) ou la mémoire permanente (PMEM).
- La version minimale nécessaire pour compiler le noyau est désormais relevée à la branche GCC 8 pour toutes les architectures. Pour la compilation, la version minimale de l'ensemble de packages binutils 2.30 est également requise.
- L'appel système uselib() a été supprimé, celui-ci étant obsolète depuis longtemps, et mmap() est désormais utilisé pour accéder aux bibliothèques partagées par les programmes.
- Virtualisation et sécurité
- Un support initial pour le mécanisme Intel TDX (Trusted Domain Extensions) a été ajouté, permettant de protéger les systèmes invités fonctionnant sous l'hyperviseur KVM contre les interventions et analyses du système hôte et les attaques physiques sur le matériel. La protection est assurée par le chiffrement de la mémoire. machines virtuelles.
- Un pilote virtuel TPM (Trusted Platform Module) a été ajouté, permettant aux machines virtuelles d'interagir avec les dispositifs TPM (Trusted Platform Module) émulés par le module SVSM (Secure VM Service Module).
- La possibilité d'utiliser le plugin GCC randstruct, qui randomise la disposition des structures de données lors de la compilation pour compliquer l'exploitation des vulnérabilités, a été rétablie.
- La possibilité d'utiliser la technologie IMA (Integrity Measurement Architecture) pour vérifier l'intégrité lors du démarrage de nouveaux noyaux à l'aide de l'appel système kexec a été ajoutée.
- Des efforts ont été déployés pour réduire l'impact sur les performances de l'utilisation de SELinux. Un cache avec les résultats des vérifications d'accès aux répertoires a été ajouté pour améliorer la rapidité d'exécution. Les règles genfscon ont été mises à jour pour permettre l'utilisation de masques.
- Dans le code d'interaction avec EFI, la possibilité d'intégrer la section SBAT (UEFI Secure Boot Advanced Targeting) avec des métadonnées sur les versions de composants de démarrage révoquées a été fournie.
- Les modules chargés ont effectué le passage de la section «.static_call_sites» en mode lecture seule après l'initialisation.
- Pour les systèmes ARM 64 bits, le hyperviseur KVM prend en charge la virtualisation imbriquée (désactivée par défaut).
- Le support stable de l'architecture RISC-V a été déclaré dans le hyperviseur KVM.
- Sous-système réseau
- Un pilote ovpn a été intégré, permettant d'améliorer considérablement les performances d'OpenVPN en déchargeant les opérations de chiffrement, de traitement des paquets et de gestion de la connexion vers le noyau Linux. Ce pilote permet d'éliminer les frais généraux liés aux changements de contexte, optimise le fonctionnement grâce à un accès direct aux API internes du noyau et exclut le transfert lent de données entre le noyau et l'espace utilisateur (le chiffrement, le déchiffrement et le routage s'effectuent sans envoyer le trafic au gestionnaire de l'espace utilisateur).
- Le mécanisme Device Memory TCP a été enrichi pour permettre l'envoi de données depuis la mémoire de l'appareil (chemin TX). Auparavant, pour simplifier l'intégration de Device Memory TCP dans le noyau, la fonctionnalité était limitée à la réception de données (chemin RX). Device Memory TCP permet d'utiliser des sockets réseau pour l'envoi direct du contenu de la mémoire d'un périphérique sur le réseau (mode zero-copy), ainsi que le placement direct du contenu des paquets réseau dans la mémoire de l'appareil du côté du récepteur. Les données transmises dans les paquets passent de la carte réseau à la mémoire du périphérique (DMABUF), par exemple, la mémoire vidéo du GPU, ou vice versa, de la mémoire de l'appareil à la carte réseau directement, sans passer par le CPU, tandis que les en-têtes des paquets finissent dans les buffers normaux du noyau.
- Il est maintenant possible d'envoyer le contenu des core dumps via des sockets AF_UNIX, ce qui permet de créer des gestionnaires de core dumps plus sécurisés dans l'espace utilisateur, sans dépendre d'appels à des processus privilégiés du noyau.
- Le support du protocole réseau DCCP (Datagram Congestion Control Protocol) a été supprimé, ce protocole n'ayant pas eu d'adoption et étant resté dans le noyau sans maintenance pendant cinq ans. La suppression de DCCP du noyau éliminera les obstacles à la refonte de la structure de données inet_connection_sock afin d'améliorer l'efficacité de la pile TCP. Le support des modules netfilter pour le filtrage des paquets DCCP a été conservé.
- Pour faciliter le traitement des erreurs lors de l'utilisation des sockets SO_PEERPIDFD, le noyau peut désormais transmettre un pidfd pour les processus déjà terminés (le pidfd est lié à des processus spécifiques et, contrairement au pid, il n'est pas réassigné).
- Avec BPF, il est désormais possible de créer des gestionnaires pour le contrôle des files d'attente de paquets dans la pile réseau (qdiscs) afin d'influencer l'ordre de traitement des paquets réseau.
- Dans le système de fichiers réseau AFS, GSSAPI (Generic Security Services API) est utilisé pour gérer le chiffrement des connexions avec serveurs très chargés YFS et OpenAFS.
- Une grande quantité d'optimisations a été apportée. L'organisation des verrous pour les tables de routage IPv6 a été revue (certaines opérations sur les routes sont désormais effectuées jusqu'à 3 fois plus rapidement). Le calcul logiciel des sommes de contrôle crc32c a été accéléré. Le moteur GRO pour le trafic UDP encapsulé a été amélioré de 10%. L'auto-réglage du tampon de réception pour TCP a été optimisé et les limites par défaut augmentées (dans les tests réalisés, la bande passante pour des flux isolés à travers un canal de 200 Gbs a augmenté de 60%).
- Dans Netfilter, la possibilité d'utiliser des masques dans les noms des appareils réseau, utilisés dans netdev et flowtable, a été ajoutée. Les informations de suivi des connexions (conntrack) ont été intégrées à l'infrastructure nft trace. L'extraction des tables de suivi des connexions (conntrack) à travers procfs a été accélérée.
- Matériel
- Le support de la décharge du traitement des flux audio vers les dispositifs audio avec interface USB (USB audio offload) a été ajouté. Ce changement permet de réduire considérablement la consommation d'énergie des appareils portables en continuant le traitement du flux audio pendant que le reste du système est en mode veille. Auparavant, des implémentations spécifiques de déchargement du traitement audio pour des appareils USB étaient fournies dans les noyaux pour la plateforme Android, mais maintenant une implémentation universelle est disponible dans le noyau principal, pouvant être utilisée par tous les projets.
- L'intégration des composants du pilote Nova pour les GPU NVIDIA dotés de firmwares GSP, utilisés depuis la série NVIDIA GeForce RTX 2000 basée sur l'architecture Turing, a été poursuivie. Le pilote est écrit en Rust. En plus du composant nova-core ajouté dans la version précédente, qui met en œuvre un niveau d'abstraction de base au-dessus des interfaces logicielles de firmwares GSP, la version 6.16 inclut une implémentation initiale du pilote DRM nova-drm (Direct Rendering Manager) pour interagir avec le GPU depuis l'espace utilisateur.
- Le processus de promotion dans le noyau du pilote DRM Asahi pour les GPU Apple AGX, utilisés dans les puces Apple Silicon, a commencé. Le pilote est écrit en Rust. À ce stade, seuls les fichiers d'en-tête UAPI du pilote Asahi, nécessaires pour Mesa, ont été inclus dans le noyau, et le code principal du pilote Asahi sera intégré ultérieurement.
- Le pilote Nouveau a ajouté la prise en charge des GPU NVIDIA de la famille Hopper et Blackwell.
- Le travail sur le pilote drm (Direct Rendering Manager) Xe pour les GPU basés sur l'architecture Intel Xe, qui est utilisé dans les cartes graphiques Intel de la famille Arc et la graphique intégrée à partir des processeurs Tiger Lake, a été poursuivi. La possibilité d'utiliser différents fichiers de firmware pour différentes familles de GPU Intel a été ajoutée.
- Dans le pilote AMDGPU, la prise en charge du mécanisme « usermode queue » a été implémentée, ce qui permet de créer des files d'attente de travail personnalisées dans l'espace utilisateur et de les envoyer directement au GPU sans passer par le planificateur dans le noyau. La prise en charge de « usermode queue » est activée pour les GPU Navi 4X et GFX 12.
- La prise en charge des systèmes audio Intel WCL (Whiskey Lake), AMD ACP 7.x (Audio Co-Processor), Cirrus Logic CS35L63 et CS48L32, Everest Semiconductor ES8375 et ES8389, Pioneer DJM-V10, Longsoon-1 AC’97, NVIDIA Tegra264, Richtek ALC203, RT9123 et Rockchip SAI, ainsi que de nouvelles plateformes Intel AVS a été ajoutée.
- La prise en charge des plates-formes ARM, des SoC et des dispositifs suivants a été ajoutée : Samsung Exynos7870, Qualcomm Snapdragon X1P42100, Qualcomm MSM8926, RK3562, NXP i.MX94, Renesas RZ/V2N, Amlogic S6/S7/S7D, WonderMedia wm8950, Amlogic s805y, Allwinner A523, Toradex Verdin AM62P, ROCK 5B+, Nitrogen8M Plus, Retronix R-Car V4H Sparrow Hawk, MT8186 Ponyta Chromebook, VIA APC Rock/Paper, Renesas rz/t2h, ASUS Transformer Pad LTE TF300TL, LG Nexus 4, Google Pixel 4a, Raspberry Pi 2.
- Le pilote pour les cartes d'acquisition vidéo basées sur les puces STA2X11 a été supprimé.
En même temps, la Fondation latino-américaine pour le logiciel libre a formé une variante entièrement libre du noyau 6.16 — Linux-libre 6.16-gnu, nettoyé des éléments de firmwares et de pilotes contenant des composants non libres ou des extraits de code dont l'utilisation est limitée par le fabricant. Dans la version 6.16, le chargement de blobs a été neutralisé dans les nouveaux pilotes Intel qat 6xxx crypto, ST vd55g1 sensor, ath12k AHB wifi, Aeonsemi AS21xxx et MediaTek 25Gb Ethernet. Les noms des blobs dans les fichiers dts (devicetree) pour les puces ARM de Qualcomm et MediaTek ont été nettoyés. Le code de nettoyage des blobs dans les pilotes Nova Core, Nouveau, Realtek r8169 Ethernet, Qualcomm Iris, Venus, Mediatek mt7996 wifi, Qualcomm ath11k et ath12k wifi, Texas Instruments tas2781 et Renesas R-Car gen4 PCIe a été mis à jour.
Source : opennet.ru
