Index: sys/vm/vm_zeroidle.c =================================================================== --- sys/vm/vm_zeroidle.c (revision 250609) +++ sys/vm/vm_zeroidle.c (working copy) @@ -39,6 +39,9 @@ __FBSDID("$FreeBSD$"); #include #include +#ifdef SMP +#include +#endif #include #include #include @@ -142,21 +145,44 @@ vm_pagezero(void __unused *arg) static void pagezero_start(void __unused *arg) { +#ifdef SMP + cpuset_t setmask; + struct pcpu *pc; +#endif int error; struct proc *p; struct thread *td; - error = kproc_create(vm_pagezero, NULL, &p, RFSTOPPED, 0, "pagezero"); - if (error) - panic("pagezero_start: error %d\n", error); - td = FIRST_THREAD_IN_PROC(p); - thread_lock(td); + p = NULL; +#ifdef SMP + STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) { + error = kproc_kthread_add(vm_pagezero, NULL, &p, &td, + RFSTOPPED, 0, "pagezero", "pagezero: cpu%d", pc->pc_cpuid); + if (error) + panic("pagezero_start: kproc_kthread_add failed %d\n", + error); + CPU_SETOF(pc->pc_cpuid, &setmask); + error = cpuset_setthread(td->td_tid, &setmask); + if (error) + panic("pagezero_start: cpuset_setthread failed %d\n", + error); +#else + error = kproc_kthread_add(vm_pagezero, NULL, &p, &td, + RFSTOPPED, 0, "pagezero", "pagezero"); + if (error) + panic("pagezero_start: kproc_kthread_add failed %d\n", + error); +#endif + thread_lock(td); - /* We're an idle task, don't count us in the load. */ - td->td_flags |= TDF_NOLOAD; - sched_class(td, PRI_IDLE); - sched_prio(td, PRI_MAX_IDLE); - sched_add(td, SRQ_BORING); - thread_unlock(td); + /* We're an idle task, don't count us in the load. */ + td->td_flags |= TDF_NOLOAD; + sched_class(td, PRI_IDLE); + sched_prio(td, PRI_MAX_IDLE); + sched_add(td, SRQ_BORING); + thread_unlock(td); +#ifdef SMP + } +#endif } SYSINIT(pagezero, SI_SUB_KTHREAD_VM, SI_ORDER_ANY, pagezero_start, NULL);