Waarom leiden toewijzingen met numa_alloc_onnode () tot "De pagina is niet aanwezig"?

Wanneer ik geheugen toewijs aan een specifiek NUMA-knooppunt met behulp van numa_alloc_onnode() zoals dit:

char *ptr;
if ((ptr = (char *) numa_alloc_onnode(1024,1)) == NULL) {
  fprintf(stderr,"Problem in %s line %d allocating memory\n",__FILE__,__LINE__);
  return(1);
}

en gebruik dan move_pages() om te proberen en te bevestigen dat het toegewezen geheugen inderdaad op knooppunt 1 zit:

  printf("ptr is on node %d\n",get_node(ptr));

waar

// This function returns the NUMA node that a pointer address resides on.

int get_node(void *p)
{
  int status[1];
  void *pa;
  unsigned long a;

 //round p down to the nearest page boundary

  a  = (unsigned long) p;
  a  = a - (a % ((unsigned long) getpagesize()));
  pa = (void *) a;    

  if (move_pages(0,1,&pa,NULL,status,0) != 0) {
    fprintf(stderr,"Problem in %s line %d calling move_pages()\n",__FILE__,__LINE__);
    abort();
  }

  return(status[0]);

}

Ik krijg het antwoord "ptr staat op knooppunt -2". Van errno-base.h vind ik dat 2 ENOENT is, en de man-pagina move_pages() zegt dat een status van -ENOENT in deze context betekent "De pagina is niet aanwezig".

Als ik numa_alloc_onnode() vervang door gewone malloc() werkt het prima: ik krijg een knooppuntnummer.

Heeft iemand enig idee wat hier aan de hand is?

Bij voorbaat dank.

3

1 antwoord

numa_alloc_onnode(3) says:

   All numa memory allocation policy only takes effect when a
   page is actually faulted into the address space of a process
   by accessing it. The numa_alloc_* functions take care of this
   automatically.

Betekent dit dat je iets moet opslaan in de nieuw toegewezen pagina voordat de kernel je daadwerkelijk de pagina geeft?

3
toegevoegd
Je hebt gelijk. Je hebt me 12 seconden verslagen! Het blijkt dat schrijven naar de toegewezen ruimte (een eenvoudige ptr [0] = 0; zal doen) de bovenstaande code werkt zoals verwacht: het geeft me een knooppuntnummer. Lezen telt niet, lijkt het. Het lijkt mij ook dat dit de man-pagina tegenspreekt: dit is een functie numa_alloc_ * en er is niet automatisch voor gezorgd! Ik zit in Debian Squeeze, als dat relevant is.
toegevoegd de auteur Rob_before_edits, de bron
Ik denk dat je gelijk hebt :)
toegevoegd de auteur Rob_before_edits, de bron
Heh, dat stukje over 'automatisch' verwarde me ook - maar toen herinnerde ik me dat het geschreven was door een Duitse kernel ingenieur die waarschijnlijk denkt aan 'automatisch instellen van het mechanisme voor pagina-fouten'. :)
toegevoegd de auteur sarnold, de bron