Add a intrmask_t pointer to register_int() and register_swi(), and make
authorMatthew Dillon <dillon@dragonflybsd.org>
Tue, 1 Feb 2005 22:41:31 +0000 (22:41 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Tue, 1 Feb 2005 22:41:31 +0000 (22:41 +0000)
the interrupt thread loop set the spl for the duration of the call to the
handler.

Allow interrupt threads to be run with or without a critical section based
on the kern.int_use_crit_section sysctl.  The default is to conservatively
run with a critical section for now.

Turning this off will cause cpu usage in interrupts to be properly accounted
for by top, systat, and ps.

15 files changed:
sys/bus/cam/cam_xpt.c
sys/dev/serial/cy/cy.c
sys/dev/serial/rc/rc.c
sys/dev/serial/sio/sio.c
sys/i386/i386/vm_machdep.c
sys/i386/isa/intr_machdep.c
sys/i386/isa/intr_machdep.h
sys/kern/kern_intr.c
sys/kern/subr_taskqueue.c
sys/opencrypto/crypto.c
sys/platform/pc32/i386/vm_machdep.c
sys/platform/pc32/isa/intr_machdep.c
sys/platform/pc32/isa/intr_machdep.h
sys/sys/interrupt.h
sys/sys/systm.h

index 674d50e..1dab104 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/cam/cam_xpt.c,v 1.80.2.18 2002/12/09 17:31:55 gibbs Exp $
- * $DragonFly: src/sys/bus/cam/cam_xpt.c,v 1.19 2004/11/14 16:48:36 eirikn Exp $
+ * $DragonFly: src/sys/bus/cam/cam_xpt.c,v 1.20 2005/02/01 22:41:19 dillon Exp $
  */
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1372,8 +1372,8 @@ xpt_init(dummy)
        }
 
        /* Install our software interrupt handlers */
-       register_swi(SWI_CAMNET, swi_camnet, NULL, "swi_camnet");
-       register_swi(SWI_CAMBIO, swi_cambio, NULL, "swi_cambio");
+       register_swi(SWI_CAMNET, swi_camnet, NULL, "swi_camnet", NULL);
+       register_swi(SWI_CAMBIO, swi_cambio, NULL, "swi_cambio", NULL);
 }
 
 static cam_status
index eaecbb0..4889afe 100644 (file)
@@ -28,7 +28,7 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/isa/cy.c,v 1.97.2.2 2001/08/22 13:04:58 bde Exp $
- * $DragonFly: src/sys/dev/serial/cy/cy.c,v 1.14 2004/09/19 01:24:28 dillon Exp $
+ * $DragonFly: src/sys/dev/serial/cy/cy.c,v 1.15 2005/02/01 22:41:20 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -620,7 +620,7 @@ cyattach_common(cy_iobase, cy_align)
 
        if (!sio_registered) {
                callout_init(&sio_timeout_handle);
-               register_swi(SWI_TTY, siopoll, NULL, "cy");
+               register_swi(SWI_TTY, siopoll, NULL, "cy", NULL);
                sio_registered = TRUE;
        }
        minorbase = UNIT_TO_MINOR(unit);
index 6bb2c74..53e9bc2 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/isa/rc.c,v 1.53.2.1 2001/02/26 04:23:10 jlemon Exp $
- * $DragonFly: src/sys/dev/serial/rc/rc.c,v 1.12 2004/09/19 01:55:06 dillon Exp $
+ * $DragonFly: src/sys/dev/serial/rc/rc.c,v 1.13 2005/02/01 22:41:22 dillon Exp $
  *
  */
 
