mbind(2) System Calls Manual mbind(2) NOM mbind - Definir la politique memoire pour une zone de memoire BIBLIOTHEQUE Bibliotheque de regles NUMA (Non-Uniform Memory Access) (libnuma, -lnuma) SYNOPSIS #include long mbind(void addr[.len], unsigned long len, int mode, const unsigned long nodemask[(.maxnode + ULONG_WIDTH - 1) / ULONG_WIDTH], unsigned long maxnode, unsigned int flags); DESCRIPTION mbind() configure la politique memoire NUMA, qui consiste en un mode de politique et zero ou plusieurs noeuds, pour l'intervalle memoire demarrant a addr et s'etalant sur len octets. La politique memoire definit a partir de quel noeud la memoire sera allouee. Si la plage memoire specifiee par les parametres addr et len inclut une region << anonyme >> de memoire (c'est-a-dire une region de memoire creee avec l'appel systeme mmap(2) et l'attribut MAP_ANONYMOUS) ou un fichier de memoire projetee, projection creee en utilisant l'appel systeme mmap(2) et l'attribut MAP_PRIVATE, les pages seront seulement allouees conformement a la politique specifiee lorsque l'application ecrit (enregistre) dans la page. Pour les regions anonymes, un acces initial en lecture utilisera une page partagee du noyau contenant des zeros. Pour un fichier projete avec MAP_PRIVATE, un acces initial en lecture allouera des pages conformement a la politique du thread qui a fait que cette page a ete allouee. Cela peut ne pas etre le thread qui a appele mbind(). La politique specifiee sera ignoree pour toute projection MAP_SHARED dans la plage memoire specifiee. Les pages seront plutot allouees conformement a la politique de memoire du thread qui a fait que la page a ete allouee. Cela peut ne pas etre le thread qui a appele mbind(). Si la plage de memoire specifiee inclut une region de memoire partagee creee avec l'appel systeme shmget(2) et attachee avec l'appel systeme shmat(2), les pages allouees pour la region de memoire anonyme ou partagee seront allouees conformement a la politique specifiee, sans se soucier du processus attache au segment de memoire partage qui a provoque l'allocation. Si toutefois la region de memoire partagee a ete creee avec l'attribut SHM_HUGETLB, les grosses pages seront allouees conformement a la politique specifiee seulement si l'allocation de pages est provoquee par le processus qui a appele mbind() pour cette region. Par defaut, mbind() n'a d'effet que sur les nouvelles allocations ; s'il y a deja eu un acces aux pages dans la plage avant de configurer la politique, alors la politique n'a pas d'effet. Ce comportement par defaut peut etre ecrase par les attributs MPOL_MF_MOVE et MPOL_MF_MOVE_ALL decrits plus loin. Le parametre mode doit specifier l'un des attributs parmi MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_PREFERRED ou MPOL_LOCAL (qui sont decrits en details ci-dessous). Tous les modes de politique excepte MPOL_DEFAULT necessitent que l'appelant specifie, dans le parametre nodemask, le ou les noeuds auxquels s'appliquent le mode. L'argument mode peut aussi contenir des attributs optionnels. Les valeurs possibles sont : MPOL_F_NUMA_BALANCING (depuis Linux 5.15) Quand mode est MPOL_BIND, activer l'equilibrage NUMA du noyau pour la tache s'il est gere par le noyau. Si l'attribut n'est pas pris en charge par le noyau ou est utilise avec un autre mode que MPOL_BIND, -1 est renvoye et errno est positionne sur EINVAL. MPOL_F_STATIC_NODES (depuis Linux 2.6.26) Un parametre nodemask non vide indique des identifiants de noeuds physiques. Linux ne reassocie pas nodemask quand le thread change de contexte de cpuset ou apres une modification de l'ensemble de noeuds autorises par le contexte de cpuset en cours du thread. MPOL_F_RELATIVE_NODES (depuis Linux 2.6.26) Un parametre nodemask non vide indique des identifiants de noeuds relatifs a l'ensemble des identifiants de noeuds autorises par le cpuset en cours du thread. nodemask pointe sur un masque de bits qui contient jusqu'a maxnode bits. La taille du masque de bits est arrondie au multiple superieur de sizeof(unsigned long), mais le noyau n'utilisera que jusqu'a maxnode bits. Une valeur NULL pour nodemask ou une valeur maxnode de zero indique un ensemble vide de noeuds. Si la valeur de maxnode est zero, l'argument nodemask est ignore. Quand un nodemask est exige, il doit contenir au moins un noeud de connecte, autorise dans le contexte de cpuset en cours du thread appelant (a moins que le drapeau MPOL_F_STATIC_NODES ne soit fourni) et doit contenir de la memoire. Le parametre mode doit contenir une des valeurs suivantes : MPOL_DEFAULT Ce mode demande a ce que toute politique n'etant pas une politique par defaut soit retiree, ce qui restaure le comportement par defaut. Lorsqu'il est applique a une plage memoire a l'aide de mbind(), cela signifie d'utiliser la politique memoire du thread qui peut etre definie avec set_mempolicy(2). Si le mode de la politique de memoire du thread est egalement MPOL_DEFAULT, la politique par defaut du systeme sera utilisee. La politique par defaut du systeme alloue des pages sur le noeud du processeur qui a declenche l'allocation. Pour MPOL_DEFAULT, les parametres nodemask et maxnode doivent specifier l'ensemble vide de noeuds. MPOL_BIND Ce mode specifie une politique stricte qui restreint l'allocation memoire aux noeuds indiques dans nodemask. Si nodemask indique plus d'un noeud, les allocations de pages se feront a partir du noeud ayant assez d'espace libre et etant le plus proche de celui ou elles ont lieu. Il n'y aura pas d'allocation de pages a partir de noeuds non indiques dans nodemask (avant Linux 2.6.26, les allocations de pages se faisaient d'abord a partir du noeud dont l'identifiant numerique etait le plus petit jusqu'a ce que ce noeud ne contienne plus de memoire libre. Les allocations se faisaient ensuite a partir du noeud dont l'identifiant etait le prochain plus grand specifie dans nodemask et ainsi de suite jusqu'a ce que plus un seul noeud indique ne contienne de memoire libre). MPOL_INTERLEAVE Ce mode specifie que les allocations de pages sont entrelacees a travers l'ensemble de noeuds specifies dans nodemask. Cela optimise la bande passante au lieu de la latence en etalant les pages et l'acces memoire a ces pages a travers plusieurs noeuds. Pour etre efficace, la zone memoire doit etre relativement grande, au moins 1 Mo ou plus avec un modele d'acces assez uniforme. Les acces a une unique page de la zone seront toujours limites a la capacite memoire d'un seul noeud. MPOL_PREFERRED Ce mode definit le noeud prefere pour les allocations. Le noyau essaiera d'abord d'allouer sur ce noeud, avant de ce rabattre sur d'autres noeuds si celui-ci n'a plus assez de memoire libre. Si nodemask precise plus d'un identifiant de noeud, le premier noeud du masque sera choisi comme le noeud prefere. Si les parametres nodemask et maxnode indiquent un ensemble vide, la memoire est allouee sur le noeud du processeur qui a declenche l'allocation. MPOL_LOCAL (depuis Linux 3.8) Ce mode indique << allocation locale >> ; la memoire est allouee sur le noeud du processeur qui a declenche l'allocation (le << noeud local >>). Les parametres nodemask et maxnode doivent indiquer un ensemble vide. Si le << noeud local >> possede peu de memoire libre, le noyau essaiera d'allouer de la memoire a partir d'autres noeuds. Le noyau allouera de la memoire du << noeud local >> a chaque fois qu'il y en aura de disponible. Si le << noeud local >> n'est pas autorise par le contexte de cpuset actuel du thread, le noyau essaiera d'allouer de la memoire a partir d'autres noeuds. Le noyau allouera de la memoire a partir du << noeud local >> a chaque fois qu'il y sera autorise par le contexte de cpuset actuel du thread. Au contraire, MPOL_DEFAULT ramene a la politique memoire du thread (qui peut etre definie par set_mempolicy(2)) ; il peut s'agir d'une autre politique que l'<< allocation locale >>. Si l'option MPOL_MF_STRICT est passee dans flags et si mode n'est pas MPOL_DEFAULT, l'appel echoue avec l'erreur EIO si les pages de la plage memoire ne suivent pas la politique. Si MPOL_MF_MOVE est passe dans flags, le noyau essaiera de deplacer toutes les pages existantes dans la plage de memoire pour qu'elles suivent la politique. Les pages partagees avec d'autres processus ne sont pas deplacees. Si MPOL_MF_STRICT est egalement indique, l'appel echouera avec l'erreur EIO si certaines pages ne peuvent pas etre deplacees. Si la politique MPOL_INTERLEAVE a ete specifiee, les pages residant deja sur les noeuds specifies ne sont pas deplaces de sorte qu'ils sont entrelaces. Si MPOL_MF_MOVE_ALL est indique dans flags, alors le noyau essaiera de deplacer toutes les pages existantes dans la plage memoire, meme si d'autres processus les utilisent. Le thread appelant doit etre privilegie (avoir la capacite CAP_SYS_NICE) pour utiliser cette option. Si MPOL_MF_STRICT est egalement utilise, l'appel renverra l'erreur EIO si certaines pages ne peuvent pas etre deplacees. Si la politique MPOL_INTERLEAVE a ete specifiee, les pages residant deja sur les noeuds specifies ne sont pas deplaces de sorte qu'ils sont entrelaces. VALEUR RENVOYEE S'il reussit, mbind() renvoie 0. En cas d'erreur, il renvoie -1 et remplit errno avec la valeur d'erreur. ERREURS EFAULT Une partie ou toute la plage memoire specifiee par nodemask et maxnode pointe en dehors de votre espace d'adressage accessible. Ou il y a eu un trou non projete dans la plage de memoire specifiee avec addr et len. EINVAL Une valeur non valable a ete specifiee pour flags ou mode ; ou addr + len est plus petite que addr ; ou addr n'est pas un multiple de la taille de page systeme. Ou, mode est MPOL_DEFAULT et nodemask specifiait un ensemble non vide ; ou mode est MPOL_BIND ou MPOL_INTERLEAVE et nodemask est vide. Ou, maxnode depasse une limite imposee par le noyau. Ou, nodemask specifie un ou plusieurs identifiants de noeud qui sont plus grands que l'identifiant maximal de noeud pris en charge. Ou aucun des identifiants de noeuds specifies par nodemask ne sont disponibles et autorises dans le contexte de cpuset du thread en cours, ou aucun des noeuds specifies ne contient de memoire. Ou le parametre mode indiquait a la fois MPOL_F_STATIC_NODES et MPOL_F_RELATIVE_NODES. EIO MPOL_MF_STRICT a ete utilise et une page existante etait deja sur un noeud ne suivant pas la politique ; ou soit MPOL_MF_MOVE soit MPOL_MF_MOVE_ALL a ete specifie et le noyau n'a pas ete capable de deplacer toutes les pages existantes dans la plage. ENOMEM La memoire disponible du noyau n'etait pas suffisante. EPERM Le parametre flags incluait l'attribut MPOL_MF_MOVE_ALL et l'appelant n'avait pas le privilege CAP_SYS_NICE. STANDARDS Linux. HISTORIQUE Linux 2.6.7. La gestion de politique pour les pages immenses a ete ajoutee dans Linux 2.6.16. Pour que la politique d'entrelacement soit efficace sur les projections de pages immenses, la taille de la zone memoire doit etre au moins de dizaines de megaoctets. Avant Linux 5.7. MPOL_MF_STRICT etait ignore sur les projections de pages immenses. MPOL_MF_MOVE et MPOL_MF_MOVE_ALL ne sont disponibles qu'a partir de Linux 2.6.16. NOTES Pour des informations sur la prise en charge des bibliotheques, consultez numa(7). La politique NUMA n'est pas geree sur les plages de fichiers projetes en memoire qui ont ete projetees avec l'attribut MAP_SHARED. Le mode MPOL_DEFAULT peut avoir des effets differents sur mbind() et sur set_mempolicy(2). Lorsque MPOL_DEFAULT est specifie pour set_mempolicy(2), la politique memoire du thread est remise a la politique par defaut du systeme ou l'allocation locale. Lorsque MPOL_DEFAULT est specifie pour une plage de memoire utilisant mbind(), toutes les pages allouees par la suite pour cette plage utiliseront la politique du thread telle qu'elle a ete definie par set_mempolicy(2). Cela supprime de maniere effective la politique explicite de la plage specifiee, ce qui peut eventuellement remettre une politique autre que celle par defaut. Pour choisir explicitement une << allocation locale >> pour une plage memoire, specifiez mode de MPOL_LOCAL ou MPOL_PREFERRED avec un ensemble vide de noeuds. Cette methode fonctionnera aussi avec set_mempolicy(2). VOIR AUSSI get_mempolicy(2), getcpu(2), mmap(2), set_mempolicy(2), shmat(2), shmget(2), numa(3), cpuset(7), numa(7), numactl(8) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 9 decembre 2023 mbind(2)