Remove spl*() calls from the atm code, replacing them with critical sections.
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 2 Jun 2005 21:36:09 +0000 (21:36 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 2 Jun 2005 21:36:09 +0000 (21:36 +0000)
sys/dev/atm/en/midway.c
sys/dev/atm/hea/eni_receive.c
sys/dev/atm/hea/eni_transmit.c
sys/dev/atm/hfa/fore_load.c
sys/dev/atm/hfa/fore_output.c
sys/dev/atm/hfa/fore_stats.c
sys/netproto/atm/kern_include.h

index a2949c0..c39f055 100644 (file)
@@ -33,7 +33,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/en/midway.c,v 1.19.2.1 2003/01/23 21:06:42 sam Exp $
- * $DragonFly: src/sys/dev/atm/en/midway.c,v 1.17 2005/05/31 14:11:42 joerg Exp $
+ * $DragonFly: src/sys/dev/atm/en/midway.c,v 1.18 2005/06/02 21:36:07 dillon Exp $
  */
 
 /*
 #include <sys/mbuf.h>
 #include <sys/socket.h>
 #include <sys/proc.h>
+#include <sys/thread2.h>
 
 #include <net/if.h>
 #include <net/if_atm.h>
@@ -1108,9 +1109,9 @@ struct ucred *cr;
     struct atm_rawioctl *ario = (struct atm_rawioctl *)data;
     int slot;
 #endif
-    int s, error = 0;
+    int error = 0;
 
-    s = splnet();
+    crit_enter();
 
     switch (cmd) {
        case SIOCATMENA:                /* enable circuit for recv */
@@ -1192,7 +1193,7 @@ struct ucred *cr;
            error = EINVAL;
            break;
     }
-    splx(s);
+    crit_exit();
     return error;
 }
 
@@ -1208,7 +1209,7 @@ struct atm_pseudoioctl *pi;
 int on;
 
 {
-  u_int s, vci, flags, slot;
+  u_int vci, flags, slot;
   u_int32_t oldmode, newmode;
 
   vci = ATM_PH_VCI(&pi->aph);
@@ -1261,7 +1262,7 @@ int on;
   slot = sc->rxvc2slot[vci];
   if ((sc->rxslot[slot].oth_flags & (ENOTHER_FREE|ENOTHER_DRAIN)) != 0)
     return(EINVAL);
-  s = splimp();                /* block out enintr() */
+  crit_enter();                /* block out enintr() */
   oldmode = EN_READ(sc, MID_VC(vci));
   newmode = MIDV_SETMODE(oldmode, MIDV_TRASH) & ~MIDV_INSERVICE;
   EN_WRITE(sc, MID_VC(vci), (newmode | (oldmode & MIDV_INSERVICE)));
@@ -1284,7 +1285,7 @@ int on;
     sc->rxslot[slot].atm_vci = RX_NONE;
     sc->rxvc2slot[vci] = RX_NONE;
   }
-  splx(s);             /* enable enintr() */
+  crit_exit();         /* enable enintr() */
 #ifdef EN_DEBUG
   printf("%s: rx%d: VCI %d is now %s\n", sc->sc_dev.dv_xname, slot, vci,
        (sc->rxslot[slot].oth_flags & ENOTHER_DRAIN) ? "draining" : "free");
@@ -1503,7 +1504,7 @@ int vc;
 
 /*
  * en_start: start transmitting the next packet that needs to go out
- * if there is one.    note that atm_output() has already splimp()'d us.
+ * if there is one.    note that atm_output() has already locked us.
  */
 
 STATIC void en_start(ifp)
index e69515d..b248873 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/dev/hea/eni_receive.c,v 1.5 1999/08/28 00:41:45 peter Exp $
- *     @(#) $DragonFly: src/sys/dev/atm/hea/eni_receive.c,v 1.8 2005/02/01 00:51:49 joerg Exp $
+ *     @(#) $DragonFly: src/sys/dev/atm/hea/eni_receive.c,v 1.9 2005/06/02 21:36:08 dillon Exp $
  */
 
 /*
@@ -657,9 +657,8 @@ eni_recv_drain ( eup )
        u_long          DMA_Rdptr;
        u_long          dma_wrp;
        u_long          start, stop;
-       int             s;
 
-       s = splimp();
+       crit_enter();
        /* Pop first buffer */
        IF_DEQUEUE ( &eup->eu_rxqueue, m );
        while ( m ) {
@@ -799,9 +798,7 @@ next_buffer:
                IF_DEQUEUE ( &eup->eu_rxqueue, m );
        }
 finish:
-       (void) splx(s);
-
-       return;
+       crit_exit();
 }
 
 /*
index a64c424..1184539 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/dev/hea/eni_transmit.c,v 1.6 1999/12/21 08:24:35 eivind Exp $
- *     @(#) $DragonFly: src/sys/dev/atm/hea/eni_transmit.c,v 1.6 2005/02/01 00:51:49 joerg Exp $
+ *     @(#) $DragonFly: src/sys/dev/atm/hea/eni_transmit.c,v 1.7 2005/06/02 21:36:08 dillon Exp $
  */
 
 /*
@@ -242,7 +242,8 @@ eni_xmit_drain ( eup )
        u_long          pdulen;
        u_long          start, stop;
        u_long          dmap;
-       int             s = splimp();
+
+       crit_enter();
 
        /*
         * Pull the top element (PDU) off
@@ -298,7 +299,7 @@ eni_xmit_drain ( eup )
                         * If this one isn't done, none of the others
                         * are either.
                         */
-                       (void) splx(s);
+                       crit_exit();
                        return;
                    }
                } else {
@@ -312,7 +313,7 @@ eni_xmit_drain ( eup )
                         * If this one isn't done, none of the others
                         * are either.
                         */
-                       (void) splx(s);
+                       crit_exit();
                        return;
                    }
                }
