summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2003-12-20 20:36:19 +0000
committerjeff <jeff@FreeBSD.org>2003-12-20 20:36:19 +0000
commitd4f3760df19ca22711e6d66761829690968394e0 (patch)
treefc5a49ad797c5755291731059c962e45b3d02222 /sys
parent4c2ac4ecef3ca01731ef2d445264dd4b1b86b887 (diff)
downloadFreeBSD-src-d4f3760df19ca22711e6d66761829690968394e0.zip
FreeBSD-src-d4f3760df19ca22711e6d66761829690968394e0.tar.gz
- Enable ithread migration on x86. This is done to work around a bug in the
IO APIC on Xeons that prevents round-robin interrupt assignment from working.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/sched_ule.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c
index 8223c80..69f36cb 100644
--- a/sys/kern/sched_ule.c
+++ b/sys/kern/sched_ule.c
@@ -288,9 +288,19 @@ static int kseq_idled(struct kseq *kseq);
static void kseq_notify(struct kse *ke, int cpu);
static void kseq_assign(struct kseq *);
static struct kse *kseq_steal(struct kseq *kseq, int stealidle);
+/*
+ * On P4 Xeons the round-robin interrupt delivery is broken. As a result of
+ * this, we can't pin interrupts to the cpu that they were delivered to,
+ * otherwise all ithreads only run on CPU 0.
+ */
+#ifdef __i386__
+#define KSE_CAN_MIGRATE(ke, class) \
+ ((ke)->ke_thread->td_pinned == 0 && ((ke)->ke_flags & KEF_BOUND) == 0)
+#else /* !__i386__ */
#define KSE_CAN_MIGRATE(ke, class) \
((class) != PRI_ITHD && (ke)->ke_thread->td_pinned == 0 && \
((ke)->ke_flags & KEF_BOUND) == 0)
+#endif /* !__i386__ */
#endif
void
OpenPOWER on IntegriCloud