diff options
| author | Peter Wemm <peter@FreeBSD.org> | 2003-04-02 23:53:30 +0000 |
|---|---|---|
| committer | Peter Wemm <peter@FreeBSD.org> | 2003-04-02 23:53:30 +0000 |
| commit | cc66ebe2a9c6a435e7bb694ab47f2c98e6ee7eb2 (patch) | |
| tree | 4ec7883ecb294f0c60d2aa5a5a0b58973fafc545 /sys/kern/kern_switch.c | |
| parent | 996a395d37653e13a8b18f6bf5d943b12ab05b49 (diff) | |
Notes
Diffstat (limited to 'sys/kern/kern_switch.c')
| -rw-r--r-- | sys/kern/kern_switch.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/sys/kern/kern_switch.c b/sys/kern/kern_switch.c index 8c3924344df3..377ad429ff45 100644 --- a/sys/kern/kern_switch.c +++ b/sys/kern/kern_switch.c @@ -98,6 +98,9 @@ reassigned to keep this true. #include <sys/proc.h> #include <sys/queue.h> #include <sys/sched.h> +#if defined(SMP) && defined(__i386__) +#include <sys/smp.h> +#endif #include <machine/critical.h> CTASSERT((RQB_BPW * RQB_LEN) == RQ_NQS); @@ -122,8 +125,21 @@ choosethread(void) struct thread *td; struct ksegrp *kg; +#if defined(SMP) && defined(__i386__) + if (smp_active == 0 && PCPU_GET(cpuid) != 0) { + /* Shutting down, run idlethread on AP's */ + td = PCPU_GET(idlethread); + ke = td->td_kse; + CTR1(KTR_RUNQ, "choosethread: td=%p (idle)", td); + ke->ke_flags |= KEF_DIDRUN; + TD_SET_RUNNING(td); + return (td); + } +#endif + retry: - if ((ke = sched_choose())) { + ke = sched_choose(); + if (ke) { td = ke->ke_thread; KASSERT((td->td_kse == ke), ("kse/thread mismatch")); kg = ke->ke_ksegrp; |