@@ -367,8 +368,7 @@ eni_xmit_drain ( eup )
        /*
         * We've drained the queue...
         */
-       (void) splx(s);
-       return;
+       crit_exit();
 }
 
 /*
@@ -397,7 +397,6 @@ eni_output ( cup, cvp, m )
 {
        Eni_unit        *eup = (Eni_unit *)cup;
        Eni_vcc         *evp = (Eni_vcc *)cvp;
-       int             s, s2;
        int             pdulen = 0;
        u_long          size;
        u_long          buf_avail;
@@ -605,7 +604,7 @@ retry:
                return;
        }
 
-       s = splnet();
+       crit_enter();
 
        /*
         * Calculate size of buffer necessary to store PDU. If this
@@ -659,7 +658,7 @@ retry:
 #endif
                eup->eu_pif.pif_oerrors++;
                KB_FREEALL ( m );
-               (void) splx(s);
+               crit_exit();
                return;
        }
 
@@ -694,7 +693,7 @@ retry:
 #endif
                eup->eu_pif.pif_oerrors++;
                KB_FREEALL( m );
-               (void) splx(s);
+               crit_exit();
                return;
        }
 
@@ -796,9 +795,7 @@ retry:
        /*
         * Place buffers onto transmit queue for draining
         */
-       s2 = splimp();
        IF_ENQUEUE ( &eup->eu_txqueue, m );
-       (void) splx(s2);
 
        /*
         * Update next word to be stored
@@ -810,8 +807,6 @@ retry:
         */
        eup->eu_midway[MIDWAY_TX_WR] = dma_wr;
        
-       (void) splx ( s );
-
-       return;
+       crit_exit();
 }
 
index 888e7f0..3331cac 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/dev/hfa/fore_load.c,v 1.13 1999/09/25 18:23:49 phk Exp $
- *     @(#) $DragonFly: src/sys/dev/atm/hfa/fore_load.c,v 1.10 2005/02/01 00:51:50 joerg Exp $
+ *     @(#) $DragonFly: src/sys/dev/atm/hfa/fore_load.c,v 1.11 2005/06/02 21:36:09 dillon Exp $
  */
 
 /*
@@ -450,11 +450,10 @@ static void
 fore_reset(fup)
        Fore_unit       *fup;
 {
-       int     s = splimp();
-
        /*
         * Reset the board and return it to cold_start state
         */
+       crit_enter();
        if (fup->fu_mon)
                fup->fu_mon->mon_bstat = CP_WRITE(BOOT_COLDSTART);
 
@@ -476,8 +475,7 @@ fore_reset(fup)
                        break;
                }
        }
-
-       (void) splx(s);
+       crit_exit();
        return;
 }
 
index 22107e4..46e10ae 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/dev/hfa/fore_output.c,v 1.5 2000/01/15 21:01:04 mks Exp $
- *     @(#) $DragonFly: src/sys/dev/atm/hfa/fore_output.c,v 1.4 2003/08/27 10:35:16 rob Exp $
+ *     @(#) $DragonFly: src/sys/dev/atm/hfa/fore_output.c,v 1.5 2005/06/02 21:36:09 dillon Exp $
  */
 
 /*
@@ -76,7 +76,6 @@ fore_output(cup, cvp, m)
        Xmit_queue      *cqp;
        Xmit_descr      *xdp;
        int             retry, nsegs, pdulen;
-       int             s;
 
 #ifdef DIAGNOSTIC
        if (atm_dev_print)
@@ -111,7 +110,7 @@ fore_output(cup, cvp, m)
         *
         * If queue is full we'll delay a bit before tossing the PDU
         */
-       s = splnet();
+       crit_enter();
        hxp = fup->fu_xmit_tail;
        if (!((*hxp->hxq_status) & QSTAT_FREE)) {
 
@@ -135,7 +134,7 @@ fore_output(cup, cvp, m)
                        if (vcp->vc_nif)
                                vcp->vc_nif->nif_if.if_oerrors++;
                        KB_FREEALL(m);
-                       (void) splx(s);
+                       crit_exit();
                        return;
                }
        }
@@ -155,7 +154,7 @@ fore_output(cup, cvp, m)
                vcp->vc_oerrors++;
                if (vcp->vc_nif)
                        vcp->vc_nif->nif_if.if_oerrors++;
-               (void) splx(s);
+               crit_exit();
                return;
        }
 
