【发布时间】:2013-01-10 18:51:58
【问题描述】:
我正在使用为以下问题提供的代码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 调用之前将节点掩码分别更改为 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
【问题讨论】:
-
对我来说看起来像是一个适当的内核崩溃。不知道为什么——你运行的是什么内核?我不确定这是一个容易解决的问题。您的系统通常很稳定并且运行良好,是吗?
-
@MatsPetersson 这是 Ubuntu 12.10。 Linux 3.5.0-19-generic #30,x86_64。谢谢。
-
看起来 3.5 (lxr.linux.no/#linux+v3.5/mm/slub.c#L2305) 和 3.7.4 (lxr.linux.no/#linux+v3.7.4/mm/slub.c#L2317) 中的相关代码发生了一些变化,但变化不大。当然,任何错误也可能在调用 kmem_cache_alloc 之前的几百行代码中。我真的不知道这会出什么问题。
-
@MatsPetersson 好的,感谢您的帮助!