Après deux mois de développement, Linus Torvalds a présenté la version du noyau Linux 6.11. Parmi les changements les plus notables : la prise en charge des opérations d'écriture atomique au niveau des blocs, la prise en charge des opérations bind() et listen() dans io_uring, un nouveau mécanisme de verrouillage des gestionnaires d'interruptions, la possibilité d'écrire dans des fichiers exécutables mappés en mémoire, le support de l'écriture de pilotes de périphériques de bloc en Rust, et l'optimisation de l'appel à getrandom(), ainsi qu'une nouvelle implémentation d'AES-GCM.
La nouvelle version comprend 15 130 corrections de 2 078 développeurs, la taille du patch étant de 85 Mo (les modifications ont touché 13 282 fichiers, avec 985 857 lignes de code ajoutées et 268 915 lignes supprimées). Dans la version précédente, il y avait 14 564 corrections de 1 989 développeurs, et la taille du patch était de 41 Mo (deux fois moins que le patch pour le noyau 6.11). Environ 46 % de toutes les modifications présentées dans 6.11 sont liées aux pilotes de périphériques, environ 17 % concernent la mise à jour de code spécifique aux architectures matérielles, 10 % sont liées à la pile réseau, 5 % aux systèmes de fichiers, et 3 % aux sous-systèmes internes du noyau.
Les principales nouveautés du noyau 6.11 :
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- La prise en charge des opérations d'écriture atomique au niveau des blocs a été mise en œuvre, permettant d'écrire soit l'ensemble des blocs spécifiés, soit aucun, ce qui protège contre les situations où, après une défaillance matérielle, seule une partie des blocs est écrite, laissant l'ancienne information dans l'autre partie. Pour activer le mode d'écriture atomique, un drapeau RWF_ATOMIC a été ajouté à l'appel système pwritev(). Les informations sur la prise en charge de l'écriture atomique (atomic_write_unit_min, atomic_write_unit_max et atomic_write_segments_max) par rapport à des fichiers spécifiques peuvent être obtenues via la fonction statx().
- Le support a été fourni pour l'écriture dans des fichiers exécutables liés à des processus en cours. Auparavant, comme dans d'autres systèmes Unix-like, le noyau renvoyait une erreur en tentant d'écrire dans un fichier exécutable d'un processus en cours. Cette restriction a été levée car elle n'avait aucun sens pratique.
- Il a été rendu possible de développer des pilotes de périphériques de bloc en Rust. Par exemple, un pilote rnull a été ajouté au noyau, équivalent du pilote null_blk, mais écrit en Rust.
- Dans le système de fichiers Btrfs, l'option de montage « rescue= » prend en charge les nouveaux modes « ignoremetacsums » et « ignoresuperflags », qui peuvent être utilisés pour transférer certaines vérifications dans l'espace utilisateur lors de la récupération du système de fichiers après une panne. L'implémentation de l'opération de retour dynamique de groupes de blocs a été retravaillée pour éviter les situations de manque d'espace libre en raison d'un remplissage incomplet du système de fichiers.
- Dans le système de fichiers ntfs3, la prise en charge des attributs « compressed » et « immutable », qui définissent des fichiers compressés et non modifiables, a été implémentée.
- Dans les systèmes de fichiers F2FS et Ext4, le traitement des noms de fichiers sans tenir compte de la casse (casefold) a été simplifié en stockant les noms sous forme de chaînes qstr sans conversions de cas superflues.
- Dans le système de fichiers Ext4, la fonction jbd2_transaction_committed a été optimisée pour améliorer les performances sur des supports de stockage très rapides (les tests ont montré une augmentation des opérations traitées par seconde atteignant 20 %).
- Dans l'appel système statx(), il est désormais possible de transmettre un pointeur NULL au lieu d'une chaîne vide avec le chemin du fichier, si le drapeau AT_EMPTY_PATH est défini.
- Dans l'appel système open_by_handle_at(), les vérifications des droits d'accès aux fichiers ont été assouplies en cas d'absence des droits CAP_DAC_READ_SEARCH pour la recherche dans l'espace de noms initial. Auparavant, l'exigence d'avoir les droits CAP_DAC_READ_SEARCH sur l'espace de noms initial empêchait l'utilisation de l'appel système open_by_handle_at() dans les conteneurs.
- Les capacités des appels système listmount() et statmount() ont été étendues. Dans listmount(), un drapeau LISTMOUNT_REVERSE a été ajouté pour afficher le contenu de la table des points de montage dans l'ordre inverse (les enregistrements les plus récents en haut). Dans statmount(), la sortie des options définies lors du montage du système de fichiers a été implémentée. Dans les deux appels système, le fonctionnement en l'absence d'accès à l'espace de noms initial (lorsque seul l'accès à l'espace de noms local ou externe est disponible) a été autorisé.
- Dans le système de fichiers Bcachefs, la prise en charge de la récupération automatique et transparente des données problématiques a été implémentée, en utilisant des codes de récupération d'erreurs — si une erreur d'entrée/sortie se produit lors de la lecture ou si une incohérence de la somme de contrôle est détectée, le bloc de données problématique est automatiquement réécrit en cas de redondance pour sa récupération.
- Mémoire et services système
- Des correctifs ont été intégrés, mettant en œuvre un nouveau mécanisme de blocage des gestionnaires d'interruptions logiciels (BH, bottom-half), qui garantit le blocage des structures de données utilisées, tout en permettant l'exécution parallèle de code non lié. Il est noté que ce changement a permis non seulement de réduire les latences pour les cœurs fonctionnant en mode temps réel, mais aussi d'améliorer la performance des cœurs standards (par exemple, pour certains types de charge, une amélioration de 14,5 % de la performance de la sous-système réseau a été observée).
- Le sous-système d'entrée/sortie asynchrone io_uring a été enrichi du support des opérations pour implémenter les fonctions bind() et listen(), utilisées pour créer des sockets réseau en attente de connexions.
- Un ensemble d'opérations ioctl a été ajouté pour le pseudo-Système de Fichiers NSFS (NameSpace FS), utilisé pour travailler avec des espaces de noms. Les nouveaux ioctl permettent de convertir les identifiants de processus et les groupes de threads entre différents espaces de noms d'identifiants de processus (PID namespace). Des ioctl similaires, permettant de déterminer les descripteurs de fichiers des processus dans des espaces de noms distincts sur la base des identifiants pidfd, ont également été ajoutés au pseudo-Système de Fichiers pidfd.
- Pour les programmes BPF, un nouvel itérateur a été ajouté pour travailler avec des masques de bits, qui peut être utilisé, par exemple, pour parcourir des bits individuels dans des zones mémoires, comme le cpumask. Un mécanisme a été introduit pour envoyer aux processus dans l'espace utilisateur des notifications de détachement (detach/unregister) de l'objet struct_ops. La gamme de types pouvant être utilisés dans les tableaux a été élargie (par exemple, il est maintenant possible de déclarer des tableaux comportant des éléments de types kptr, bpf_rb_root et bpf_list_head). Un mécanisme plus fiable de Split BTF (BPF Type Format) a été proposé, utilisé pour la vérification des types dans le pseudo-code BPF.
- Un sous-système a été ajouté pour organiser l'alimentation des appareils dans un ordre spécifié, au cas où un appareil doit être activé avant un autre (par exemple, lors de l'activation de puces sans fil sur des plateformes Qualcomm).
- Un module « Sloppy logic analyzer » a été ajouté, permettant de créer de simples analyseurs logiques de signal, utilisant GPIO et fonctionnant sur un cœur CPU séparé.
- Ajout de la prise en charge des constantes d'exécution, qui peuvent être utilisées à la place des variables initialisées une fois. Par exemple, les constantes d'exécution peuvent être appliquées à la place des variables contenant un pointeur et une taille pour le cache dentry. Ces variables sont définies au moment du chargement et ne changent plus par la suite. L'idée est de substituer directement les valeurs de ces variables dans les instructions du code, éliminant ainsi les coûts associés aux manipulations de pointeurs.
- Poursuite du transfert des modifications de la branche Rust-for-Linux, liées à l'utilisation du langage Rust comme deuxième langage pour le développement de pilotes et de modules du noyau (la prise en charge de Rust n'est pas activée par défaut et n'entraîne pas l'inclusion de Rust parmi les dépendances de construction obligatoires du noyau). Ajout de la prise en charge de la version 1.80 de Rust (la version minimale prise en charge reste Rust 1.78). En plus des outils précédemment mentionnés pour le développement de pilotes de périphériques de bloc, la nouvelle version ajoute des abstractions pour le chargement de micrologiciels, l'accès à l'espace utilisateur (uaccess) et le fonctionnement de la structure « page ».
- Pour les systèmes x86-64, un nouveau système d'appel uretprobe() a été mis en œuvre, optimisant le fonctionnement du mécanisme de traçage uretprobe, permettant de suivre les valeurs retournées par les fonctions dans les applications de l'espace utilisateur.
- Ajout de paramètres de ligne de commande pour le noyau: « reserve_mem » pour réserver une zone de mémoire nommée au démarrage et « ramoops.mem_name » à utiliser dans la zone de mémoire pstore créée via reserve_mem.
- Dans le contrôleur de mémoire basé sur cgroup, le fichier memory.reclaim, qui définit les paramètres d'éviction de mémoire, a été ajouté avec le paramètre « swappiness », permettant de modifier l'équilibre entre l'éviction des pages de mémoire anonymes dans l'espace d'échange et la libération des pages de mémoire occupées par le cache de fichiers.
- Ajout d'une interface ioctl PROCMAP_QUERY pour une recherche plus efficace des zones de mémoire virtuelle (Virtual Memory Area) dans /proc/PID/maps.
- Un drapeau MAP_DROPPABLE a été ajouté à l'appel système mmap() pour demander une mémoire qui ne sera jamais échangée dans l'espace d'échange, mais qui peut être supprimée en cas de pénurie de mémoire.
- Pour l'architecture ARM64, prise en charge du branchement à chaud (changement en modes online/offline) des CPU physiques et virtuels sur les systèmes avec ACPI.
- Pour l'architecture RISC-V, la prise en charge du branchement à chaud de la mémoire a été ajoutée, ainsi que le soutien au plugin GCC STACKLEAK (qui initialise toutes les variables stockées sur la pile pour éviter les fuites d'informations du noyau via des variables non initialisées qui peuvent contenir des restes de données précédemment sauvegardées sur la pile).
- Le mécanisme de mappage de mémoire EFI factice a été supprimé au démarrage. Ce mécanisme n'était pas utilisé en pratique et gênait le développement dans le domaine de l'exécution confidentielle. machines virtuelles.
- Le support pour la plateforme PowerPC 40x a été arrêté.
- Les exigences concernant la version de GNU Make ont été augmentées — pour compiler le noyau, une version de GNU Make publiée en 2013 au moins est requise.
- Virtualisation et sécurité
- Des patchs ont été intégrés, accélérant considérablement (jusqu'à 15 fois) l'obtention de nombres aléatoires via l'appel système getrandom(). Cette optimisation est basée sur l'utilisation du mécanisme vDSO (objet partagé dynamique virtuel), permettant de déplacer le gestionnaire d'appels système du noyau vers l'espace utilisateur et d'éviter les changements de contexte. Le chargement de l'implémentation de l'appel système dans l'espace d'adressage du processus se fait directement par le noyau.
- Pour les systèmes x86-64, une nouvelle implémentation de l'algorithme de chiffrement AES-GCM a été incluse, compatible avec l'utilisation des instructions vectorielles VAES, VPCLMULQDQ et AVX512/AVX10 pour accélérer les calculs. Dans les tests réalisés, le gain de performance après la transition vers la nouvelle implémentation atteint 156 %. L'implémentation assembleur d'AES-GCM a été entièrement réécrite en tenant compte de la précision, de la performance, de la taille et d'une documentation complète du code.
- La possibilité de faire fonctionner le noyau en tant que système invité dans des environnements virtualisés utilisant l'extension de processeur AMD SEV-SNP (Secure Nested Paging) a été mise en œuvre, conçue pour garantir un fonctionnement sécurisé avec des tables de pages mémoire imbriquées. Pour une isolation supplémentaire de l'accès aux ressources des machines virtuelles, le module SVSM (Linux Secure VM Service Module) peut être utilisé. Dans l'hyperviseur, KVM un support initial pour le démarrage de systèmes invités protégés par AMD SEV-SNP a été ajouté.
- Un allocateur de slab bucket distinct a été ajouté, activé via l'option CONFIG_SLAB_BUCKETS et assurant une protection contre les attaques utilisant la technique du « heap spraying ».
- Un appel ioctl a été ajouté au hyperviseur KVM pour pré-allouer de la mémoire à la machine virtuelle avant son démarrage effectif.
- Sous-système réseau
- Un paramètre sysctl net.tcp_rto_min_us a été ajouté, permettant de configurer le délai d'attente minimal de retransmission pour les sockets TCP.
- L'outil ethtool a été mis à jour pour permettre un réglage fin de la configuration des gestionnaires d'interruption pour les interfaces réseau utilisant l'interface Net DIM.
- Matériel
- Le pilote AMDGPU a intégré un support initial pour le GPU AMD RDNA4 (« GFX12 »). Le support des technologies DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 et MMHUB 4.1 a été ajouté.
- Le développement du pilote drm (Direct Rendering Manager) Xe pour les GPU basés sur l'architecture Intel Xe se poursuit, utilisé dans les cartes graphiques Intel de la famille Arc et dans les graphiques intégrés depuis les processeurs Tiger Lake. Le support des GPU basés sur les microarchitectures Battlemage, Arrow Lake et Lunar Lake a été amélioré.
- Dans le sous-système DRM (Direct Rendering Manager), le gestionnaire des paramètres EDID (Extended Display Identification Data) fournis par l'écran a été réécrit.
- Le pilote i915 a ajouté la prise en charge des GPU Battlemage Xe2 et a activé par défaut le mode CMRR (Content Match Refresh Rate).
- Le pilote DRM msm (GPU Qualcomm Adreno) a ajouté le support de la plateforme SM7150 et des GPU X185 et a505.
- Le support pour les panneaux d'affichage Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01, K&d kd101ne3-40ti a été ajouté.
- Dans le sous-système audio, la prise en charge des puces et codecs Intel Panther Lake, Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 et Texas Instruments PCM5242 a été ajoutée.
- Une dernière série de modifications a été apportée pour prendre en charge le SoC ARM Snapdragon X Elite, qui utilise un CPU Qualcomm Oryon à 12 cœurs et un GPU Qualcomm Adreno. Ce chipset est conçu pour une utilisation dans les ordinateurs portables et les PC, surpassant de nombreux tests de performance des chipsets Apple M3 et Intel Core Ultra 155H. Les modifications ajoutées au noyau 6.11 concernent le support du GPU Adreno X1-85 et la gestion de la consommation d'énergie. Les ordinateurs portables ASUS Vivobook S15 et Lenovo Yoga Slim7x basés sur le SoC Snapdragon X Elite ont été annoncés comme supportés.
En parallèle, la Fondation latino-américaine pour le logiciel libre a formé une version entièrement libre du noyau 6.11 — Linux-libre 6.10-gnu, épuré des éléments de firmwares et de pilotes contenant des composants non libres ou des portions de code dont l'utilisation est limitée par le fabricant. Dans la version 6.11, le code de nettoyage des blobs dans les pilotes mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth et tas2781 a été mis à jour. Le nettoyage des nouveaux pilotes amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 et pcie-rcar-gen4 a été effectué. Un nettoyage des noms de blobs dans les fichiers dts (devicetree) pour l'architecture Aarch64 a été effectué. Une version sans avertissements et demandes (nowait-nowarn) des primitives pour le chargement des firmwares a été ajoutée. Du code a été ajouté pour définir les primitives de chargement des firmwares dans le code en langage Rust.
Source : opennet.ru
