summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/amd64/local_apic.c21
-rw-r--r--sys/i386/i386/local_apic.c21
2 files changed, 24 insertions, 18 deletions
diff --git a/sys/amd64/amd64/local_apic.c b/sys/amd64/amd64/local_apic.c
index 13bd774..87bec91 100644
--- a/sys/amd64/amd64/local_apic.c
+++ b/sys/amd64/amd64/local_apic.c
@@ -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). */
diff --git a/sys/i386/i386/local_apic.c b/sys/i386/i386/local_apic.c
index 5e79aa8..9b1d1b31 100644
--- a/sys/i386/i386/local_apic.c
+++ b/sys/i386/i386/local_apic.c
@@ -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). */
OpenPOWER on IntegriCloud