Nouvelle interface de marquage d'extent

La version 5.4.0 introduit EXTENT_ALLOC_FLAG_PINNED, un drapeau destiné aux hooks d’allocation d’extent personnalisés. Ce flag indique que la zone mémoire allouée ne doit pas être récupérée par le mécanisme de décay et de purge, ce qui est essentiel pour les pages HugeTLB ou d’autres mappings non‑reclaimable. En pratique, les développeurs peuvent désormais différencier les extents « pinned » des extents classiques, améliorant ainsi la prévisibilité du comportement de l’allocation sous forte pression de mémoire.

Add EXTENT_ALLOC_FLAG_PINNED so custom extent‑allocation hooks can mark non‑reclaimable mappings, such as HugeTLB pages, for preferential reuse outside the decay and purge pipeline.

Statistiques enrichies via mallctl

Le même correctif ajoute plusieurs interfaces mallctl : stats.pinned, stats.arenas.<i>.pinned, stats.arenas.<i>.extents.<j>.npinned, stats.arenas.<i>.extents.<j>.pinned_bytes et stats.arenas.<i>.mutexes.extents_pinned.{counter}. Ces compteurs permettent de mesurer la quantité de mémoire « pinned » par arena et par mutex, offrant une visibilité fine sur l’utilisation de la mémoire non récupérable. L’alignement des statistiques humaines et JSON facilite l’intégration dans les outils de monitoring automatisés.

Modifications incompatibles et nettoyage de configuration

Le remplissage et la rétention du tcache sont désormais adaptés dynamiquement à la charge observée entre deux cycles de collecte de déchets, remplaçant la politique fixe précédente. Sept contrôles expérimentaux (par ex. lg_tcache_nslots_mul, tcache_gc_delay_bytes) ont été retirés ; leurs paramètres sont ignorés silencieusement et les appels mallctl renvoient ENOENT. Le paramètre tcache_ncached_max reste valide. Cette rupture de compatibilité simplifie la surface de configuration et évite les incohérences entre les options déclarées et leur implémentation réelle.

Corrections de bugs et refactorisations majeures

Plusieurs défauts critiques ont été corrigés : la préservation de errno lors des appels free, free_sized et free_aligned_sized, ainsi que pendant la purge basée sur process_madvise. Les vérifications d’overflow numérique dans les classes de taille ont été renforcées, et les fonctions free_sized() et free_aligned_sized() acceptent désormais NULL conformément à la norme C23. Le cycle de vie du TSD (Thread‑Specific Data) a été stabilisé en initialisant les bins du cache‑thread avant d’activer le cache, éliminant les allocations réentrantes sur des états non initialisés. Des optimisations de performance ont été réalisées : modularisation du front‑end (extraction de la gestion des arenas, du fork et du dispatch d’allocation), refactorisation du dispatch ctl, limitation de la croissance du bloc de base pour éviter l’épuisement de la mémoire virtuelle, et déplacement du code de gestion du thread d’arrière‑plan dans un module dédié. Enfin, une couche d’abstraction OS a été introduite, isolant les appels dépendants du système (I/O, synchronisation, gestion du temps, etc.) du cœur de l’allocateur, ce qui améliore la portabilité sur de nouvelles plateformes.