@@ -180,7 +179,7 @@ fore_output(cup, cvp, m)
        cqp->cq_descr = (CP_dma)
                CP_WRITE((u_long)hxp->hxq_descr_dma | XMIT_SEGS_TO_BLKS(nsegs));
 
-       (void) splx(s);
+       crit_exit();
 
        /*
         * See if there are any completed queue entries
@@ -188,8 +187,6 @@ fore_output(cup, cvp, m)
        DEVICE_LOCK((Cmn_unit *)fup);
        fore_xmit_drain(fup);
        DEVICE_UNLOCK((Cmn_unit *)fup);
-
-       return;
 }
 
 
index b316447..681cf3e 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/dev/hfa/fore_stats.c,v 1.4 1999/08/28 00:41:52 peter Exp $
- *     @(#) $DragonFly: src/sys/dev/atm/hfa/fore_stats.c,v 1.6 2005/02/01 00:51:50 joerg Exp $
+ *     @(#) $DragonFly: src/sys/dev/atm/hfa/fore_stats.c,v 1.7 2005/06/02 21:36:09 dillon Exp $
  */
 
 /*
@@ -45,7 +45,7 @@
  * We will then sleep pending command completion.  This must only be called
  * from the ioctl system call handler.
  *
- * Called at splnet.
+ * Called from a critical section.
  *
  * Arguments:
  *     fup     pointer to device unit structure
@@ -61,7 +61,7 @@ fore_get_stats(fup)
 {
        H_cmd_queue     *hcp;
        Cmd_queue       *cqp;
-       int             s, sst;
+       int             sst;
 
        ATM_DEBUG1("fore_get_stats: fup=%p\n", fup);
 
@@ -76,11 +76,11 @@ fore_get_stats(fup)
         * If someone has already initiated a stats request, we'll
         * just wait for that one to complete
         */
-       s = splimp();
+       crit_enter();
        if (fup->fu_flags & FUF_STATCMD) {
 
                sst = tsleep((caddr_t)&fup->fu_stats, PCATCH, "fore", 0);
-               (void) splx(s);
+               crit_exit();
                return (sst ? sst : fup->fu_stats_ret);
        }
 
@@ -88,7 +88,7 @@ fore_get_stats(fup)
         * Limit stats gathering to once a second or so
         */
        if (time_second == fup->fu_stats_time) {
-               (void) splx(s);
+               crit_exit();
                return (0);
        } else
                fup->fu_stats_time = time_second;
@@ -118,7 +118,7 @@ fore_get_stats(fup)
                        FORE_STATS_ALIGN, 0);
                if (dma == NULL) {
                        fup->fu_stats->st_drv.drv_cm_nodma++;
-                       (void) splx(s);
+                       crit_exit();
                        return (EIO);
                }
                fup->fu_statsd = dma;
@@ -132,7 +132,7 @@ fore_get_stats(fup)
                 * Now wait for command to finish
                 */
                sst = tsleep((caddr_t)&fup->fu_stats, PCATCH, "fore", 0);
-               (void) splx(s);
+               crit_exit();
                return (sst ? sst : fup->fu_stats_ret);
 
        } else {
@@ -140,7 +140,7 @@ fore_get_stats(fup)
                 * Command queue full
                 */
                fup->fu_stats->st_drv.drv_cm_full++;
-               (void) splx(s);
+               crit_exit();
                return (EIO);
        }
 }
index 2982f9d..5a55804 100644 (file)
@@ -24,7 +24,7 @@
  * notice must be reproduced on all copies.
  *
  *     @(#) $FreeBSD: src/sys/netatm/kern_include.h,v 1.3 1999/08/28 00:48:40 peter Exp $
- *     @(#) $DragonFly: src/sys/netproto/atm/kern_include.h,v 1.6 2005/02/01 00:51:50 joerg Exp $
+ *     @(#) $DragonFly: src/sys/netproto/atm/kern_include.h,v 1.7 2005/06/02 21:36:06 dillon Exp $
  *
  */
 
@@ -60,8 +60,9 @@
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/syslog.h>
-
 #include <sys/eventhandler.h>
+#include <sys/thread2.h>
+
 #include <machine/clock.h>
 #include <vm/vm.h>
 #include <vm/pmap.h>