Author: jeff
Date: Sat Feb 21 23:15:34 2009
New Revision: 188904
URL: http://svn.freebsd.org/changeset/base/188904

Log:
   - Resolve an issue where we may clear an idt while an interrupt on a
     different cpu is still assigned to that vector by never clearing idt
     entries.  This was only provided as a debugging feature and the bugs
     are caught by other means.
   - Drop the sched lock when rebinding to reassign an interrupt vector
     to a new cpu so that pending interrupts have a chance to be delivered
     before removing the old vector.
  
  Discussed with:       tegge, jhb

Modified:
  head/sys/amd64/amd64/local_apic.c
  head/sys/i386/i386/local_apic.c

Modified: head/sys/amd64/amd64/local_apic.c
==============================================================================
--- head/sys/amd64/amd64/local_apic.c   Sat Feb 21 22:57:26 2009        
(r188903)
+++ head/sys/amd64/amd64/local_apic.c   Sat Feb 21 23:15:34 2009        
(r188904)
@@ -900,7 +900,13 @@ apic_disable_vector(u_int apic_id, u_int
        KASSERT(vector != IDT_SYSCALL, ("Attempt to overwrite syscall entry"));
        KASSERT(ioint_handlers[vector / 32] != NULL,
            ("No ISR handler for vector %u", vector));
+#ifdef notyet
+       /*
+        * We can not currently clear the idt entry because other cpus
+        * may have a valid vector at this offset.
+        */
        setidt(vector, &IDTVEC(rsvd), SDT_SYSIGT, SEL_KPL, 0);
+#endif
 }
 
 /* Release an APIC vector when it's no longer in use. */
@@ -924,9 +930,11 @@ apic_free_vector(u_int apic_id, u_int ve
        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] = 0;
        mtx_unlock_spin(&icu_lock);
+       thread_lock(td);
        sched_unbind(td);
        thread_unlock(td);
 

Modified: head/sys/i386/i386/local_apic.c
==============================================================================
--- head/sys/i386/i386/local_apic.c     Sat Feb 21 22:57:26 2009        
(r188903)
+++ head/sys/i386/i386/local_apic.c     Sat Feb 21 23:15:34 2009        
(r188904)
@@ -903,8 +903,14 @@ apic_disable_vector(u_int apic_id, u_int
        KASSERT(vector != IDT_SYSCALL, ("Attempt to overwrite syscall entry"));
        KASSERT(ioint_handlers[vector / 32] != NULL,
            ("No ISR handler for vector %u", vector));
+#ifdef notyet
+       /*
+        * We can not currently clear the idt entry because other cpus
+        * may have a valid vector at this offset.
+        */
        setidt(vector, &IDTVEC(rsvd), SDT_SYS386TGT, SEL_KPL,
            GSEL(GCODE_SEL, SEL_KPL));
+#endif
 }
 
 /* Release an APIC vector when it's no longer in use. */
@@ -928,9 +934,11 @@ apic_free_vector(u_int apic_id, u_int ve
        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] = 0;
        mtx_unlock_spin(&icu_lock);
+       thread_lock(td);
        sched_unbind(td);
        thread_unlock(td);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to