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

ここで何が起こっているのか誰も知っていますか?

ありがとうございます。

答えて

3

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. 

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

+0

あなたは正しいですか?あなたは12秒で私を打つ!割り当てられたスペース(単純なptr [0] = 0;が行う)に書き込むと、上記のコードが期待どおりに機能することがわかります。それは私にノード番号を与えます。読書は数えられません。これはmanページと矛盾しているようです。これはnuma_alloc_ *関数であり、自動的に処理されませんでした!私はDebian Squeezeにあります。 –

+0

ちょっと、私のことを「自動的に」混乱させてしまいましたが、それはおそらく「ページフォールディングメカニズムを自動的に設定する」と考えているドイツのカーネルエンジニアが書いたことを思い出しました。 :) – sarnold

+0

私はあなたが正しいと思う:) –

関連する問題