mbind(2) System Calls Manual mbind(2) NOM mbind - Definir la politique memoire pour une zone de memoire BIBLIOTHEQUE NUMA (Non-Uniform Memory Access) policy library (libnuma, -lnuma) SYNOPSIS #include long mbind(unsigned long size, unsigned long maxnode; void addr[size], unsigned long size, int mode, const unsigned long nodemask[(maxnode + ULONG_WIDTH - 1) / ULONG_WIDTH], unsigned long maxnode, unsigned int flags); DESCRIPTION mbind() sets the NUMA memory policy, which consists of a policy mode and zero or more nodes, for the memory range starting with addr and continuing for size bytes. The memory policy defines from which node memory is allocated. If the memory range specified by the addr and size arguments includes an "anonymous" region of memory--that is a region of memory created using the mmap(2) system call with the MAP_ANONYMOUS--or a memory-mapped file, mapped using the mmap(2) system call with the MAP_PRIVATE flag, pages will be allocated only according to the specified policy when the application writes (stores) to the page. For anonymous regions, an initial read access will use a shared page in the kernel containing all zeros. For a file mapped with MAP_PRIVATE, an initial read access will allocate pages according to the memory policy of the thread that causes the page to be allocated. This may not be the thread that called 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. The mode argument must specify one of MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_WEIGHTED_INTERLEAVE, MPOL_PREFERRED, MPOL_PREFERRED_MANY, or MPOL_LOCAL (which are described in detail below). All policy modes except MPOL_DEFAULT require the caller to specify the node or nodes to which the mode applies, via the nodemask argument. 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_WEIGHTED_INTERLEAVE (depuis Linux 6.9) Ce mode entrelace les affectations de pages a travers les noeuds indiques dans nodemask selon leur poids dans /sys/kernel/mm/mempolicy/weighted_interleave. Par exemple, si les bits 0, 2 et 5 sont positionnes dans nodemask, et si le contenu de /sys/kernel/mm/mempolicy/weighted_interleave/node0, de /sys/.../node2, and /sys/.../node5 sont respectivement de 4, 7 et 9, les pages de cette region seront affectees aux noeuds 0, 2 et 5 selon un ratio de 4:7:9. 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_PREFERRED_MANY (since Linux 5.15) Specifies a set of nodes for allocation; see set_mempolicy(2). 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 Part or all of the memory range specified by nodemask and maxnode points outside your accessible address space. Or, there was an unmapped hole in the specified memory range specified by addr and size. EINVAL An invalid value was specified for flags or mode; or addr + size was less than addr; or addr is not a multiple of the system page size. Or, mode is MPOL_DEFAULT and nodemask specified a nonempty set; or mode is MPOL_BIND or MPOL_INTERLEAVE and nodemask is empty. Or, maxnode exceeds a kernel-imposed limit. Or, nodemask specifies one or more node IDs that are greater than the maximum supported node ID. Or, none of the node IDs specified by nodemask are on-line and allowed by the thread's current cpuset context, or none of the specified nodes contain memory. Or, the mode argument specified both MPOL_F_STATIC_NODES and 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. NORMES 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 Consultez numa(7) pour des informations sur la prise en charge par des bibliotheques. 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.18 8 fevrier 2026 mbind(2)