summaryrefslogtreecommitdiff
path: root/sys/kern/kern_switch.c
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>2003-04-02 23:53:30 +0000
committerPeter Wemm <peter@FreeBSD.org>2003-04-02 23:53:30 +0000
commitcc66ebe2a9c6a435e7bb694ab47f2c98e6ee7eb2 (patch)
tree4ec7883ecb294f0c60d2aa5a5a0b58973fafc545 /sys/kern/kern_switch.c
parent996a395d37653e13a8b18f6bf5d943b12ab05b49 (diff)
Notes
Diffstat (limited to 'sys/kern/kern_switch.c')
-rw-r--r--sys/kern/kern_switch.c18
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;