Après deux mois de développement, Linus Torvalds a présenté la sortie du noyau Linux 6.17. Parmi les changements les plus notables : amélioration des performances de Btrfs, des appels système file_getattr() et file_setattr(), unification des configurations mono et multiprocesseur dans le planificateur de tâches, module DAMON_STAT pour les statistiques d'accès à la mémoire, prise en charge des Live Patches sur les systèmes ARM64, envoi de core dumps via socket AF_UNIX, limitation SCHED_EXT via cgroup, simplification de la configuration de protection contre les vulnérabilités dans le CPU, compilation avec Clang en initialisant les variables sur la pile, protection contre la falsification de /proc, extension du sous-système RV (Runtime Verification), restriction des sockets AF_UNIX via AppArmor, algorithme de contrôle des surcharges TCP DualPI2.
La nouvelle version comprend 14334 corrections de 2118 développeurs, la taille du patch est de 46 Mo (les changements ont concerné 12841 fichiers, 646654 lignes de code ajoutées et 398782 lignes supprimées). Dans la version précédente, on comptait 15924 corrections de 2145 développeurs, la taille du patch était de 50 Mo. Environ 43% des changements présentés dans 6.17 concernent les pilotes de périphériques, environ 12% des changements sont liés à la mise à jour de code spécifique aux architectures matérielles, 14% sont liés à la pile réseau, 4% aux systèmes de fichiers et 3% aux sous-systèmes internes du noyau.
Les principales innovations dans le noyau 6.17 (1, 2, 3) :
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- Dans Btrfs, un support expérimental pour les grandes folios de pages mémoire a été ajouté, permettant de réduire les coûts et d'améliorer les performances de plusieurs opérations. La mise en cache des requêtes sur les cartes de bits de distribution de l'espace libre a été mise en œuvre, grâce à quoi la performance de création de fichiers vides a augmenté de 20%. Le préchargement a été amélioré sur les systèmes utilisant la compression de données. Un placement plus compact des clés dans la structure XArray a été assuré, ce qui a permis d'augmenter la compacité de stockage des nœuds d'arbre d'extensions et de réduire le nombre de nœuds terminaux de 50 à 70%. Des réglages supplémentaires pour l'utilisation de la compression dans les extensions défragmentées ont été fournis.
- Dans le système de fichiers ext4, la prise en charge de l'E/S en mémoire tampon avec le drapeau RWF_DONTCACHE a été ajoutée, où les données sont supprimées du cache de pages immédiatement après la fin de l'opération.
- Dans le système de fichiers EROFS, la prise en charge de la compression des métadonnées a été implémentée.
- Le serveur NFS peut maintenant déléguer des opérations d'écriture aux clients ouvrant des fichiers en mode écriture seule.
- L'appel système fallocate() a été ajouté avec le flag FALLOC_FL_WRITE_ZEROES, permettant de remplir de zéros une plage spécifiée dans un fichier, en utilisant une commande WRITE_ZERO prise en charge par certains disques SSD, réalisant la mise à zéro sans opérations d'entrée/sortie. Cette option est actuellement disponible uniquement dans le système de fichiers ext4.
- Des appels système file_getattr() et file_setattr() ont été ajoutés pour manipuler les attributs d'inodes d'un fichier donné.
- Le pilote « pktcdvd » pour le fonctionnement avec des supports optiques en mode paquet, qui avait été marqué comme obsolète en 2016, a été supprimé.
- Le système de fichiers Bcachefs dans le noyau Linux a été transféré en mode de maintien externe, ce qui implique l'arrêt de l'acceptation des modifications pour Bcachefs dans le noyau principal tout en maintenant ce système de fichiers dans le code de base du noyau. Le développement de Bcachefs se fera en dehors du code de base du noyau tant que Kent Overstreet ne prouvera pas la possibilité d'interagir correctement avec d'autres développeurs du noyau et de suivre les règles de développement établies.
- Mémoire et services système
- Le planificateur de tâches a supprimé le support des configurations à processeur unique. Sur les systèmes à un seul processeur, il est désormais nécessaire d'utiliser des noyaux construits pour des systèmes multiprocesseurs (SMP). Le code pour les systèmes à un processeur et à plusieurs processeurs a été unifié et débarrassé des attaches inutiles au paramètre du noyau CONFIG_SMP.
- Un module du noyau DAMON_STAT (Statistiques des résultats de surveillance d'accès aux données) a été ajouté, permettant de suivre l'accès à la mémoire vive en utilisant le sous-système DAMON (Data Access MONitor). Le module fournit des statistiques sur l'inactivité (memory_idle_ms_percentiles) et la bande passante mémoire estimée (estimated_memory_bandwidth).
- Sur les systèmes avec architecture ARM64, le support des Live patches a été implémenté, permettant d'appliquer des correctifs au noyau Linux à chaud, sans redémarrage ni arrêt du système.
- Dans la bibliothèque C minimaliste nolibc, fournie avec les sources du noyau Linux et offrant une interface pour les appels système de base, le support des architectures SuperH, x32, MIPS n32 et MIPS n34 a été ajouté.
- La possibilité d'envoyer le contenu des core dumps via le socket AF_UNIX a été étendue, permettant de créer des gestionnaires de core dumps plus sécurisés dans l'espace utilisateur, sans dépendre de l'appel de processus privilégiés par le noyau. La nouvelle version inclut un protocole pour la création. serveurs, capables de gérer le traitement des core dumps au niveau des tâches individuelles. Par exemple, certains processus peuvent ignorer les core dumps, tandis que d'autres peuvent les transmettre via un socket. Un prototype de serveur a été spécifiquement préparé pour gérer les core dumps.
- Ajout de l'option de ligne de commande du noyau « crashkernel=size,cma » pour réserver de la mémoire via CMA (Contiguous Memory Allocator) pour conserver le core dump du noyau.
- Les capacités du mécanisme pidfd ont été étendues, permettant d'utiliser des identifiants liés à des processus spécifiques qui, contrairement au pid, ne peuvent pas être réaffectés. Ajout de la possibilité de lier des attributs étendus à partir de l'espace utilisateur à un pidfd. Ouverture de descripteurs de fichiers pour pidfd via la fonction open_by_handle_at() sans liaison au système de fichiers. Les informations internes créées par le noyau avec le pidfd sont désormais liées au processus, et non au pidfd, et sont conservées entre les réouvertures du même processus.
- Une fonction bpf_cgroup_read_xattr() a été ajoutée au sous-système BPF pour lire les attributs étendus des fichiers. Il est désormais possible d'utiliser dans les programmes BPF des opérations de chaîne de caractères standard telles que bpf_strcmp, bpf_strnchr, bpf_strchrnul, bpf_strlen et bpf_strspn, fonctionnant en mode lecture seule. Ajout de la possibilité d'utiliser les flux standard stdout et stderr pour interagir avec les composants de l'espace utilisateur. Pour les systèmes basés sur l'architecture LoongArch, la possibilité de modification dynamique du code, du mécanisme « BPF trampoline » (réduit les frais généraux lors du transfert d'appels entre le noyau et les programmes BPF) et d'exécution de programmes utilisant struct_ops pour créer des gestionnaires de fonctions noyau via BPF a été réalisée.
- Dans le système de gestion du temps, un support pour des horloges auxiliaires a été mis en œuvre, qui ne sont pas liées aux horloges système ordinaires et fonctionnent à leur propre rythme (auparavant, toutes les horloges fonctionnaient à un rythme identique et ne variaient que par décalage).
- Un initial support pour l'exécution proxy a été ajouté pour atténuer les problèmes d'inversion des priorités. L'exécution proxy permet à une tâche attendant la libération d'un verrou de transmettre son contexte d'exécution à la tâche maintenant le verrou, afin d'accélérer la libération de ce verrou.
- La migration des modifications de la branche Rust-for-Linux a été poursuivie, concernant l'utilisation du langage Rust en tant que deuxième langage pour le développement de pilotes et de modules de noyau (le support de Rust n'est pas activé par défaut et n'entraîne pas l'ajout de Rust parmi les dépendances de construction obligatoires pour le noyau). Des abstractions ont été ajoutées pour la gestion des régulateurs de tension et de courant, des propriétés de firmware, des ressources d'entrée/sortie et de mémoire d'entrée/sortie. Le macro « warn_on!() » a été implémenté. Un type UserPtr a été ajouté pour les pointeurs dans l'espace utilisateur. Les fonctionnalités des modules workqueue, uaccess, dma, time et list ont été étendues. Un module ‘bits’ a été ajouté, avec des fonctions ‘bit’ et ‘genmask’.
- Le code pour le calcul des sommes de contrôle CRC a été retravaillé et de nouveaux appels pour générer des hachages SHA-1 et SHA-2 ont été ajoutés. Des optimisations spécifiques à l'architecture matérielle ont été intégrées. La performance de la fonction crc32c() a été améliorée sur les nouveaux processeurs x86_64 prenant en charge l'extension VPCLMULQDQ (Vector Carry-Less Multiplication of Quadwords).
- Un support pour l'éviction dans la zone de swap et la migration de grandes pages mémoire (transparent huge page) a été implémenté pour les systèmes S390.
- Une option pour configurer l'agressivité de la libération des pages mémoire (proactive-reclaim) en cas de pénurie a été ajoutée en lien avec des nœuds NUMA spécifiques, permettant de désigner des nœuds NUMA pour lesquels une libération de mémoire plus active sera appliquée. Par exemple, « echo «512M swappiness=10″ > /sys/devices/system/node/node1/reclaim ».
- Dans le mécanisme SCHED_EXT, qui permet d'utiliser BPF pour créer des planificateurs CPU, une fonctionnalité de gestion de la bande passante via cgroup a été ajoutée. Par exemple, le paramètre cpu.max peut être utilisé pour limiter la charge sur le CPU.
- Le montage automatique de la FS virtuelle tracefs dans le répertoire /sys/kernel/debug/tracing a été déclaré obsolète, et il convient d'utiliser à la place /sys/kernel/tracing.
- Virtualisation et sécurité
- Ajout de la possibilité d'activer protection contre les vulnérabilités du CPU via le choix des vecteurs d'attaque à bloquer. au lieu de spécifier dans les paramètres des vulnérabilités spécifiques. Les méthodes de blocage sont sélectionnées en fonction du type de violation d'isolation : entre l'utilisateur et le noyau (user-kernel), entre l'utilisateur et un autre utilisateur (user-user), entre le système invité et l'environnement hôte (guest-host), entre différents systèmes invités (guest-guest) et entre différents threads (cross-thread). L'approche proposée permet d'activer uniquement la protection contre les classes de vulnérabilités qui préoccupent réellement l'utilisateur. Par exemple, les propriétaires d'environnements cloud peuvent activer les modes guest-host et guest-guest, après quoi les méthodes de protection contre les vulnérabilités BHI, GD, L1TF, MDS, MMIO, Retbleed, RFDS, Spectre_v2, SRBDS, SRSO et TAA seront activées.
- Ajout de la prise en charge de la compilation avec le compilateur Clang en incluant le mode de suivi de la profondeur de la pile, dans lequel toutes les variables stockées dans la pile sont initialisées. L'initialisation est effectuée pour prévenir les fuites d'informations depuis le noyau via des variables non initialisées, qui peuvent contenir des résidus de données précédemment sauvegardées dans la pile. Avant cela, une possibilité similaire était prise en charge en utilisant le plugin GCC STACKLEAK.
- Ajout de la protection contre la falsification par un attaquant du système de fichiers /proc via le montage en mode « bind ». Le numéro d'inode de la racine de /proc est désormais fixe (PROCFS_ROOT_INO) et peut être vérifié par un processus dans l'espace utilisateur.
- Dans le sous-système RV (Runtime Verification), destiné à vérifier la conformité des systèmes hautement fiables, un composant de surveillance rtapp (Real-time application monitor) a été ajouté pour suivre les problèmes typiques dans les applications fonctionnant en temps réel, ainsi que des composants rp, sssw et opid pour tester le planificateur de tâches. La possibilité de créer des composants de surveillance utilisant une logique temporelle linéaire pour déterminer le modèle de comportement a été mise en œuvre, au lieu d'un automate déterministe. La vérification est effectuée à l'exécution en raccordant des gestionnaires à des points de traçage, comparant le cours réel d'exécution à un modèle de référence préalablement défini, définissant le comportement prévu du système.
- Le système AppArmor a été enrichi d'une gestion des accès aux sockets AF_UNIX.
- Dans l'hyperviseur KVM sur les systèmes ARM, la prise en charge du contrôleur d'interruption GICv5 a été implémentée.
- Ajout de la configuration CONFIG_KVM_IOAPIC, permettant de désactiver la prise en charge de l'émulation APIC, PIC et PIT dans KVM.
- Ajout d'une protection contre la vulnérabilité VMSCAPE.
- Ajout de la commande ioctl FS_IOC_GETLBMD_CAP pour obtenir des informations sur l'application des moyens de protection de l'intégrité d'un fichier depuis l'espace utilisateur.
- L'interface /sys/fs/selinux/user est déclarée obsolète, et son accès entraîne désormais un retard de cinq secondes avec un avertissement dans le journal.
- Sous-système réseau
- La mise en œuvre de la technologie PSE (Power Sourcing Equipment), utilisée pour alimenter des dispositifs tels que des caméras IP et des points d'accès sans fil via Ethernet, a été enrichie d'un support pour des stratégies d'évaluation du budget d'alimentation configurables (pouvoir total disponible). Ces stratégies permettent de déterminer quels ports doivent être désactivés en premier pour éviter la surcharge.
- La mise en œuvre du protocole MCTP (Management Component Transport Protocol) a ajouté un support pour le routage des paquets vers des nœuds externes via des nœuds intermédiaires (gateway-routing). Par exemple, les règles suivantes permettent d'acheminer les paquets vers le nœud avec l'identifiant 10 (Endpoint ID 10) via l'appareil mctpi2c0, utilisant l'adresse 0x1d, directement connectée au nœud avec l'identifiant 9. mctp route add 9 via mctpi2c0 mctp neigh add 9 dev mctpi2c0 lladdr 0x1d mctp route add 10 gw 9
- Pour les sockets UNIX (AF_UNIX), l'option SO_INC est mise en œuvre, et pour la famille d'adresses VSOCK, l'option SIOCINQ. Les options mises en œuvre sont similaires à l'option TCP_INQ pour TCP et permettent d'obtenir des informations sur le nombre d'octets disponibles dans le socket pour la lecture via un message de contrôle.
- Pour le TCP, une stricte conformité à la taille de fenêtre de réception déclarée a été introduite, définissant la taille des données pouvant être envoyées avant de recevoir une confirmation ACK de l'autre partie. Auparavant, le noyau continuait à traiter les données dépassant la taille de fenêtre de réception déclarée, mais cela ne sera plus le cas.
- Dans le MPTCP (Multipath TCP), la possibilité d'utiliser l'option de socket TCP_MAXSEG pour limiter la taille maximale des segments envoyés a été ajoutée. Le MPTCP est une extension du protocole TCP permettant de livrer des paquets simultanément par plusieurs chemins via différentes interfaces réseau, liées à différentes adresses IP.
- Ajout du support de l'algorithme de contrôle de congestion TCP DualPI2 (RFC 9332), qui permet d'utiliser des contrôleurs de congestion évolutifs pour le trafic ayant des exigences élevées en matière de qualité de service (par exemple, TCP-Prague et DCTCP), sans nuire aux performances du trafic classique, pour lequel des contrôleurs de congestion tels que Reno et Cubic sont appliqués.
- Ajout de sysctl « force_forwarding », permettant d'activer le redirectionnement de trafic sur les interfaces réseau sélectionnées avec IPv6.
- Suppression du support de l'algorithme de détection de perte de paquets SACK (Selective Acknowledgment), décrit dans RFC 6675. Cet algorithme a été déclaré obsolète en 2018. Pour la détection de perte de paquets TCP, il est recommandé d'utiliser l'algorithme RACK-TLP.
- Matériel
- Poursuite du développement du 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 dans les graphiques intégrés, à partir des processeurs Tiger Lake. La nouvelle version inclut par défaut le support des puces basées sur l'architecture de microarchitecture Panthor Lake et ajoute le support de l'architecture de microarchitecture WildCat Lake.
- Dans le pilote AMDGPU pour GPU GFX9.x, support du mécanisme Cleaner Shader, assurant le nettoyage de la mémoire GPU avant sa réutilisation afin d'éviter les fuites de données laissées par d'autres processus. Amélioration du support du mode veille. Ajout de la possibilité de passer en mode veille dans des environnements avec AMD SR-IOV. Amélioration de la gestion du rétroéclairage.
- Dans le pilote i915, ajout du support du mécanisme drm_panic, qui affiche, lors des erreurs, un semblant d'« écran bleu de la mort ». Ajout du support du contrôleur d'affichage utilisé dans les puces de la famille Wildcat Lake.
- Poursuite de l'intégration des composants du pilote Nova pour les GPU NVIDIA, équipés de firmwares GSP, utilisés depuis la série NVIDIA GeForce RTX 2000 basée sur l'architecture Turing. Le pilote est écrit en langage Rust. La nouvelle version ajoute un niveau d'abstraction pour travailler avec DMA, implémente un parseur VBIOS, ajoute le code pour configurer le framebuffer et assure le support du chargement accéléré en mode Falcon.
- Dans le pilote adreno, ajout du support pour GPU Qualcomm Adreno x1-45 et x1-85.
- Dans le pilote msm, ajout du support pour GPU Adreno SM8750 et du mappage de la mémoire vidéo (VM_BIND).
- Dans le pilote panfrost, ajout du support pour GPU Mali, utilisés dans les SoC Mediatek mt8370.
- Le pilote lima prend en charge les GPU utilisés dans le SoC Rockchip RK3528.
- Ajout d'un pilote mtd (Memory Technology Devices) pour l'accès à la mémoire NVM intégrée dans le GPU Intel.
- Ajout de la prise en charge des systèmes audio ASoC IMX WM8524, AMD ACP7.2, SoundWire ACP 7.1, Fairphone 4 & 5, Qualcomm QCS8275, Framework Laptop 13 (AMD Ryzen AI 300), CS35L41 HDA (utilisé dans les ordinateurs portables ASUS), Richtek RTQ9124, TI TAS5753, HP EliteBook x360 830 G6, EliteBook 830 G6, LG 16Z90R-A, HP 15-fc000. Réorganisation du code HD-audio.
- Ajout de la prise en charge des plates-formes ARM, des SoC et des appareils : NVIDIA Tegra264, Marvell PXA1908 (premier chipset 64 bits de Marvell pour smartphones), CIX P1, Axiado AX3000, Sophgo SG2000 (qui combine des cœurs ARM et RISC-V), Mediatek mt6572, exynos2200 (utilisé dans le Samsung Galaxy S22), Renesas R-Car V4M-7, TI am62d2 et Sophgo sg2042, ordinateurs portables basés sur Mediatek mt8186 et Qualcomm Snapdragon X1, smartphones et tablettes basés sur SoC mt6572, tegra30 et msm8976.
En parallèle, la Fundación pour le Logiciel Libre d'Amérique Latine a créé une version entièrement libre du noyau 6.17 — Linux-libre 6.17-gnu, débarrassée des éléments de micrologiciels et de pilotes contenant des composants non libres ou des segments de code dont l'utilisation est limitée par le fabricant. Dans la version 6.17, le code de nettoyage des blobs a été mis à jour pour les pilotes amdgpu, prueth, iwlwifi, btusb, pci mhi host, adreno a6xx, nova-core et Intel AVS. Les noms des blobs ont été nettoyés dans les fichiers dts (devicetree) pour les puces ARM et Intel IPU7. Le chargement des blobs dans les nouveaux pilotes pci hda a été neutralisé. Le nettoyage des blobs dans le pilote QLogic infiniband, retiré du noyau, a été interrompu.
Source : opennet.ru
