From: Qing H. <Q....@ma...> - 2002-05-08 16:17:23
|
When I boot the 16-processors kernel 2.4.18-23, it often freezes: Starting up other processors: #1 - idle thread pid = 1855.. online #2 - idle thread pid = 1857.. online #3 - idle thread pid = 1859.. online #4 - idle thread pid = 1861.. online #5 - idle thread pid = 1863.. online #6 - idle thread pid = 1865.. online #7 - idle thread pid = 1867.. online #8 - idle thread pid = 1869.. online #9 - idle thread pid = 1871.. online #10 - idle thread pid = 1873.. online #11 - idle thread pid = 1875.. online #12 - idle thread pid = 1877.. online #13 - idle thread pid = 1879.. online #14 - idle thread pid = 1881.. online #15 - idle thread pid = 1883.. online All CPUs are go! Waiting on wait_init_idle (map = 0xfffe) All processors have done init_idle Linux NET4.0 for Linux 2.4 Based upon Swansea University Computer Society NET3.039 Initializing RT netlink socket <<---- freezing here Seg fault in signals <<---- If I press Ctrl + C, I see the error message. Then I hack into the code, I found that error happen in this fregament of code, when __init do_initcalls is called: ==================================================== static void __init do_initcalls(void) { initcall_t *call; call = &__initcall_start; do { (*call)(); <-- It often freezes in the second loop call++; } while (call < &__initcall_end); /* Make sure there is no pending stuff from the initcall sequence */ flush_scheduled_tasks(); } =================================================== UML often freezes when reaching the second loop. At that time I can see two UML processes in host by top : 5990 root 16 0 1656 1656 1648 R 48.0 0.6 0:24 linux 5982 root 14 0 1656 1656 1648 R 47.6 0.6 0:24 linux 1692 root 9 -1 84860 12M 3456 S < 2.3 5.1 0:12 X I don't know what function should be called in the while loop in do_initcalls( ). And I am not sure if the second function has something wrong with SMP or just the first two functions get into race. But after this step, the 16-processors UML is likely to boot to the login screen successfully. By the way, pid = idle_thread1(idle_proc, i) should be pid = idle_thread(idle_proc, i) in smp.c; Thanks, Qing |