diff options
author | jeff <jeff@FreeBSD.org> | 2003-12-20 20:36:19 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2003-12-20 20:36:19 +0000 |
commit | d4f3760df19ca22711e6d66761829690968394e0 (patch) | |
tree | fc5a49ad797c5755291731059c962e45b3d02222 /sys | |
parent | 4c2ac4ecef3ca01731ef2d445264dd4b1b86b887 (diff) | |
download | FreeBSD-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.c | 10 |
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 |