@@ -270,7 +270,7 @@ rcattach(dvp)
        rcb->rcb_probed = RC_ATTACHED;
        if (!rc_started) {
                cdevsw_add(&rc_cdevsw, -1, rcb->rcb_unit);
-               register_swi(SWI_TTY, rcpoll, NULL, "rcpoll");
+               register_swi(SWI_TTY, rcpoll, NULL, "rcpoll", NULL);
                callout_init(&rc_wakeup_ch);
                rc_wakeup(NULL);
                rc_started = 1;
index 8de3675..4ff457b 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/isa/sio.c,v 1.291.2.35 2003/05/18 08:51:15 murray Exp $
- * $DragonFly: src/sys/dev/serial/sio/sio.c,v 1.21 2004/11/12 20:51:29 dillon Exp $
+ * $DragonFly: src/sys/dev/serial/sio/sio.c,v 1.22 2005/02/01 22:41:23 dillon Exp $
  *     from: @(#)com.c 7.5 (Berkeley) 5/16/91
  *     from: i386/isa sio.c,v 1.234
  */
@@ -1201,7 +1201,7 @@ determined_type: ;
        printf("\n");
 
        if (!sio_registered) {
-               register_swi(SWI_TTY, siopoll, NULL ,"swi_siopoll");
+               register_swi(SWI_TTY, siopoll, NULL ,"swi_siopoll", NULL);
                sio_registered = TRUE;
        }
        minorbase = UNIT_TO_MINOR(unit);
index 9b8a464..dd40389 100644 (file)
@@ -39,7 +39,7 @@
  *     from: @(#)vm_machdep.c  7.3 (Berkeley) 5/13/91
  *     Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
  * $FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.132.2.9 2003/01/25 19:02:23 dillon Exp $
- * $DragonFly: src/sys/i386/i386/Attic/vm_machdep.c,v 1.31 2004/10/12 19:29:26 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/vm_machdep.c,v 1.32 2005/02/01 22:41:24 dillon Exp $
  */
 
 #include "use_npx.h"
@@ -593,7 +593,7 @@ swi_vm(void *arg)
 static void
 swi_vm_setup(void *arg)
 {
-       register_swi(SWI_VM, swi_vm, NULL, "swi_vm");
+       register_swi(SWI_VM, swi_vm, NULL, "swi_vm", NULL);
 }
 
 SYSINIT(vm_setup, SI_SUB_CPU, SI_ORDER_ANY, swi_vm_setup, NULL);
index bb14b71..4748aa1 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)isa.c 7.2 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/isa/intr_machdep.c,v 1.29.2.5 2001/10/14 06:54:27 luigi Exp $
- * $DragonFly: src/sys/i386/isa/Attic/intr_machdep.c,v 1.23 2004/07/24 20:21:34 dillon Exp $
+ * $DragonFly: src/sys/i386/isa/Attic/intr_machdep.c,v 1.24 2005/02/01 22:41:25 dillon Exp $
  */
 /*
  * This file contains an aggregated module marked:
@@ -815,7 +815,7 @@ add_intrdesc(intrec *idesc)
 
                intr_info[irq].mihandler_installed = 1;
                intr_info[irq].irq = irq;
-               td = register_int(irq, intr_mux, &intreclist_head[irq], idesc->name);
+               td = register_int(irq, intr_mux, &intreclist_head[irq], idesc->name, idesc->maskptr);
                td->td_info.intdata = &intr_info[irq];
                td->td_preemptable = cpu_intr_preempt;
                printf("installed MI handler for int %d\n", irq);
index 65481a8..750355b 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.11 2004/02/21 06:37:08 dillon Exp $
+ * $DragonFly: src/sys/i386/isa/Attic/intr_machdep.h,v 1.12 2005/02/01 22:41:25 dillon Exp $
  */
 
 #ifndef _I386_ISA_INTR_MACHDEP_H_
@@ -215,8 +215,6 @@ int icu_unset (int intr, inthand2_t *handler);
 void   icu_reinit (void);
 int    update_intr_masks (void);
 
-intrmask_t splq (intrmask_t mask);
-
 /*
  * WARNING: These are internal functions and not to be used by device drivers!
  * They are subject to change without notice. 
index 23944f4..fa5857c 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.18 2004/06/28 05:02:56 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_intr.c,v 1.19 2005/02/01 22:41:26 dillon Exp $
  *
  */
 
@@ -45,6 +45,7 @@
 typedef struct intrec {
     struct intrec *next;
     inthand2_t *handler;
+    intrmask_t *maskptr;       /* LEGACY */
     void       *argument;
     const char *name;
     int                intr;
@@ -61,6 +62,7 @@ static u_int ill_delta[NHWI+NSWI];    /* track elapsed to calculate freq */
 static int ill_state[NHWI+NSWI];       /* current state */
 static struct systimer ill_timer[NHWI+NSWI];   /* enforced freq. timer */
 static struct systimer ill_rtimer[NHWI+NSWI];  /* recovery timer */
+static intrmask_t dummy_intr_mask;
 
 #define LIVELOCK_NONE          0
 #define LIVELOCK_LIMITED       1
@@ -72,18 +74,38 @@ SYSCTL_INT(_kern, OID_AUTO, livelock_limit,
 SYSCTL_INT(_kern, OID_AUTO, livelock_fallback,
         CTLFLAG_RW, &livelock_fallback, 0, "Livelock interrupt fallback rate");
 
+/*
+ * TEMPORARY sysctl to allow interrupt handlers to run without the critical
+ * section (if set to 0).
+ *
+ * SEQUENCE OF EVENTS: default to prior operation, testing, change default
+ * to 0, lots more testing, then make operation without a critical section
+ * mandatory and remove the sysctl code and variable.
+ */
+static int int_use_crit_section = 1;
+SYSCTL_INT(_kern, OID_AUTO, int_use_crit_section,
+        CTLFLAG_RW, &int_use_crit_section, 0, "Run interrupts entirely within a critical section");
+
 static void ithread_handler(void *arg);
 
+/*
+ * Register an SWI or INTerrupt handler.
+ *
+ * Note that maskptr exists to support legacy spl handling and is not intended
+ * to be permanent (because spls are not compatible with BGL removal).
+ */
 thread_t
-register_swi(int intr, inthand2_t *handler, void *arg, const char *name)
+register_swi(int intr, inthand2_t *handler, void *arg, const char *name,
+       intrmask_t *maskptr)
 {
     if (intr < NHWI || intr >= NHWI + NSWI)
        panic("register_swi: bad intr %d", intr);
-    return(register_int(intr, handler, arg, name));
+    return(register_int(intr, handler, arg, name, maskptr));
 }
 
 thread_t
-register_int(int intr, inthand2_t *handler, void *arg, const char *name)
+register_int(int intr, inthand2_t *handler, void *arg, const char *name,
+       intrmask_t *maskptr)
 {
     intrec_t **list;
     intrec_t *rec;
@@ -91,11 +113,14 @@ register_int(int intr, inthand2_t *handler, void *arg, const char *name)
 
     if (intr < 0 || intr >= NHWI + NSWI)
        panic("register_int: bad intr %d", intr);
+    if (maskptr == NULL)
+       maskptr = &dummy_intr_mask;
 
     rec = malloc(sizeof(intrec_t), M_DEVBUF, M_NOWAIT);
     if (rec == NULL)
        panic("register_swi: malloc failed");
     rec->handler = handler;
+    rec->maskptr = maskptr;
     rec->argument = arg;
     rec->name = name;
     rec->intr = intr;
@@ -105,9 +130,7 @@ register_int(int intr, inthand2_t *handler, void *arg, const char *name)
 
     /*
      * Create an interrupt thread if necessary, leave it in an unscheduled
-     * state.  The kthread restore function exits a critical section before
-     * starting the function so we need *TWO* critical sections in order
-     * for the handler to begin running in one.
+     * state.
      */
     if ((td = ithreads[intr]) == NULL) {
        lwkt_create((void *)ithread_handler, (void *)intr, &ithreads[intr],
@@ -115,9 +138,9 @@ register_int(int intr, inthand2_t *handler, void *arg, const char *name)
            "ithread %d", intr);
        td = ithreads[intr];
        if (intr >= NHWI && intr < NHWI + NSWI)
-           lwkt_setpri(td, TDPRI_SOFT_NORM + TDPRI_CRIT * 2);
+           lwkt_setpri(td, TDPRI_SOFT_NORM);
        else
-           lwkt_setpri(td, TDPRI_INT_MED + TDPRI_CRIT * 2);
+           lwkt_setpri(td, TDPRI_INT_MED);
     }
 
     /*
@@ -246,15 +269,21 @@ ithread_livelock_wakeup(systimer_t info)
 
 
 /*
- * Interrupt threads run this as their main loop.  The handler should be
- * in a critical section on entry and the BGL is usually left held (for now).
+ * Interrupt threads run this as their main loop.
+ *
+ * The handler begins execution outside a critical section and with the BGL
+ * held.
  *
  * The irunning state starts at 0.  When an interrupt occurs, the hardware
  * interrupt is disabled and sched_ithd() The HW interrupt remains disabled
  * until all routines have run.  We then call ithread_done() to reenable 
- * the HW interrupt and deschedule us until the next interrupt.
+ * the HW interrupt and deschedule us until the next interrupt. 
+ *
+ * We are responsible for atomically checking irunning[] and ithread_done()
+ * is responsible for atomically checking for platform-specific delayed
+ * interrupts.  irunning[] for our irq is only set in the context of our cpu,
+ * so a critical section is a sufficient interlock.
  */
-
 #define LIVELOCK_TIMEFRAME(freq)       ((freq) >> 2)   /* 1/4 second */
 
 static void
@@ -268,19 +297,39 @@ ithread_handler(void *arg)
     intrec_t *rec;
     intrec_t *nrec;
     struct random_softc *sc = &irandom_ary[intr];
+    globaldata_t gd = mycpu;
+    int in_crit_section;       /* REMOVE WHEN TESTING COMPLETE */
+    intrmask_t s;
+
+    /*
+     * The loop must be entered with one critical section held.
+     */
+    crit_enter_gd(gd);
 
-    KKASSERT(curthread->td_pri >= TDPRI_CRIT);
     for (;;) {
+       /*
+        * Deal with the sysctl variable allowing the interrupt thread to run
+        * without a critical section.  Once this is proven out it will
+        * become the default.  Note that a critical section is always
+        * held as of the top of the loop.
+        */
+       in_crit_section = int_use_crit_section;
+       if (in_crit_section == 0)
+           crit_exit_gd(gd);
+
        /*
         * We can get woken up by the livelock periodic code too, run the 
-        * handlers only if there is a real interrupt pending.  Clear
-        * irunning[] prior to running the handlers to interlock new
-        * events.
+        * handlers only if there is a real interrupt pending.  XXX
+        *
+        * Clear irunning[] prior to running the handlers to interlock
+        * again new events occuring during processing of existing events.
         */
        irunning[intr] = 0;
        for (rec = *list; rec; rec = nrec) {
            nrec = rec->next;
+           s = splq(*rec->maskptr);
            rec->handler(rec->argument);
+           splx(s);
        }
 
        /*
@@ -292,8 +341,11 @@ ithread_handler(void *arg)
 
        /*
         * This is our livelock test.  If we hit the rate limit we
-        * limit ourselves to 10000 interrupts/sec until the rate
+        * limit ourselves to X interrupts/sec until the rate
         * falls below 50% of that value, then we unlimit again.
+        *
+        * XXX calling cputimer_count() is expensive but a livelock may
+        * prevent other interrupts from occuring so we cannot use ticks.
         */
        cputicks = cputimer_count();
        ++ill_count[intr];
@@ -352,11 +404,21 @@ ithread_handler(void *arg)
        }
 
        /*
-        * If another interrupt has not been queued we can reenable the
-        * hardware interrupt and go to sleep.
+        * There are two races here.  irunning[] is set by sched_ithd()
+        * in the context of our cpu and is critical-section safe.  We
+        * are responsible for checking it.  ipending is not critical
+        * section safe and must be handled by the platform specific
+        * ithread_done() routine.
         */
-       if (irunning[intr] == 0)
-           ithread_done(intr);
+       if (in_crit_section) {
+           if (irunning[intr] == 0)
+               ithread_done(intr);
+       } else {
+           crit_enter_gd(gd);
+           if (irunning[intr] == 0)
+               ithread_done(intr);
+       }
+       /* must be in critical section on loop */
     }
 }
 
index 2355797..0e84361 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *      $FreeBSD: src/sys/kern/subr_taskqueue.c,v 1.1.2.3 2003/09/10 00:40:39 ken Exp $
- *     $DragonFly: src/sys/kern/subr_taskqueue.c,v 1.4 2003/12/29 06:42:06 dillon Exp $
+ *     $DragonFly: src/sys/kern/subr_taskqueue.c,v 1.5 2005/02/01 22:41:26 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -224,7 +224,7 @@ taskqueue_thread_enqueue(void *context)
 }
 
 TASKQUEUE_DEFINE(swi, taskqueue_swi_enqueue, 0,
-                register_swi(SWI_TQ, taskqueue_swi_run, NULL, "swi_taskq"));
+                register_swi(SWI_TQ, taskqueue_swi_run, NULL, "swi_taskq", NULL));
 TASKQUEUE_DEFINE(thread, taskqueue_thread_enqueue, 0,
                 kthread_create(taskqueue_kthread, NULL,
                 &taskqueue_thread_td, "taskqueue"));
index 83b69b2..8af9f19 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/opencrypto/crypto.c,v 1.4.2.7 2003/06/03 00:09:02 sam Exp $   */
-/*     $DragonFly: src/sys/opencrypto/crypto.c,v 1.6 2003/07/19 21:14:47 dillon Exp $  */
+/*     $DragonFly: src/sys/opencrypto/crypto.c,v 1.7 2005/02/01 22:41:27 dillon Exp $  */
 /*     $OpenBSD: crypto.c,v 1.38 2002/06/11 11:14:29 beck Exp $        */
 /*
  * The author of this code is Angelos D. Keromytis (angelos@cis.upenn.edu)
@@ -156,7 +156,7 @@ crypto_init(void)
        TAILQ_INIT(&crp_ret_q);
        TAILQ_INIT(&crp_ret_kq);
 
-       register_swi(SWI_CRYPTO, cryptointr, NULL, "swi_crypto");
+       register_swi(SWI_CRYPTO, cryptointr, NULL, "swi_crypto", NULL);
        error = kthread_create((void (*)(void *)) cryptoret, NULL,
                    &cryptothread, "cryptoret");
        if (error) {
index 971964f..fd5ddfa 100644 (file)
@@ -39,7 +39,7 @@
  *     from: @(#)vm_machdep.c  7.3 (Berkeley) 5/13/91
  *     Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
  * $FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.132.2.9 2003/01/25 19:02:23 dillon Exp $
- * $DragonFly: src/sys/platform/pc32/i386/vm_machdep.c,v 1.31 2004/10/12 19:29:26 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/vm_machdep.c,v 1.32 2005/02/01 22:41:24 dillon Exp $
  */
 
 #include "use_npx.h"
@@ -593,7 +593,7 @@ swi_vm(void *arg)
 static void
 swi_vm_setup(void *arg)
 {
-       register_swi(SWI_VM, swi_vm, NULL, "swi_vm");
+       register_swi(SWI_VM, swi_vm, NULL, "swi_vm", NULL);
 }
 
 SYSINIT(vm_setup, SI_SUB_CPU, SI_ORDER_ANY, swi_vm_setup, NULL);
index 218a735..7ae69fb 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)isa.c 7.2 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/isa/intr_machdep.c,v 1.29.2.5 2001/10/14 06:54:27 luigi Exp $
- * $DragonFly: src/sys/platform/pc32/isa/intr_machdep.c,v 1.23 2004/07/24 20:21:34 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/isa/intr_machdep.c,v 1.24 2005/02/01 22:41:25 dillon Exp $
  */
 /*
  * This file contains an aggregated module marked:
@@ -815,7 +815,7 @@ add_intrdesc(intrec *idesc)
 
                intr_info[irq].mihandler_installed = 1;
                intr_info[irq].irq = irq;
-               td = register_int(irq, intr_mux, &intreclist_head[irq], idesc->name);
+               td = register_int(irq, intr_mux, &intreclist_head[irq], idesc->name, idesc->maskptr);
                td->td_info.intdata = &intr_info[irq];
                td->td_preemptable = cpu_intr_preempt;
                printf("installed MI handler for int %d\n", irq);
index 97d6a93..3292423 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.11 2004/02/21 06:37:08 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/isa/intr_machdep.h,v 1.12 2005/02/01 22:41:25 dillon Exp $
  */
 
 #ifndef _I386_ISA_INTR_MACHDEP_H_
