我正在使用以下问题提供的代码numa+mbind+segfault,每个调用mbind都返回EINVAL。如何确定出错原因?我问这个问题是因为EINVAL可能由许多原因引起。
在运行下面的程序(通过在每个mbind调用之前将nodemask更改为1、2和4,如Mats Petersson的答案所示)之后,有时会出现分段错误,有时会正常运行。当它出现分段错误时,dmesg如下:
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