Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/alpha Use a wrapper to acquire the kernel lock for ...



details:   https://anonhg.NetBSD.org/src/rev/857e7c04ed2f
branches:  trunk
changeset: 939018:857e7c04ed2f
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Wed Sep 23 18:46:02 2020 +0000

description:
Use a wrapper to acquire the kernel lock for non-MPSAFE interrupts,
rather than doing it in alpha_shared_intr_establish() directly.

diffstat:

 sys/arch/alpha/common/shared_intr.c |  39 +++++++++++++++++++++++++-----------
 sys/arch/alpha/include/intr.h       |   5 ++-
 2 files changed, 30 insertions(+), 14 deletions(-)

diffs (97 lines):

diff -r 934ee895d3b4 -r 857e7c04ed2f sys/arch/alpha/common/shared_intr.c
--- a/sys/arch/alpha/common/shared_intr.c       Wed Sep 23 15:30:36 2020 +0000
+++ b/sys/arch/alpha/common/shared_intr.c       Wed Sep 23 18:46:02 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: shared_intr.c,v 1.23 2020/09/22 15:24:01 thorpej Exp $ */
+/* $NetBSD: shared_intr.c,v 1.24 2020/09/23 18:46:02 thorpej Exp $ */
 
 /*
  * Copyright (c) 1996 Carnegie-Mellon University.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: shared_intr.c,v 1.23 2020/09/22 15:24:01 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: shared_intr.c,v 1.24 2020/09/23 18:46:02 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -110,13 +110,7 @@
                 *      for sure.
                 */
 
-               if (!ih->ih_mpsafe) {
-                       KERNEL_LOCK(1, NULL);
-                       rv = (*ih->ih_fn)(ih->ih_arg);
-                       KERNEL_UNLOCK_ONE(NULL);
-               } else {
-                       rv = (*ih->ih_fn)(ih->ih_arg);
-               }
+               rv = (*ih->ih_fn)(ih->ih_arg);
 
                handled = handled || (rv != 0);
                ih = ih->ih_q.tqe_next;
@@ -125,6 +119,19 @@
        return (handled);
 }
 
+static int
+alpha_shared_intr_wrapper(void * const arg)
+{
+       struct alpha_shared_intrhand * const ih = arg;
+       int rv;
+
+       KERNEL_LOCK(1, NULL);
+       rv = (*ih->ih_real_fn)(ih->ih_real_arg);
+       KERNEL_UNLOCK_ONE(NULL);
+
+       return rv;
+}
+
 void *
 alpha_shared_intr_establish(struct alpha_shared_intr *intr, unsigned int num,
     int type, int level, int flags,
@@ -170,11 +177,19 @@
        }
 
        ih->ih_intrhead = intr;
-       ih->ih_fn = fn;
-       ih->ih_arg = arg;
+       ih->ih_fn = ih->ih_real_fn = fn;
+       ih->ih_arg = ih->ih_real_arg = arg;
        ih->ih_level = level;
        ih->ih_num = num;
-       ih->ih_mpsafe = (flags & ALPHA_INTR_MPSAFE) != 0;
+
+       /*
+        * Non-MPSAFE interrupts get a wrapper that takes the
+        * KERNEL_LOCK.
+        */
+       if ((flags & ALPHA_INTR_MPSAFE) == 0) {
+               ih->ih_fn = alpha_shared_intr_wrapper;
+               ih->ih_arg = ih;
+       }
 
        intr[num].intr_sharetype = type;
        TAILQ_INSERT_TAIL(&intr[num].intr_q, ih, ih_q);
diff -r 934ee895d3b4 -r 857e7c04ed2f sys/arch/alpha/include/intr.h
--- a/sys/arch/alpha/include/intr.h     Wed Sep 23 15:30:36 2020 +0000
+++ b/sys/arch/alpha/include/intr.h     Wed Sep 23 18:46:02 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.79 2020/09/22 15:24:01 thorpej Exp $ */
+/* $NetBSD: intr.h,v 1.80 2020/09/23 18:47:21 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2000, 2001, 2002 The NetBSD Foundation, Inc.
@@ -203,9 +203,10 @@
        struct alpha_shared_intr *ih_intrhead;
        int     (*ih_fn)(void *);
        void    *ih_arg;
+       int     (*ih_real_fn)(void *);
+       void    *ih_real_arg;
        int     ih_level;
        unsigned int ih_num;
-       int     ih_mpsafe;
 };
 
 struct alpha_shared_intr {



Home | Main Index | Thread Index | Old Index