svn commit: r196996 - in stable/8/sys: . amd64/amd64
amd64/include/xen cddl/contrib/opensolaris contrib/dev/acpica
contrib/pf dev/xen/xenpci i386/i386
John Baldwin
jhb at FreeBSD.org
Tue Sep 8 21:50:36 UTC 2009
Author: jhb
Date: Tue Sep 8 21:50:34 2009
New Revision: 196996
URL: http://svn.freebsd.org/changeset/base/196996
Log:
MFC 196745:
Don't attempt to bind the current thread to the CPU an IRQ is bound to
when removing an interrupt handler from an IRQ during shutdown. During
shutdown we are already bound to CPU 0 and this was triggering a panic.
Approved by: re (kib)
Modified:
stable/8/sys/ (props changed)
stable/8/sys/amd64/amd64/local_apic.c
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
stable/8/sys/i386/i386/local_apic.c
Modified: stable/8/sys/amd64/amd64/local_apic.c
==============================================================================
--- stable/8/sys/amd64/amd64/local_apic.c Tue Sep 8 21:17:17 2009 (r196995)
+++ stable/8/sys/amd64/amd64/local_apic.c Tue Sep 8 21:50:34 2009 (r196996)
@@ -990,18 +990,21 @@ apic_free_vector(u_int apic_id, u_int ve
* we don't lose an interrupt delivery race.
*/
td = curthread;
- thread_lock(td);
- if (sched_is_bound(td))
- panic("apic_free_vector: Thread already bound.\n");
- sched_bind(td, apic_cpuid(apic_id));
- thread_unlock(td);
+ if (!rebooting) {
+ thread_lock(td);
+ if (sched_is_bound(td))
+ panic("apic_free_vector: Thread already bound.\n");
+ sched_bind(td, apic_cpuid(apic_id));
+ thread_unlock(td);
+ }
mtx_lock_spin(&icu_lock);
lapics[apic_id].la_ioint_irqs[vector - APIC_IO_INTS] = -1;
mtx_unlock_spin(&icu_lock);
- thread_lock(td);
- sched_unbind(td);
- thread_unlock(td);
-
+ if (!rebooting) {
+ thread_lock(td);
+ sched_unbind(td);
+ thread_unlock(td);
+ }
}
/* Map an IDT vector (APIC) to an IRQ (interrupt source). */
Modified: stable/8/sys/i386/i386/local_apic.c
==============================================================================
--- stable/8/sys/i386/i386/local_apic.c Tue Sep 8 21:17:17 2009 (r196995)
+++ stable/8/sys/i386/i386/local_apic.c Tue Sep 8 21:50:34 2009 (r196996)
@@ -994,18 +994,21 @@ apic_free_vector(u_int apic_id, u_int ve
* we don't lose an interrupt delivery race.
*/
td = curthread;
- thread_lock(td);
- if (sched_is_bound(td))
- panic("apic_free_vector: Thread already bound.\n");
- sched_bind(td, apic_cpuid(apic_id));
- thread_unlock(td);
+ if (!rebooting) {
+ thread_lock(td);
+ if (sched_is_bound(td))
+ panic("apic_free_vector: Thread already bound.\n");
+ sched_bind(td, apic_cpuid(apic_id));
+ thread_unlock(td);
+ }
mtx_lock_spin(&icu_lock);
lapics[apic_id].la_ioint_irqs[vector - APIC_IO_INTS] = -1;
mtx_unlock_spin(&icu_lock);
- thread_lock(td);
- sched_unbind(td);
- thread_unlock(td);
-
+ if (!rebooting) {
+ thread_lock(td);
+ sched_unbind(td);
+ thread_unlock(td);
+ }
}
/* Map an IDT vector (APIC) to an IRQ (interrupt source). */
More information about the svn-src-stable-8
mailing list