Après deux mois de développement, Linus Torvalds a présenté la version du noyau Linux 6.18. Parmi les changements les plus notables : dm-pcache pour la mise en cache de disque dans la mémoire non volatile (PMEM), suppression de Bcachefs, mode de vérification en ligne pour XFS, pilotes Binder (IPC Android) et Tyr (GPU Mali) en Rust, possibilité de créer des pilotes USB en Rust, optimisation de la mise en cache dans l'allocateur de mémoire SLUB, adressage des espaces de noms par des descripteurs de fichiers, accélération du swap, vérification des programmes BPF par une signature numérique, virtualisation Intel CET dans KVM, protocole réseau PSP (hybride de TLS et IPsec), prise en charge de l'extension IP AccECN, optimisation de la pile UDP.
La nouvelle version a intégré 15035 corrections provenant de 2217 développeurs, la taille du patch est de 45 Mo (les modifications ont touché 13142 fichiers, 601897 lignes de code ont été ajoutées, 355006 lignes ont été supprimées). Dans la version précédente, il y avait 14334 corrections de 2118 développeurs, la taille du patch était de 46 Mo. Environ 40 % des changements présentés dans 6.18 sont liés aux pilotes de périphériques, environ 16 % concernent la mise à jour de code spécifique à des architectures matérielles, 12 % sont liés à la pile réseau, 5 % aux systèmes de fichiers et 3 % aux sous-systèmes internes du noyau.
Principales nouveautés du noyau 6.18 (1, 2, 3) :
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- Dans Device Mapper, un gestionnaire dm-pcache a été ajouté pour utiliser la mémoire persistent (mémoire CXL, adressée via un dispositif DAX) comme un cache de haute performance avant des disques traditionnels ou des unités flash plus lentes. Dm-pcache assure la conservation du contenu du cache en cas de crash grâce à l'utilisation de mémoire non volatile, à la duplication des métadonnées et à la vérification de l'intégrité des données et des métadonnées par des sommes de contrôle CRC32. Actuellement, seule la mise en cache en mode écriture différée (write-back) est supportée.
- Le code du système de fichiers Bcachefs a été supprimé du noyau et sera désormais distribué sous la forme d'un module externe, compilé avec l'outil DKMS (Dynamic Kernel Module Support). Le code de Bcachefs pourra être réintégré dans le noyau après que Kent Overstreet prouvera en pratique la possibilité d'une interaction correcte avec les autres développeurs du noyau et sa capacité à suivre les règles de développement établies.
- L'appel système pwritev2() a été ajouté avec le drapeau RWF_NOSIGNAL, désactivant l'envoi du signal SIGPIPE lors de l'écriture dans des canaux anonymes ou des sockets déconnectés.
- Une option de montage «pidns» a été ajoutée à Procfs pour indiquer les espaces de noms des identifiants de processus (PID namespace). Par exemple : «mount -t proc -o pidns=\/proc\/self\/ns\/pid proc \/tmp\/proc».
- Dans XFS, la possibilité d'appliquer l'outil fsck pour vérifier et corriger les problèmes a été déclarée stable et incluse par défaut en mode en ligne, sans démontage du système de fichiers. Des appels système file_getattr et file_setattr ont été ajoutés pour modifier les attributs des fichiers spéciaux (tous les inode). Les options XFS_SUPPORT_V4 (version 4 de XFS) et XFS_SUPPORT_ASCII_CI (mode sans distinction de cas pour les caractères ASCII), déclarées obsolètes, sont désactivées par défaut dans KConfig. Les options de montage obsolètes attr2, noattr2, ikeep et noikeep ont été supprimées.
- Dans MD RAID, un nouveau type de bitmap a été implémenté — llbitmap (bitmap sans verrou), fonctionnant sans verrouillages et offrant des performances supérieures.
- Des informations liées au chiffrement et à la vérification (pointeurs i_crypt_info et i_verity_info) ont été extraites de la structure générale «inode». Cette modification permet de réduire la consommation de mémoire dans les systèmes de fichiers ne prenant pas en charge le chiffrement et la vérification.
- La prise en charge de l'appel système copy_file_range() et la copie directe de plages en utilisant une taille de type 64 bits (auparavant, seule la taille 32 bits était supportée) ont été ajoutées au sous-système FUSE. La prise en charge de l'initialisation en mode synchronisé lors du montage (FUSE_DEV_IOC_SYNC_INIT) a également été ajoutée.
- Dans le système de fichiers ext4, la possibilité d'utiliser des identifiants d'utilisateur (uid) et de groupe (gid) de 32 bits lors de l'accès aux blocs réservés a été implémentée. Des opérations ioctl ont été ajoutées pour définir et lire les paramètres du superbloc des systèmes de fichiers montés (tune2fs pourra modifier les paramètres dans le superbloc sans droits d'écriture sur le périphérique de bloc). Tous les réglages obsolètes spécifiques à ext3 ont été complètement supprimés.
- Dans f2fs, une option de montage « lookup_mode » a été ajoutée pour sélectionner le mode de recherche : perf — recherche par hachage, compat — recherche linéaire, auto — choix automatique. Changer le mode a du sens pour les configurations avec des répertoires où la casse des lettres n'est pas prise en compte. Le mode actuel de recherche peut être consulté via le fichier « /sys/fs/f2fs//effective_lookup_mode ». Une possibilité de réservation d'inode, accessible uniquement aux utilisateurs privilégiés, a été ajoutée.
- Dans Overlayfs, un mode de fonctionnement sans prise en compte de la casse des lettres a été ajouté, activé au niveau des couches du système de fichiers (la configuration pour des répertoires spécifiques n'est pas encore prise en charge).
- Dans BTRFS, le parallélisme des opérations a été amélioré lors d'une charge de lecture élevée et d'une faible charge d'écriture, le temps de validation des transactions a été réduit, et le temps de synchronisation a été significativement diminué (passant de plusieurs minutes à plusieurs dizaines de secondes). Une possibilité d'utilisation de blocs (bs) plus grands que la taille de la page mémoire (ps) a été ajoutée.
- Dans ksmbd (serveur SMB fonctionnant au niveau du noyau), un paramètre a été ajouté pour limiter le nombre maximum de connexions depuis un seul. adresses IP. smbdirect, smbclient et smbserver ont été adaptés à l'utilisation de structures de noyau standard.
- Dans SQUASHFS, une option a été ajoutée pour utiliser dans l'appel système lseek() les options SEEK_DATA et SEEK_HOLE afin de rechercher des données et des trous dans des fichiers épars. Dans certains tests, une augmentation de la performance de copie de fichiers épars allant jusqu'à 150 fois a été observée.
- Dans EXFAT, le support de ioctl FS_IOC_GETFSLABEL et FS_IOC_SETFSLABEL a été ajouté pour lire et écrire des étiquettes de partitions. La possibilité de modifier les options de montage lors du démontage a été fournie. Le chargement des cartes bitmap a été accéléré.
- Dans NTFS3, le support de ioctl FS_IOC_GETFSLABEL et FS_IOC_SETFSLABEL a été ajouté pour lire et définir des étiquettes de partitions.
- Mémoire et services système
- L'implémentation du mécanisme de communication inter-processus Binder, écrit en Rust, a été acceptée. Binder est utilisé dans Android pour organiser l'interaction entre les processus et les appels de méthodes à distance (un processus Android peut appeler une méthode ou une fonction dans un autre processus Android en utilisant Binder pour identifier, invoquer et transmettre des arguments entre les processus). Le code de Binder a été réécrit en Rust dans le cadre de l'initiative Google visant à renforcer la sécurité d'Android.
- Dans SLUB, l'allocation de mémoire du noyau, un niveau de mise en cache optionnel « sheaves » a été implémenté, utilisant plusieurs caches, chacun étant attaché à un cœur CPU distinct, ce qui permet de localiser les opérations d'allocation ou de libération de mémoire à un seul cœur. Ce cache a amélioré les performances d'allocation et de libération de la mémoire dans le noyau, grâce à l'élimination des primitives de synchronisation superflues requises lors de l'engagement de cœurs CPU différents. Dans les tests réalisés, l’augmentation des performances a varié de 6,3 % à 31 %, selon le type de charge.
- Une option pour créer des descripteurs de fichiers identifiés avec un espace de noms spécifique a été ajoutée. Contrairement à l'accès aux espaces de noms par identifiants (/proc//ns/), le descripteur de fichier est lié à une instance particulière de l'espace de noms et exclut le cas où un identifiant est réaffecté à un autre objet. De la même manière que pour les pidfds, l'ouverture des descripteurs de fichiers se référant aux espaces de noms se fait via les fonctions open_by_handle_at() et name_to_handle_at().
- Le mécanisme « Swap Table » a été mis en œuvre, permettant d'améliorer les performances de la pagination. L'accélération est obtenue grâce à une réduction de la concurrence pour l'accès au cache de pagination, une recherche plus efficace dans le cache et une diminution de la fragmentation. Le backend basé sur la Swap Table est utilisé pour le caching de la pagination au lieu du backend XArray, permettant d'augmenter en moyenne les performances de 5 à 20 %. Dans le test usemem, la bande passante a augmenté de 17 à 28 %, lors du test de recompilation multithread du noyau, le temps de compilation a été réduit de 1,12 à 3,19 %, et le test redis-benchmark avec BGSAVE a montré une augmentation du nombre de requêtes traitées de 6 à 7 %.
- Le sous-système Zswap a été transféré vers l'utilisation directe du système d'allocation de mémoire zsmalloc au lieu du niveau zpool, qui n'est plus utilisé ailleurs et a maintenant été supprimé du noyau.
- Pour gérer le comportement du chargeur de microcode sur les systèmes x86, une option de ligne de commande « microcode=liste des drapeaux » a été réalisée. Dans sa forme actuelle, la nouvelle option remplace « microcode.force_minrev » et permet également de spécifier la version minimale du microcode autorisée au démarrage.
- Le travail de réorganisation de la structure « page », excessivement gonflée, utilisée pour gérer les pages de la mémoire vive a commencé. Un type ‘memdesc_flags_t’ a été ajouté pour les champs avec des drapeaux universels, qui pourront être utilisés après la séparation prévue dans le futur de la structure « page » en structures distinctes pour les slabs et les folios (folio).
- Pour l'architecture nios2, utilisée dans les processeurs Altera Nios II (processeur logiciel basé sur FPGA), le support de l'appel système clone3() a été implémenté.
- Un attribut « transitional » a été ajouté à la configuration du noyau (KConfig), qui peut être utilisé pour marquer les paramètres non affichés dans les interfaces utilisateur, telles que « make menuconfig », et non inclus dans les fichiers de configuration générés. La principale fonction de cet attribut est de simplifier le renommage des options tout en préservant la compatibilité ascendante.
- La version minimale du compilateur Clang, avec laquelle le noyau peut être assemblé, a été augmentée à l'outil LLVM 15. LLVM 14 est fourni avec Debian 12 et Ubuntu 22.04.
- La transition des changements de la branche Rust-for-Linux, concernant l'utilisation du langage Rust comme second langage pour le développement de pilotes et de modules de noyau, a été poursuivie (le support de Rust n'est pas activé par défaut et ne rend pas Rust obligatoire comme dépendance pour la compilation du noyau). Dans la nouvelle version, des opérations atomiques en mémoire pour le code en Rust, la structure de l'arbre maple, la possibilité de créer des fichiers DebugFS et des fonctions pour manipuler des cartes de bits ont été mises en œuvre. L'accès à l'API pour le développement de pilotes a été élargi. Un ensemble complet d'abstractions pour le développement de pilotes de dispositifs USB a été ajouté (exemple de pilote USB). La commande perf a été dotée du support pour les symboles de débogage générés par le compilateur rustc.
- Virtualisation et sécurité
- Le support de la vérification cryptographique des programmes BPF chargés par signature numérique a été ajouté. Dans le futur, cette fonctionnalité sera étendue par des moyens permettant de définir des règles de chargement pour les programmes BPF signés et de fournir aux utilisateurs non privilégiés la possibilité d'utiliser des programmes BPF vérifiés.
- Dans l'hyperviseur KVM, la prise en charge de la virtualisation de l'extension Intel CET (Control-flow Enforcement Technology) a été mise en œuvre, utilisée pour protéger contre les exploits utilisant des méthodes de programmation orientée retour (ROP — Return-Oriented Programming). Le principe de protection est que, après la remise du contrôle à une fonction, l'adresse de retour est sauvegardée par le processeur non seulement dans la pile normale, mais aussi dans une pile cachée séparée, qui ne peut pas être modifiée directement.
- Il est désormais possible d'utiliser plus de 255 CPU dans les systèmes invités fonctionnant sous l'hyperviseur Bhyve sur des hôtes avec FreeBSD 15.
- Une couche dibs (Direct Internal Buffer Sharing) a été ajoutée pour un partage de mémoire géré à l'intérieur d'environnements isolés, tels que l'hyperviseur ou une instance du noyau Linux.
- La sous-système d'audit prend maintenant en charge le fonctionnement avec plusieurs modules LSM (Linux Security Module) activés simultanément.
- Un pilote virtio spi-virtio a été ajouté pour accéder à des appareils SPI (Serial Peripheral Interface) à partir de machines virtuelles.
- L'hyperviseur KVM a ajouté la prise en charge du mode SEV-SNP CipherText Hiding, bloquant la lecture du texte chiffré en mémoire des systèmes invités protégés par un CPU non autorisé.
- Un pilote qtee pour les environnements TEE (Trusted Execution Environment) des puces Qualcomm a été ajouté.
- Sous-système réseau
- Prise en charge du chiffrement des connexions TCP en utilisant le protocole PSP (PSP Security Protocol), développé par Google pour chiffrer le trafic entre les datacenters. PSP assure le chiffrement, le contrôle d'intégrité cryptographique et l'authentification de la source, réalisant une combinaison des capacités des protocoles TLS et IPsec. PSP applique le chiffrement au niveau de connexions réseau individuelles, et non à l'ensemble du canal de communication. PSP utilise des clés de chiffrement distinctes pour différentes connexions TCP tunnelisées afin d'isoler strictement le trafic des différentes applications et processeurs. Pour alléger la charge du CPU, il prend en charge le déchargement des opérations de chiffrement et de déchiffrement vers les cartes réseau (offload). Le protocole UDP est utilisé comme transport pour les données, sur lequel le contenu du paquet TCP original est encapsulé.

