Move the logic deciding whether to grab the kernel lock or not, deeper in the
authormiod <miod@openbsd.org>
Mon, 18 May 2015 04:06:37 +0000 (04:06 +0000)
committermiod <miod@openbsd.org>
Mon, 18 May 2015 04:06:37 +0000 (04:06 +0000)
interrupt logic, making sure the lock is not taken for clock interrupts.
Tested on aviion and luna88k.

sys/arch/aviion/aviion/av400_machdep.c
sys/arch/aviion/aviion/av530_machdep.c
sys/arch/luna88k/luna88k/isr.c
sys/arch/luna88k/luna88k/machdep.c

index 10a8702..661a9fd 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: av400_machdep.c,v 1.27 2014/11/16 12:30:56 deraadt Exp $      */
+/*     $OpenBSD: av400_machdep.c,v 1.28 2015/05/18 04:06:37 miod Exp $ */
 /*
  * Copyright (c) 2006, 2007, Miodrag Vallat.
  *
@@ -646,11 +646,6 @@ av400_intr(struct trapframe *eframe)
        }
 #endif
 
-#ifdef MULTIPROCESSOR
-       if (old_spl < IPL_SCHED)
-               __mp_lock(&kernel_lock);
-#endif
-
        /*
         * We want to service all interrupts marked in the IST register
         * They are all valid because the mask would have prevented them
@@ -724,10 +719,18 @@ av400_intr(struct trapframe *eframe)
                         */
                        ret = 0;
                        SLIST_FOREACH(intr, list, ih_link) {
+#ifdef MULTIPROCESSOR
+                               if (intr->ih_ipl < IPL_CLOCK)
+                                       __mp_lock(&kernel_lock);
+#endif
                                if (ISSET(intr->ih_flags, INTR_WANTFRAME))
                                        ret = (*intr->ih_fn)((void *)eframe);
                                else
                                        ret = (*intr->ih_fn)(intr->ih_arg);
+#ifdef MULTIPROCESSOR
+                               if (intr->ih_ipl < IPL_CLOCK)
+                                       __mp_unlock(&kernel_lock);
+#endif
                                if (ret != 0) {
                                        intr->ih_count.ec_count++;
                                        break;
@@ -764,11 +767,6 @@ av400_intr(struct trapframe *eframe)
                problems = 0;
 #endif
 
-#ifdef MULTIPROCESSOR
-       if (old_spl < IPL_SCHED)
-               __mp_unlock(&kernel_lock);
-#endif
-
 out:
        /*
         * process any remaining data access exceptions before
index a8e7b78..10a4146 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: av530_machdep.c,v 1.15 2015/04/25 21:15:08 miod Exp $ */
+/*     $OpenBSD: av530_machdep.c,v 1.16 2015/05/18 04:06:37 miod Exp $ */
 /*
  * Copyright (c) 2006, 2007, 2010 Miodrag Vallat.
  *
@@ -570,9 +570,6 @@ av530_intr(struct trapframe *eframe)
 #ifdef DIAGNOSTIC
        static int problems = 0;
 #endif
-#ifdef MULTIPROCESSOR
-       int need_lock;
-#endif
 
        cur_mask = ISR_GET_CURRENT_MASK(cpu);
        cur_exmask = EXISR_GET_CURRENT_MASK(cpu);
@@ -705,9 +702,7 @@ av530_intr(struct trapframe *eframe)
                        ret = 0;
                        SLIST_FOREACH(intr, list, ih_link) {
 #ifdef MULTIPROCESSOR
-                               need_lock = intr->ih_ipl < IPL_SCHED &&
-                                   intr->ih_ipl != IPL_CLOCK;
-                               if (need_lock)
+                               if (intr->ih_ipl < IPL_CLOCK)
                                        __mp_lock(&kernel_lock);
 #endif
                                if (ISSET(intr->ih_flags, INTR_WANTFRAME))
@@ -715,7 +710,7 @@ av530_intr(struct trapframe *eframe)
                                else
                                        ret = (*intr->ih_fn)(intr->ih_arg);
 #ifdef MULTIPROCESSOR
-                               if (need_lock)
+                               if (intr->ih_ipl < IPL_CLOCK)
                                        __mp_unlock(&kernel_lock);
 #endif
                                if (ret != 0) {
index 3e9fbaf..0a53ed3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: isr.c,v 1.9 2010/12/21 14:56:24 claudio Exp $ */
+/*     $OpenBSD: isr.c,v 1.10 2015/05/18 04:06:37 miod Exp $   */
 /*     $NetBSD: isr.c,v 1.5 2000/07/09 08:08:20 nisimura Exp $ */
 
 /*-
@@ -165,7 +165,15 @@ isrdispatch_autovec(int ipl)
 
        /* Give all the handlers a chance. */
        LIST_FOREACH(isr, list, isr_link) {
+#ifdef MULTIPROCESSOR
+               if (isr->isr_ipl < IPL_CLOCK)
+                       __mp_lock(&kernel_lock);
+#endif
                rc = (*isr->isr_func)(isr->isr_arg);
+#ifdef MULTIPROCESSOR
+               if (isr->isr_ipl < IPL_CLOCK)
+                       __mp_unlock(&kernel_lock);
+#endif
                if (rc != 0)
                        isr->isr_count.ec_count++;
                handled |= rc;
index ba74a8e..edf6f9c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: machdep.c,v 1.116 2015/02/25 17:41:22 miod Exp $      */
+/*     $OpenBSD: machdep.c,v 1.117 2015/05/18 04:06:37 miod Exp $      */
 /*
  * Copyright (c) 1998, 1999, 2000, 2001 Steve Murphree, Jr.
  * Copyright (c) 1996 Nivas Madhur
@@ -868,17 +868,8 @@ luna88k_ext_int(struct trapframe *eframe)
                case 5:
                case 4:
                case 3:
-#ifdef MULTIPROCESSOR
-                       if (CPU_IS_PRIMARY(ci)) {
-                               if (old_spl < IPL_SCHED)
-                                       __mp_lock(&kernel_lock);
-#endif
+                       if (CPU_IS_PRIMARY(ci))
                                isrdispatch_autovec(cur_int_level);
-#ifdef MULTIPROCESSOR
-                               if (old_spl < IPL_SCHED)
-                                       __mp_unlock(&kernel_lock);
-                       }
-#endif
                        break;
                default:
                        printf("%s: cpu%d level %d interrupt.\n",