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.

MFC after:	3 days
This commit is contained in:
jhb 2009-09-02 00:39:59 +00:00
parent 008ef8cd3b
commit 0c6bbf27ef
2 changed files with 24 additions and 18 deletions

View File

@ -990,18 +990,21 @@ apic_free_vector(u_int apic_id, u_int vector, u_int irq)
* 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). */

View File

@ -994,18 +994,21 @@ apic_free_vector(u_int apic_id, u_int vector, u_int irq)
* 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). */