From 1d296b125a2c84b86a5596cc8e14b3fb52c7f1f3 Mon Sep 17 00:00:00 2001 From: jhb Date: Mon, 3 Jan 2011 18:22:22 +0000 Subject: [PATCH] MFC 216679: Drop the icu_lock spinlock while pausing briefly after masking the interrupt in the I/O APIC before moving it to a different CPU. Approved by: re (kib) git-svn-id: svn://svn.freebsd.org/base/releng/8.2@216924 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/amd64/amd64/io_apic.c | 2 ++ sys/i386/i386/io_apic.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/sys/amd64/amd64/io_apic.c b/sys/amd64/amd64/io_apic.c index 96febb11..dbc7b429 100644 --- a/sys/amd64/amd64/io_apic.c +++ b/sys/amd64/amd64/io_apic.c @@ -359,7 +359,9 @@ ioapic_assign_cpu(struct intsrc *isrc, u_int apic_id) if (!intpin->io_masked && !intpin->io_edgetrigger) { ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin), intpin->io_lowreg | IOART_INTMSET); + mtx_unlock_spin(&icu_lock); DELAY(100); + mtx_lock_spin(&icu_lock); } intpin->io_cpu = apic_id; diff --git a/sys/i386/i386/io_apic.c b/sys/i386/i386/io_apic.c index 4468486d..0a879b37 100644 --- a/sys/i386/i386/io_apic.c +++ b/sys/i386/i386/io_apic.c @@ -359,7 +359,9 @@ ioapic_assign_cpu(struct intsrc *isrc, u_int apic_id) if (!intpin->io_masked && !intpin->io_edgetrigger) { ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin), intpin->io_lowreg | IOART_INTMSET); + mtx_unlock_spin(&icu_lock); DELAY(100); + mtx_lock_spin(&icu_lock); } intpin->io_cpu = apic_id; -- 2.42.0