diff options
Diffstat (limited to 'sys/amd64/amd64/mp_machdep.c')
-rw-r--r-- | sys/amd64/amd64/mp_machdep.c | 27 |
1 files changed, 4 insertions, 23 deletions
diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index 4066866..b64bc76 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include <sys/mutex.h> #include <sys/pcpu.h> #include <sys/proc.h> +#include <sys/sched.h> #include <sys/smp.h> #include <sys/sysctl.h> @@ -590,25 +591,7 @@ init_secondary(void) while (smp_started == 0) ia32_pause(); - /* ok, now grab sched_lock and enter the scheduler */ - mtx_lock_spin(&sched_lock); - - /* - * Correct spinlock nesting. The idle thread context that we are - * borrowing was created so that it would start out with a single - * spin lock (sched_lock) held in fork_trampoline(). Since we've - * explicitly acquired locks in this function, the nesting count - * is now 2 rather than 1. Since we are nested, calling - * spinlock_exit() will simply adjust the counts without allowing - * spin lock using code to interrupt us. - */ - spinlock_exit(); - KASSERT(curthread->td_md.md_spinlock_count == 1, ("invalid count")); - - PCPU_SET(switchtime, cpu_ticks()); - PCPU_SET(switchticks, ticks); - - cpu_throw(NULL, choosethread()); /* doesn't return */ + sched_throw(NULL); panic("scheduler returned us to %s", __func__); /* NOTREACHED */ @@ -988,12 +971,12 @@ ipi_bitmap_handler(struct trapframe frame) if (ipi_bitmap & (1 << IPI_PREEMPT)) { struct thread *running_thread = curthread; - mtx_lock_spin(&sched_lock); + thread_lock(running_thread); if (running_thread->td_critnest > 1) running_thread->td_owepreempt = 1; else mi_switch(SW_INVOL | SW_PREEMPT, NULL); - mtx_unlock_spin(&sched_lock); + thread_unlock(running_thread); } /* Nothing to do for AST */ @@ -1177,11 +1160,9 @@ release_aps(void *dummy __unused) if (mp_ncpus == 1) return; - mtx_lock_spin(&sched_lock); atomic_store_rel_int(&aps_ready, 1); while (smp_started == 0) ia32_pause(); - mtx_unlock_spin(&sched_lock); } SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, release_aps, NULL); |