次の質問numa+mbind+segfaultに提供されているコードを使用しています。mbind を呼び出すたびに EINVAL が返されます。正確に何が間違っているのかをどうやって知ることができますか? EINVAL は多くの理由で返される可能性があるため、私はこれを求めています。
page_size = sysconf(_SC_PAGESIZE);
objs_per_page = page_size/sizeof(A[0]);
assert(page_size%sizeof(A[0])==0);
split_three=num_items/3;
aligned_size=(split_three/objs_per_page)*objs_per_page;
remnant=num_items-(aligned_size*3);
piece = aligned_size;
nodemask=1;
mbind(&A[0],piece*sizeof(double),MPOL_BIND,&nodemask,64,MPOL_MF_MOVE);
nodemask=2;
mbind(&A[aligned_size],piece*sizeof(double),MPOL_BIND,&nodemask,64,MPOL_MF_MOVE);
nodemask=4;
bind(&A[aligned_size*2+remnant],piece*sizeof(double),MPOL_BIND,
&nodemask,64,MPOL_MF_MOVE);
プログラムを実行した後 (各 mbind 呼び出しの前に nodemask をそれぞれ 1、2、および 4 に変更することにより) 以下に示します (Mats Petersson からの回答として)。セグメンテーション違反になることもあれば、正常に実行されることもあります。セグメンテーション違反時の dmesg は次のとおりです。
Stack:
Call Trace:
mpol_new+0x5d/0xb0
sys_mbind+0x125/0x4f0
finish_task_switch+0x4a/0xf0
? __schedule+0x3cf/0x7c0
system_call_fastpath+0x16/0x1b
Code: ...
kmem_cache_alloc+0x58/0x130