Я использую код, представленный по следующему вопросу numa+mbind+segfault, каждый вызов mbind возвращает EINVAL. Как я могу получить то, что точно неправильно? Я спрашиваю об этом, потому что EINVAL можно вернуть по многим причинам.mbind возвращает 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);
После запуска программы (путем изменения nodemask перед каждым вызовом mbind 1,2 и 4 соответственно), показанной ниже (в качестве ответа от Матса Петерсона). Иногда это происходит, а иногда и отлично. Когда 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. Благодарю. – tiki
Он выглядит как соответствующий код в 3.5 (http://lxr.linux.no/#linux+v3.5/mm/slub.c#L2305) и 3.7.4 (http://lxr.linux.no /#linux+v3.7.4/mm/slub.c#L2317) несколько изменился, но не значительно. Конечно, любая ошибка может быть в нескольких сотнях строк кода до вызова kmem_cache_alloc. Я не могу понять, где это будет неправильно. –