Почему выделения с помощью numa_alloc_onnode () ведут к «Страница отсутствует»? - PullRequest
3 голосов
/ 12 ноября 2011

Когда я выделяю память на конкретном узле NUMA, используя numa_alloc_onnode (), вот так:

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);
}

и затем используйте move_pages (), чтобы попытаться подтвердить, что выделенная память действительно находится на узле 1:

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

где

// 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]);

}

Я получаю ответ "ptr находится на узле -2". Из errno-base.h я нахожу, что 2 - ENOENT, а на странице руководства move_pages () говорится, что состояние -ENOENT в этом контексте означает «Страница отсутствует».

Если я заменю numa_alloc_onnode () на обычную malloc (), она будет работать нормально: я получу номер узла.

Кто-нибудь знает, что здесь происходит?

Заранее спасибо.

1 Ответ

3 голосов
/ 12 ноября 2011

numa_alloc_onnode(3) говорит:

   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.

Означает ли это, что вам нужно что-то сохранить на недавно выделенной странице, прежде чем ядро ​​фактически даст вам эту страницу?

...