--- sys/kern/kern_timeout.c.orig 2009-09-25 09:42:55.007102687 +0900 +++ sys/kern/kern_timeout.c 2009-10-18 19:47:15.537282684 +0900 @@ -201,6 +201,7 @@ start_softclock(void *dummy) { struct callout_cpu *cc; #ifdef SMP + struct intr_event *ie; /* This can be a member of callout_cpu. */ int cpu; #endif @@ -210,13 +211,15 @@ start_softclock(void *dummy) panic("died while creating standard software ithreads"); cc->cc_cookie = softclock_ih; #ifdef SMP + intr_event_bind(clk_intr_event, timeout_cpu); for (cpu = 0; cpu <= mp_maxid; cpu++) { if (cpu == timeout_cpu) continue; if (CPU_ABSENT(cpu)) continue; cc = CC_CPU(cpu); - if (swi_add(NULL, "clock", softclock, cc, SWI_CLOCK, + ie = NULL; + if (swi_add(&ie, "clock", softclock, cc, SWI_CLOCK, INTR_MPSAFE, &cc->cc_cookie)) panic("died while creating standard software ithreads"); cc->cc_callout = NULL; /* Only cpu0 handles timeout(). */ @@ -224,6 +227,7 @@ start_softclock(void *dummy) sizeof(struct callout_tailq) * callwheelsize, M_CALLOUT, M_WAITOK); callout_cpu_init(cc); + intr_event_bind(ie, cpu); } #endif }