numa_alloc_onnode()での割り当てが「ページが存在しません」につながるのはなぜですか?

numa_alloc_onnode()を使用して特定のNUMAノードにメモリを割り当てると、次のようになります。

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()に置き換えると、正常に動作します。ノード番号を取得します。

誰がここで何が起こっているか考えているのですか?

前もって感謝します。

3

1 答え

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.

カーネルが実際にあなたにページを与える前に、新しく割り当てられたページに何かを保存する必要があるのでしょうか?

3
追加された
あなたは正しいです。あなたは12秒で私を打つ!割り当てられたスペース(単純なptr [0] = 0;が行う)に書き込むと、上記のコードが期待どおりに機能することがわかります。それは私にノード番号を与えます。読書は数えられません。これはmanページと矛盾しているようです。これはnuma_alloc_ *関数であり、自動的に処理されませんでした!私はDebian Squeezeにあります。
追加された 著者 Rob_before_edits,
私はあなたが正しいと思う:)
追加された 著者 Rob_before_edits,
Heh、それは私にも "自動的に"混乱させてしまいましたが、それはおそらく "ページフォールディングメカニズムを自動的に設定する"と思うドイツのカーネルエンジニアが書いたことを思い出しました。 :)
追加された 著者 sarnold,