@@ -215,8 +215,6 @@ int icu_unset (int intr, inthand2_t *handler);
 void   icu_reinit (void);
 int    update_intr_masks (void);
 
-intrmask_t splq (intrmask_t mask);
-
 /*
  * WARNING: These are internal functions and not to be used by device drivers!
  * They are subject to change without notice. 
index 40f4643..8f72e43 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.8 2004/02/25 17:38:51 joerg Exp $
+ * $DragonFly: src/sys/sys/interrupt.h,v 1.9 2005/02/01 22:41:31 dillon Exp $
  */
 
 #ifndef _SYS_INTERRUPT_H_
@@ -39,9 +39,9 @@ typedef void ointhand2_t (int);
 
 struct thread;
 struct thread *register_swi(int intr, inthand2_t *handler, void *arg,
-                           const char *name);
+                           const char *name, intrmask_t *maskptr);
 struct thread *register_int(int intr, inthand2_t *handler, void *arg,
-                           const char *name);
+                           const char *name, intrmask_t *maskptr);
 void register_randintr(int intr);
 
 void swi_setpriority(int intr, int pri);
index 00a60b8..d4e2fba 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)systm.h     8.7 (Berkeley) 3/29/95
  * $FreeBSD: src/sys/sys/systm.h,v 1.111.2.18 2002/12/17 18:04:02 sam Exp $
- * $DragonFly: src/sys/sys/systm.h,v 1.26 2005/01/14 02:20:24 dillon Exp $
+ * $DragonFly: src/sys/sys/systm.h,v 1.27 2005/02/01 22:41:31 dillon Exp $
  */
 
 #ifndef _SYS_SYSTM_H_
@@ -286,7 +286,8 @@ intrmask_t  splsofttq (void);
 intrmask_t     splstatclock (void);
 intrmask_t     spltty (void);
 intrmask_t     splvm (void);
-void           splx (intrmask_t ipl);
+void           splx (intrmask_t);
+intrmask_t     splq (intrmask_t);
 void           splz (void);
 #endif /* __i386__ */