Reimplement IPI forwarding of FAST interrupts to the cpu owning the BGL
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 3 Nov 2005 04:54:02 +0000 (04:54 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 3 Nov 2005 04:54:02 +0000 (04:54 +0000)
(if the FAST interrupt requires the BGL).  This was temporarily removed
when the interrupt dispatch code was revamped and has now been resurrected.

sys/i386/include/lock.h
sys/i386/isa/intr_machdep.h
sys/kern/kern_intr.c
sys/platform/pc32/include/lock.h
sys/platform/pc32/isa/intr_machdep.h
sys/sys/interrupt.h
sys/sys/machintr.h

index b8a2f3a..3e8c5fa 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/i386/include/lock.h,v 1.11.2.2 2000/09/30 02:49:34 ps Exp $
- * $DragonFly: src/sys/i386/include/Attic/lock.h,v 1.12 2005/08/28 15:27:05 hsu Exp $
+ * $DragonFly: src/sys/i386/include/Attic/lock.h,v 1.13 2005/11/03 04:53:57 dillon Exp $
  */
 
 #ifndef _MACHINE_LOCK_H_
@@ -199,11 +199,18 @@ cpu_rel_mplock(void)
        mp_lock = MP_FREE_LOCK;
 }
 
+static __inline int
+owner_mplock(void)
+{
+       return (mp_lock);
+}
+
 #else
 
 #define get_mplock()
 #define try_mplock()   1
 #define rel_mplock()
+#define owner_mplock() 0       /* always cpu 0 */
 #define ASSERT_MP_LOCK_HELD(td)
 
 #endif /* SMP */
index ecbcdcd..fa56f9e 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/isa/intr_machdep.h,v 1.19.2.2 2001/10/14 20:05:50 luigi Exp $
- * $DragonFly: src/sys/i386/isa/Attic/intr_machdep.h,v 1.20 2005/11/02 22:59:47 dillon Exp $
+ * $DragonFly: src/sys/i386/isa/Attic/intr_machdep.h,v 1.21 2005/11/03 04:53:59 dillon Exp $
  */
 
 #ifndef _I386_ISA_INTR_MACHDEP_H_
@@ -172,7 +172,6 @@ void        icu_reinit (void);
 void *inthand_add(const char *name, int irq, inthand2_t handler,
                  void *arg, int flags, lwkt_serialize_t serializer);
 int inthand_remove(void *id);
-void forward_fastint_remote(void *arg);
 
 #endif /* LOCORE */
 
index 4651fe7..ec24a82 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_intr.c,v 1.24.2.1 2001/10/14 20:05:50 luigi Exp $
- * $DragonFly: src/sys/kern/kern_intr.c,v 1.31 2005/11/02 22:59:48 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_intr.c,v 1.32 2005/11/03 04:54:00 dillon Exp $
  *
  */
 
@@ -547,10 +547,23 @@ ithread_fast_handler(struct intrframe frame)
 #ifdef SMP
            if ((rec->intr_flags & INTR_MPSAFE) == 0 && got_mplock == 0) {
                if (try_mplock() == 0) {
+                   int owner;
+
                    /*
-                    * XXX forward to the cpu holding the MP lock
+                    * If we couldn't get the MP lock try to forward it
+                    * to the cpu holding the MP lock, setting must_schedule
+                    * to -1 so we do not schedule and also do not unmask
+                    * the interrupt.  Otherwise just schedule it.
                     */
-                   must_schedule = 1;
+                   owner = owner_mplock();
+                   if (owner >= 0 && owner != gd->gd_cpuid) {
+                       lwkt_send_ipiq_bycpu(owner, forward_fastint_remote,
+                                               (void *)owner);
+                       must_schedule = -1;
+                       ++gd->gd_cnt.v_forwarded_ints;
+                   } else {
+                       must_schedule = 1;
+                   }
                    break;
                }
                got_mplock = 1;
@@ -583,9 +596,9 @@ ithread_fast_handler(struct intrframe frame)
      * be re-enabled, and a non-zero return indicates that the interrupt
      * thread controls re-enablement.
      */
-    if (must_schedule)
+    if (must_schedule > 0)
        sched_ithd(intr);
-    else
+    else if (must_schedule == 0)
        ++info->i_count;
     return(must_schedule);
 }
index 8297185..97b0c66 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/i386/include/lock.h,v 1.11.2.2 2000/09/30 02:49:34 ps Exp $
- * $DragonFly: src/sys/platform/pc32/include/lock.h,v 1.12 2005/08/28 15:27:05 hsu Exp $
+ * $DragonFly: src/sys/platform/pc32/include/lock.h,v 1.13 2005/11/03 04:53:57 dillon Exp $
  */
 
 #ifndef _MACHINE_LOCK_H_
@@ -199,11 +199,18 @@ cpu_rel_mplock(void)
        mp_lock = MP_FREE_LOCK;
 }
 
+static __inline int
+owner_mplock(void)
+{
+       return (mp_lock);
+}
+
 #else
 
 #define get_mplock()
 #define try_mplock()   1
 #define rel_mplock()
+#define owner_mplock() 0       /* always cpu 0 */
 #define ASSERT_MP_LOCK_HELD(td)
 
 #endif /* SMP */
index f05c314..d624138 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/isa/intr_machdep.h,v 1.19.2.2 2001/10/14 20:05:50 luigi Exp $
- * $DragonFly: src/sys/platform/pc32/isa/intr_machdep.h,v 1.20 2005/11/02 22:59:47 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/isa/intr_machdep.h,v 1.21 2005/11/03 04:53:59 dillon Exp $
  */
 
 #ifndef _I386_ISA_INTR_MACHDEP_H_
@@ -172,7 +172,6 @@ void        icu_reinit (void);
 void *inthand_add(const char *name, int irq, inthand2_t handler,
                  void *arg, int flags, lwkt_serialize_t serializer);
 int inthand_remove(void *id);
-void forward_fastint_remote(void *arg);
 
 #endif /* LOCORE */
 
index 295f4ea..1416219 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/sys/interrupt.h,v 1.9.2.1 2001/10/14 20:05:50 luigi Exp $
- * $DragonFly: src/sys/sys/interrupt.h,v 1.14 2005/11/02 22:59:49 dillon Exp $
+ * $DragonFly: src/sys/sys/interrupt.h,v 1.15 2005/11/03 04:54:02 dillon Exp $
  */
 
 #ifndef _SYS_INTERRUPT_H_
@@ -64,6 +64,7 @@ void register_randintr(int intr);
 void unregister_randintr(int intr);
 int next_registered_randintr(int intr);
 void sched_ithd(int intr);     /* procedure called from MD */
+void forward_fastint_remote(void *arg);                /* MD procedure (SMP) */
 
 extern char    eintrnames[];   /* end of intrnames[] */
 extern char    intrnames[];    /* string table containing device names */
index f390c63..62deba3 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/sys/machintr.h,v 1.2 2005/11/02 20:23:23 dillon Exp $
+ * $DragonFly: src/sys/sys/machintr.h,v 1.3 2005/11/03 04:54:02 dillon Exp $
+ */
+/*
+ * This module defines the ABI for the machine-independant cpu interrupt
+ * vector and masking layer.
  */
 
 #ifndef _SYS_QUEUE_H_