Après deux mois de développement, Linus Torvalds a présenté la publication du noyau Linux 5.16. Parmi les changements les plus notables : l'appel système futex_waitv pour améliorer les performances des jeux Windows sous Wine, le suivi des erreurs dans le système de fichiers via fanotify, le concept de volumineux dans la gestion de la mémoire, la prise en charge des instructions processeur AMX, la possibilité de réserver de la mémoire pour les sockets réseau, la prise en charge par netfilter de la classification des paquets au stade « egress », l'utilisation du sous-système DAMON pour le remplacement proactif des zones de mémoire non utilisées, l'amélioration de la gestion des surcharges lors d'un grand volume d'opérations d'écriture, la prise en charge des disques durs multi-disques.
La nouvelle version a intégré 15415 corrections provenant de 2105 développeurs, la taille du patch est de 45 Mo (les modifications ont touché 12023 fichiers, ajoutant 685198 lignes de code et supprimant 263867 lignes). Environ 44 % de tous les changements présentés dans 5.16 concernent les pilotes de périphériques, environ 16 % des changements concernent la mise à jour du code spécifique aux architectures matérielles, 16 % concernent la pile réseau, 4 % concernent les systèmes de fichiers et 4 % concernent les sous-systèmes internes du noyau.
Les principales nouveautés du noyau 5.16 :
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- Le mécanisme fanotify a été enrichi de moyens pour surveiller l'état du système de fichiers et suivre l'apparition d'erreurs. Les informations sur les erreurs sont transmises via un nouveau type d'événements — FAN_FS_ERROR, qui peuvent être interceptés dans les systèmes de surveillance en espace utilisateur pour informer rapidement l'administrateur ou lancer des processus de récupération. En cas de surgissement en cascade d'une série d'erreurs, fanotify assure la livraison du message relatif à la première erreur avec un compteur total des problèmes, facilitant ainsi l'analyse ultérieure des causes de la défaillance. La prise en charge du suivi des erreurs est actuellement mise en œuvre uniquement pour le système de fichiers Ext4.
- Amélioration du traitement des congestions lors des opérations d'écriture (write congestion), qui surviennent lorsque le volume des opérations d'écriture dépasse la capacité d'un support, forçant le système à bloquer les demandes du processus d'écriture jusqu'à ce que les requêtes déjà soumises soient traitées. Dans la nouvelle version, le mécanisme du noyau utilisé pour obtenir des informations sur la survenue de la congestion et le blocage des tâches a été entièrement remanié, car l'ancienne mise en œuvre présentait des problèmes de couplage entre le traitement de la congestion d'écriture et l'éviction des pages mémoire dans la mémoire virtuelle lorsque la mémoire disponible était insuffisante.
- Btrfs a mis en œuvre la prise en charge de la technologie de zonage des dispositifs (Zoned Namespace), utilisée dans les disques durs ou les SSD NVMe pour diviser l'espace de stockage en zones, constituées de groupes de blocs ou de secteurs, auxquels l'ajout de données est autorisé uniquement de manière séquentielle avec la mise à jour de l'ensemble du groupe de blocs. De plus, de petites optimisations du journal des inode ont été apportées, permettant d'obtenir une augmentation de la bande passante dans le test dbench de 3 % et de réduire les latences de 11 %. Le mécanisme de journalisation des répertoires a été retravaillé, réduisant le nombre d'opérations de recherche et de blocages dans l'arbre pour améliorer l'efficacité. L'insertion d'éléments dans la structure btree a été accélérée en mode par lots (le temps d'insertion de masse d'éléments a été réduit de 4 %, et de 12 % pour les suppressions). Une prise en charge limitée de l'utilisation de la compression lors de l'écriture de pages incomplètes a été ajoutée, ainsi que la possibilité de défragmenter les sous-pages (subpage). La préparation pour l'intégration du support de la deuxième version du protocole pour la commande « send » a été effectuée.
- Dans le système de fichiers XFS, la consommation de mémoire a été réduite grâce à l'utilisation de caches slab distincts pour les éléments fréquemment utilisés et à la réduction de certaines structures de données.
- Dans le système de fichiers Ext4, seules des corrections de bogues ont été signalées et le calcul des paramètres d'initialisation différée de la table Inode a été rendu plus précis.
- Au niveau des appareils de bloc, des optimisations ont été mises en œuvre, permettant d'améliorer considérablement l'efficacité d'attribution des opérations aux cœurs CPU.
- Prise en charge initiale des disques durs avec plusieurs actionneurs indépendants (multi-actuator), permettant d'accéder simultanément à plusieurs secteurs dans différentes zones de la plaque magnétique.
- Une nouvelle commande ioctl CDROM_TIMED_MEDIA_CHANGE a été ajoutée pour détecter les événements de changement de support dans le lecteur de disque optique.
- Le système de fichiers EROFS (Enhanced Read-Only File System) a été mis à jour pour fonctionner sur plusieurs dispositifs de stockage. Différents dispositifs peuvent être reflétés dans un seul espace d'adressage de blocs 32 bits. La prise en charge de la compression utilisant l'algorithme LZMA a également été ajoutée.
- Des options de montage ont été ajoutées au système de fichiers F2FS pour gérer la fragmentation des fichiers lors de leur placement dans le stockage (par exemple, pour déboguer les optimisations liées aux stockages fragmentés).
- Dans CEPH, les opérations de création et de suppression de répertoires sont activées par défaut en mode asynchrone (pour revenir à l'ancien comportement, utilisez le flag '-o wsync' lors du montage). Des métriques ont été ajoutées pour suivre les opérations de copie d'objets externes.
- Dans CIFS, un paramètre de montage tcpnodelay a été ajouté, ce qui désactive l'attente de remplissage de la file d'attente dans la pile TCP pour le socket réseau en définissant le mode tcp_sock_set_nodelay. Le support des DFS Link (Distributed File System) imbriqués a également été ajouté lors du remontage.
- Le support de la terminaison des requêtes vers des dispositifs de blocs en mode batch a été ajouté. Les tests de cette modification ont montré une augmentation de l'intensité des opérations de lecture aléatoire sur des disques Optane, passant de 6,1 à 6,6 millions d'IOPS sur un seul cœur CPU.
- Mémoire et services système
- Un nouvel appel système futex_waitv a été ajouté, permettant de suivre l'état de plusieurs futex en utilisant un seul appel système. Cette fonctionnalité ressemble à celle de Windows, WaitForMultipleObjects, dont l'émulation via futex_waitv peut être bénéfique pour optimiser les performances des jeux Windows exécutés sous Wine ou Proton. De plus, l'attente simultanée des futex peut également être utilisée pour optimiser les performances des versions natives des jeux pour Linux.
- La conception des folios de pages mémoire (page folios) a été mise en œuvre, dont l'utilisation dans certains sous-systèmes du noyau permettra d'accélérer la gestion de la mémoire sous des charges typiques. Actuellement, le sous-système principal de gestion de la mémoire dans le noyau et l'implémentation du cache de pages ont déjà été transférés sur des folios, et dans le futur, la traduction des systèmes de fichiers est prévue. De plus, le noyau prévoit également d'ajouter un support pour les folios multi-pages.
Les folios ressemblent à des pages mémoire combinées (compound pages), mais se distinguent par une sémantique améliorée et une organisation de travail plus claire. Pour gérer la mémoire système, la RAM disponible est divisée en pages mémoire, dont la taille dépend de l'architecture, mais sur les systèmes x86, elle est mesurée en kilo-octets (généralement 4096 octets). Les systèmes modernes sont équipés de dizaines de gigaoctets de RAM, ce qui complique la gestion de la mémoire en raison de la nécessité de traiter un grand nombre de pages mémoire. Pour réduire le nombre de pages, le noyau a précédemment mis en œuvre le concept de pages combinées (compound pages) avec des structures couvrant plus d'une page mémoire physique. Cependant, l'API pour manipuler les pages mémoire combinées laissait à désirer et entraînait des coûts supplémentaires.
- Un gestionnaire a été ajouté au planificateur de tâches pour prendre en compte la clustering du cache dans le CPU. Dans certains processeurs, comme le Kunpeng 920 (ARM) et l'Intel Jacobsville (x86), un certain nombre de cœurs du CPU, généralement 4, peut combiner le cache L3 ou L2. Prendre en compte de telles topologies peut considérablement améliorer l'efficacité de la répartition des tâches entre les cœurs du CPU dans le planificateur de tâches, car le déplacement des tâches au sein d'un même cluster CPU permet d'augmenter le débit d'accès à la mémoire et de réduire la concurrence dans le cache.
- Ajout de la prise en charge des instructions AMX (Advanced Matrix Extensions), mises en œuvre dans les futurs processeurs serveurs Intel Xeon Scalable, développés sous le nom de code Sapphire Rapids. AMX propose de nouveaux registres configurables TMM « TILE » et des instructions pour manipuler les données dans ces registres, telles que TMUL (Tile matrix MULtiply) pour la multiplication de matrices.
- Plusieurs nouvelles fonctionnalités ont été mises en œuvre, basées sur le sous-système DAMON (Data Access MONitor) introduit dans la version précédente, permettant de suivre l'accès aux données dans la mémoire vive, en lien avec le processus sélectionné s'exécutant dans l'espace utilisateur. Par exemple, le sous-système permet d'analyser quelles zones de mémoire le processus a sollicité durant toute sa durée d'exécution, et quelles zones sont restées non utilisées.
- DAMON_RECLAIM pour identifier et évincer les zones de mémoire n'ayant pas été accédées. Ce mécanisme peut être utilisé pour un éviction douce anticipée des pages de mémoire lorsque l'on approchait de l’épuisement de la mémoire libre.
- DAMOS (Data Access Monitoring-based Operation Schemes) pour appliquer des opérations prédéfinies telles que madvise(), visant à libérer de la mémoire supplémentaire dans les zones de mémoire d'un processus, pour lesquelles une certaine fréquence d'accès est enregistrée. La configuration des paramètres de DAMOS se fait via debugfs.
- Possibilité de surveiller l'espace d'adresses physiques de la mémoire (auparavant, seuls les adresses virtuelles pouvaient être suivies).
- L'implémentation de l'algorithme de compression zstd a été mise à jour vers la version 1.4.10, ce qui a considérablement amélioré la performance de divers sous-systèmes du noyau utilisant la compression (par exemple, le déballage de l'image du noyau a été accéléré de 35%, la performance du déballage des données compressées dans Btrfs et SquashFS a augmenté de 15%, et dans ZRAM — de 30%). À l'origine, le noyau utilisait une implémentation distincte de zstd, fondée sur la version 1.3.1, publiée il y a plus de trois ans et ne comprenant pas plusieurs optimisations importantes. En plus du passage à la version actuelle, le correctif ajouté simplifie également la synchronisation avec la branche upstream de zstd, permettant de générer du code pour inclusion dans le noyau directement depuis le dépôt principal de zstd. À l'avenir, le code zstd dans le noyau devrait être mis à jour à mesure que de nouvelles versions de la bibliothèque zstd seront publiées.
- Une grande série d'améliorations a été apportée au sous-système eBPF. La possibilité d'appeler des fonctions de modules du noyau à partir de programmes BPF a été ajoutée. La fonction bpf_trace_vprintk() a été mise en œuvre, contrairement à bpf_trace_printk(), permettant d'afficher plus de trois arguments à la fois. Une nouvelle structure de stockage de données (BPF map) appelée filtre de Bloom a été ajoutée, permettant d'utiliser cette structure de données probabiliste pour déterminer la présence d'un élément dans un ensemble. Un nouvel attribut BTF_KIND_TAG a été ajouté, qui peut être utilisé dans les programmes BPF pour lier des tags aux paramètres de fonction, par exemple, pour faciliter l'identification des erreurs dans les programmes des utilisateurs. Dans libbpf, il est maintenant possible de créer ses propres sections .rodata.*\/data.*, le support des événements de traçage uprobe et kprobe a été mis en œuvre, et un API pour copier tous les types BTF d'un objet à un autre a été ajouté. Le support AF_XDP a été déplacé de libbpf vers une bibliothèque distincte, libxdp. Un compilateur JIT pour la machine virtuelle BPF a été réalisé pour l'architecture MIPS.
- Pour l'architecture ARM64, le support des extensions ARMv8.6 pour le minuteur a été mis en œuvre, permettant notamment une auto-synchronisation de la représentation des registres système sans utiliser d'instructions ISB.
- Pour l'architecture PA-RISC, il est maintenant possible d'utiliser le mécanisme KFENCE pour détecter les erreurs de gestion de la mémoire, ainsi qu'un support pour le détecteur d'états de course KCSAN qui a été ajouté.
- Il est désormais possible de configurer les droits d'accès à tracefs au niveau des utilisateurs et des groupes, par exemple, il est maintenant possible de restreindre l'accès aux outils de traçage uniquement aux membres d'un groupe spécifique.
- Virtualisation et sécurité
- Dans les sous-systèmes io_uring et device-mapper, le support de la génération d'événements d'audit a été mis en œuvre. Dans io_uring, il est maintenant possible de gérer l'accès via les modules LSM. La possibilité d'auditer l'appel système openat2() a été ajoutée.
- Le code du noyau a été complètement débarrassé des expressions switch sans interruption (sans retour ou sortie après chaque bloc case). Lors de la compilation du noyau, il sera désormais possible d'utiliser le mode « -Wimplicit-fallthrough ».
- Des modifications ont été incluses pour renforcer les vérifications des limites lors de l'exécution de la fonction memcpy().
- Dans l'interface d'entrée/sortie asynchrone io_uring, il est possible d'appliquer des politiques de sécurité aux opérations d'entrée/sortie, déterminées par les modules SELinux et Smack.
- Dans le sous-système IMA (Integrity Measurement Architecture), qui permet à un service externe de vérifier l'état des sous-systèmes du noyau afin de garantir leur authenticité, la possibilité d'appliquer des règles basées sur l'identifiant de groupe (GID) auquel appartient un fichier ou dans lequel se trouve un utilisateur accédant au fichier a été mise en œuvre.
- Certains mécanismes de protection avancés des flux seccomp() contre les attaques de type Spectre sont désactivés par défaut, car jugés superflus et n'augmentant pas significativement la sécurité, mais impactant négativement les performances. L'application de la protection Retpoline a été revue.
- La mise en œuvre du mécanisme cryptoloop a été supprimée, remplacée en 2004 par dm-crypt, qui prend en charge les mêmes algorithmes si nécessaire.
- L'accès non privilégié au sous-système eBPF est interdit par défaut. Ce changement a été effectué pour empêcher l'utilisation des programmes BPF pour contourner les protections contre les attaques par canaux auxiliaires. Si nécessaire, un administrateur peut rétablir la possibilité d'utilisation d'eBPF par des utilisateurs non privilégiés.
- Dans l'hyperviseur ACRN, conçu pour l'exécution de tâches en temps réel et l'utilisation dans des systèmes critiques, la prise en charge de la création/suppression de périphériques virtuels et du passage de périphériques MMIO a été ajoutée.
- Le moteur cryptographique a été enrichi d'un support pour les définitions KPP (Key-agreement Protocol Primitives), facilitant la logique de développement des pilotes pour les systèmes cryptographiques.
- Un support pour le mode d'isolation a été mis en place dans l'hyperviseur Hyper-V. machines virtuelles, impliquant le chiffrement du contenu de la mémoire.
- Dans l'hyperviseur KVM un soutien à l'architecture RISC-V a été ajouté. La possibilité de migration au sein de l'environnement hôte des machines virtuelles exécutées avec les extensions AMD SEV et SEV-ES a été mise en œuvre. Une API pour la migration à chaud des systèmes invités chiffrés avec AMD SEV (Secure Encrypted Virtualization) a été ajoutée.
- Pour l'architecture PowerPC, le mode STRICT_KERNEL_RWX est activé par défaut, bloquant l'utilisation de pages mémoire accessibles à la fois en écriture et en exécution.
- Le support de l'ajout à chaud de mémoire (Memory hotplug) a été interrompu sur les systèmes x86 32 bits, car il était hors service depuis plus d'un an.
- La bibliothèque liblockdep a été exclue du noyau et sera désormais maintenue séparément du noyau.
- Sous-système réseau
- Une nouvelle option SO_RESERVE_MEM a été mise en place pour les sockets, permettant de réserver une certaine quantité de mémoire qui restera toujours disponible pour le socket et ne sera pas allouée autrement. L'utilisation de cette option permet d'augmenter les performances en réduisant le nombre d'opérations d'allocation et de libération de mémoire dans la pile réseau, notamment en cas de pénurie de mémoire dans le système.
- La prise en charge du protocole de tunneling automatique du trafic multicast (Automatic Multicast Tunneling, RFC 7450) a été ajoutée, permettant de livrer du trafic multicast des réseaux qui prennent en charge le multicast à des destinataires dans des réseaux sans multicast. Le protocole fonctionne par encapsulation dans des paquets UDP.
- L'encapsulation des données IOAM (In-situ Operations, Administration, and Maintenance) dans les paquets transit a été améliorée.
- L'API netlink d'ethtool a maintenant la possibilité de gérer les modes de consommation d'énergie des émetteurs-récepteurs.
- Dans le sous-système netfilter, il est désormais possible de classifier les paquets au niveau egress, c'est-à-dire au moment où le pilote reçoit le paquet de la pile réseau du noyau. La prise en charge des filtres correspondants dans nftables est apparue dans la version 1.0.1. Dans netfilter, il a été ajouté la possibilité d'associer et de modifier les en-têtes internes et les données pour UDP et TCP (inner header / payload) qui suivent l'en-tête de transport.
- De nouveaux paramètres sysctl arp_evict_nocarrier et ndisc_evict_nocarrier ont été ajoutés, qui permettent de vider le cache ARP et la table ndisc (découverte de voisin) en cas de perte de connexion (NOCARRIER).
- Le mécanisme de gestion des files d'attente réseau fq_codel (Controlled Delay) a été enrichi avec les modes Low Latency, Low Loss et Scalable Throughput (L4S).
- Matériel
- Le pilote amdgpu a intégré un support initial de la spécification DP 2.0 (DisplayPort 2.0) et la possibilité de tunneler DisplayPort via USB4. Pour l'APU Cyan Skillfish (équipé de GPU Navi 1x), le support des contrôleurs d'affichage a été ajouté. Le support des APU Yellow Carp (processeurs mobiles Ryzen 6000 « Rembrandt ») a été élargi.
- Dans le pilote i915, le support des puces Intel Alderlake S a été stabilisé et la prise en charge de la technologie Intel PXP (Protected Xe Path) a été mise en œuvre, permettant d'organiser une session graphique protégée matériellement sur des systèmes avec des puces Intel Xe.
- Des corrections de bogues et des améliorations de style de code ont été réalisées dans le pilote nouveau.
- Ajout du support pour les CPU compatibles x86 Vortex (Vortex86MX). Linux fonctionnait déjà sur ces processeurs, mais une identification explicite des CPU mentionnés était nécessaire pour désactiver la protection contre les attaques Spectre/Meltdown, qui ne s'appliquent pas à ces puces.
- Ajout d'un support initial pour les plateformes x86 Surface Pro 8 et Surface Laptop Studio.
- Ajout d'un pilote pour le support des puces audio utilisées dans les APU AMD Yellow Carp, Van Gogh, ainsi que du support pour les systèmes audio et codecs Cirrus CS35L41, Maxim MAX98520/MAX98360A, Mediatek MT8195, Nuvoton NAU8821, NVIDIA Tegra210, NXP i.MX8ULP, Qualcomm AudioReach, Realtek ALC5682I-VS, RT5682S, RT9120, Rockchip RV1126 et RK3568.
- Ajout du pilote ishtp_eclite pour accéder aux contrôleurs intégrés Intel PSE (Programmable Service Engine) via le protocole ISHTP (Integrated Sensor Hub Transport Protocol), par exemple, pour obtenir des données sur la batterie, la température et des informations liées à l'UCSI (USB Type-C Connector System Software Interface).
- Ajout d'un pilote pour les contrôleurs de jeu Nintendo Switch, prenant en charge les dispositifs Switch Pro et Joy-Cons. Ajout du support pour les tablettes Wacom Intuos BT (CTL-4100WL/CTL-6100WL) et le clavier Apple 2021 Magic Keyboard. Amélioration du support des contrôleurs Sony PlayStation DualSense. Ajout du support pour les boutons latéraux des souris Xiaomi Mi.
- Ajout du pilote RT89 avec support des puces sans fil Realtek 802.11ax, ainsi que des pilotes pour les adaptateurs Ethernet Asix AX88796C-SPI et les commutateurs Realtek RTL8365MB-VC.
- Pour les puces Apple M1, ajout des pilotes pour PCI et PASemi i2c.
- Ajout du support des SoC ARM, des dispositifs et cartes Raspberry Pi Compute Module 4, Fairphone 4, Snapdragon 690, LG G Watch R, Sony Xperia 10 III, Samsung Galaxy S4 Mini Value Edition, Xiaomi MSM8996 (Mi 5, Mi Note 2, Mi 5s, Mi Mix, Mi 5s Plus et Xiaomi Mi 5), Sony Yoshino (Sony Xperia XZ1 et Sony Xperia XZ Premium), F(x)tec Pro1 QX1000, Microchip LAN966, CalAmp LMU5000, Exegin Q5xR5, sama7g5, Samsung ExynosAutov9, Rockchip RK3566, RK3399 ROCK Pi 4A+, RK3399 ROCK Pi 4B+, Firefly ROC-RK3328-PC, Firefly ROC-RK3399-PC-PLUS, ASUS Chromebook Tablet CT100, Pine64 Quartz64-A, Netgear GS110EMX, Globalscale MOCHAbin 7040, NXP S32G2, Renesas R8A779M*, Xilinx Kria, Radxa Zero, JetHub D1/H1, Netronix E70K02.
Source : opennet.ru