- Le support initial de l'extension AccECN (Accurate Explicit Congestion Notification) a été ajouté. Cette extension améliore l'ECN en permettant aux hôtes, en cas de congestion, de marquer les paquets IP au lieu de les rejeter, ce qui permet de détecter l'apparition d'une congestion initiale dans les canaux de communication sans perte de paquets. L'extension ECN d'origine a une restriction qui ne permet d'envoyer qu'un seul signal de congestion au cours d'un cycle de transmission TCP (RTT, Round-Trip Time, envoi de la requête et réception de la réponse). AccECN supprime cette limitation et permet au récepteur de transmettre à l'expéditeur plus d'une étiquette de congestion dans l'en-tête du paquet TCP. Les algorithmes de gestion de la congestion peuvent utiliser les informations reçues pour réagir plus précisément aux congestions sans avoir recours à une réduction drastique du taux d'envoi des paquets en cas de légère congestion.
- Le traitement des paquets entrants dans la pile UDP a été optimisé en cas d'attaques DDoS, entraînant un grand nombre de paquets arrivant dans un ou plusieurs sockets UDP. Les optimisations apportées, telles que la réduction des blocages concurrents, l'optimisation de l'emplacement des structures de données en mémoire et l'utilisation de verrous tenant compte de l'architecture NUMA (Non-Uniform Memory Access), ont permis d'augmenter les performances de réception des paquets UDP de 47 % et plus dans des conditions extrêmes.
- Une option pour désactiver le caching des entrées/sorties sur le serveur NFS a été mise en place, ce qui permet d'utiliser le serveur NFS dans des systèmes avec peu de mémoire (par exemple, dans des environnements cloud limités). La désactivation du cache peut également être utile sur les serveurs NFS chargés pour éviter l'éviction des données liées aux disques locaux en libérant de la mémoire pour le cache NFS.
- La taille maximale des tampons pour les paquets entrants et sortants des sockets réseaux (net.core.rmem_max et net.core.wmem_max) a été augmentée de 2 Mo à 4 Mo. La taille par défaut n'a pas changé (net.core.rmem_default et net.core.wmem_default = 2 Mo).
- Un pilote pour l'accélérateur des opérations réseau Qualcomm PPE (Packet Processing Engine), utilisé dans le SoC Qualcomm IPQ9574, a été ajouté.
- Prise en charge du chiffrement des connexions TCP en utilisant le protocole PSP (PSP Security Protocol), développé par Google pour chiffrer le trafic entre les datacenters. PSP assure le chiffrement, le contrôle d'intégrité cryptographique et l'authentification de la source, réalisant une combinaison des capacités des protocoles TLS et IPsec. PSP applique le chiffrement au niveau de connexions réseau individuelles, et non à l'ensemble du canal de communication. PSP utilise des clés de chiffrement distinctes pour différentes connexions TCP tunnelisées afin d'isoler strictement le trafic des différentes applications et processeurs. Pour alléger la charge du CPU, il prend en charge le déchargement des opérations de chiffrement et de déchiffrement vers les cartes réseau (offload). Le protocole UDP est utilisé comme transport pour les données, sur lequel le contenu du paquet TCP original est encapsulé.
- Matériel
- Le noyau inclut le pilote Tyr, écrit en Rust, qui gère les GPU ARM Mali utilisant la technologie CSF (Command Stream Frontend), tels que les Mali G310, G510 et G710. Ce pilote n'est pas encore prêt pour un usage régulier par des utilisateurs normaux et est considéré comme un prototype expérimental pour tester les abstractions de développement de pilotes en Rust.
- Le support des pavés tactiles à retour haptique et des capteurs de pression a été ajouté aux pilotes pour dispositifs d'entrée avec interface HID (Human Interface Device).
- Le travail sur le pilote drm (Direct Rendering Manager) Xe pour les GPU basés sur l'architecture Intel Xe, utilisée dans les cartes graphiques Intel de la famille Arc et la graphique intégrée depuis les processeurs Tiger Lake, a été poursuivi. La nouvelle version inclut l'interface madvise, le support de SR-IOV PF (Single Root I/O Virtualization Physical Function), le support du mode Intel PSMI pour la validation du matériel, le traitement des informations d'erreur fournies par les firmwares, l'implémentation du profil de consommation d'énergie SLPC, et le support du chargement de firmwares auxiliaires (comme le contrôleur de ventilateur et le régulateur de tension) lors de la vérification du pilote.
- Le pilote AMDGPU a ajouté le support des dispositifs avec APU Cyan Skillfish, amélioré le support de l'AMD GCN 1.0 et a réalisé la compatibilité avec l'outil criu, tandis que les métriques de température ont été ajoutées dans sysfs et les requêtes de remapping MMIO depuis l'espace utilisateur ont été autorisées.
- Le pilote i915 a ajouté la prise en charge des puces de la famille Wildcat Lake et amélioré le fonctionnement avec les GPU Jasper Lake, Elkhart Lake, Gen7 et Gen6.
- Le pilote Nouveau utilise par défaut les firmwares GSP de NVIDIA et a amélioré le traitement des erreurs.
- 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, a été poursuivie. Le pilote est écrit en Rust. La nouvelle version étend le support des firmwares GSP, améliore l'implémentation de la macro « register! », et ajoute le support des classes de dispositifs PCI et des identifiants de fabricants.
- Le pilote rocket pour les accélérateurs NPU, utilisés dans les SoC Rockchip RK3588, a été ajouté.
- Un paramètre du noyau « boot_display » a été ajouté pour sélectionner le périphérique de sortie afin d'afficher le processus de démarrage sur les systèmes avec plusieurs GPU.
- Le pilote vesadrm a mis en œuvre le support des palettes 8 bits.
- Le pilote msm a ajouté la prise en charge du GPU Adreno 663 et a mis en œuvre la technologie de réduction de consommation d'énergie IFPC (Inter Frame Power Collapse).
- Le pilote panthor a ajouté la prise en charge des GPU Mali-G710, Mali-G510, Mali-G310, Mali-Gx15, Mali-Gx20 et Mali-Gx25.
- Ajout de la prise en charge des systèmes audio ASoC Qualcomm Glymur et PM4125, Realtek RT1321, Shanghai FourSemi FS2104/5S, Texas Instruments PCM1754 et TAS2783A, qcs615, CS35L56 B2, tas2118, tas2x20, tas5825. Ajout de la prise en charge des cartes son USB Tascam US-144mkII et Presonus S1824c.
- Ajout de la prise en charge des CPU ARM Cortex-A320/A520AE/A720AE et C1-Nano/Pro/Premium/Ultra.
- Ajout de la prise en charge des plateformes ARM, SoC et appareils : Apple M2 Pro, M2 Max et M2 Ultr, Sony Xperia SP, Samsung Galaxy S22, Samsung Galaxy S20 FE, ASUS Eee Pad Slider SL101, Lenovo ThinkBook 16, HP Omnibook X14 X1P42100, Dell Inspiron 7441 / Latitude 7455, Sige1, NanoPi Zero2, Axis Artpec8, NXP i.MX91, ROCK 2A/2F, Qualcomm Lemans Auto, Renesas RZ/T2H, RZ/N2H, RZ/T2H et RZ/N2H, Aspeed AST27xx, Meta Clemente BMC, Netcube Nagami som, Tqma91xx, Ultratronik i.MX8MP Ultra-MACH, i.MX8ULP EVK9, Buffalo WXR-1750DHP.
Simultanément, la Fondation latino-américaine pour le logiciel libre a publié une version entièrement libre du noyau 6.18 — Linux-libre 6.18-gnu, purgée des éléments de firmware et de pilotes contenant des composants non libres ou des parties de code, dont l'utilisation est limitée par le fabricant. La version 6.18 met à jour le code de nettoyage des blobs dans les pilotes Nova-Core, Intel XE, TI PRUeth, Lantiq GSWIP, Marvell WiFi-Ex. Un nettoyage des noms des blobs dans les fichiers dts (device tree) pour les puces ARM de Qualcomm, Mediatek et TI ARM64 a été effectué. Le chargement des blobs dans les nouveaux pilotes FourSemi fs2104/5s, TI TAS2783 et Qualcomm GENI a été neutralisé.
Source : opennet.ru

