3
Iはnuma_alloc_onnodeを使用して、特定の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()に置き換えると、正常に動作します。ノード番号を取得します。
ここで何が起こっているのか誰も知っていますか?
ありがとうございます。
あなたは正しいですか?あなたは12秒で私を打つ!割り当てられたスペース(単純なptr [0] = 0;が行う)に書き込むと、上記のコードが期待どおりに機能することがわかります。それは私にノード番号を与えます。読書は数えられません。これはmanページと矛盾しているようです。これはnuma_alloc_ *関数であり、自動的に処理されませんでした!私はDebian Squeezeにあります。 –
ちょっと、私のことを「自動的に」混乱させてしまいましたが、それはおそらく「ページフォールディングメカニズムを自動的に設定する」と考えているドイツのカーネルエンジニアが書いたことを思い出しました。 :) – sarnold
私はあなたが正しいと思う:) –