Remove spl*() calls from netinet, replacing them with critical sections.
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 2 Jun 2005 23:52:42 +0000 (23:52 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 2 Jun 2005 23:52:42 +0000 (23:52 +0000)
A slight rearrangement of COMMON_START() in tcp_usrreq.c was necessary to
ensure that the inp is loaded after  entering the critical section.

15 files changed:
sys/netinet/if_ether.c
sys/netinet/igmp.c
sys/netinet/in.c
sys/netinet/in_pcb.c
sys/netinet/in_rmx.c
sys/netinet/ip_divert.c
sys/netinet/ip_encap.c
sys/netinet/ip_flow.c
sys/netinet/ip_input.c
sys/netinet/ip_output.c
sys/netinet/raw_ip.c
sys/netinet/tcp_subr.c
sys/netinet/tcp_timer.c
sys/netinet/tcp_usrreq.c
sys/netinet/udp_usrreq.c

index 9dbe661..5edd36b 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     @(#)if_ether.c  8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/netinet/if_ether.c,v 1.64.2.23 2003/04/11 07:23:15 fjoe Exp $
- * $DragonFly: src/sys/netinet/if_ether.c,v 1.26 2005/03/04 03:48:25 hsu Exp $
+ * $DragonFly: src/sys/netinet/if_ether.c,v 1.27 2005/06/02 23:52:42 dillon Exp $
  */
 
 /*
@@ -187,15 +187,15 @@ static struct callout     arptimer_ch;
 static void
 arptimer(void *ignored_arg)
 {
-       int s = splnet();
        struct llinfo_arp *la, *nla;
 
+       crit_enter();
        LIST_FOREACH_MUTABLE(la, &llinfo_arp, la_le, nla) {
                if (la->la_rt->rt_expire && la->la_rt->rt_expire <= time_second)
                        arptfree(la);   /* might remove la from llinfo_arp! */
        }
        callout_reset(&arptimer_ch, arpt_prune * hz, arptimer, NULL);
-       splx(s);
+       crit_exit();
 }
 
 /*
index 952055e..466b5af 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     @(#)igmp.c      8.1 (Berkeley) 7/19/93
  * $FreeBSD: src/sys/netinet/igmp.c,v 1.29.2.2 2003/01/23 21:06:44 sam Exp $
- * $DragonFly: src/sys/netinet/igmp.c,v 1.10 2004/12/21 02:54:15 hsu Exp $
+ * $DragonFly: src/sys/netinet/igmp.c,v 1.11 2005/06/02 23:52:42 dillon Exp $
  */
 
 /*
@@ -59,6 +59,7 @@
 #include <sys/kernel.h>
 #include <sys/sysctl.h>
 #include <sys/in_cksum.h>
+#include <sys/thread2.h>
 
 #include <machine/stdarg.h>
 
@@ -353,8 +354,7 @@ void
 igmp_joingroup(inm)
        struct in_multi *inm;
 {
-       int s = splnet();
-
+       crit_enter();
        if (inm->inm_addr.s_addr == igmp_all_hosts_group
            || inm->inm_ifp->if_flags & IFF_LOOPBACK) {
                inm->inm_timer = 0;
@@ -367,7 +367,7 @@ igmp_joingroup(inm)
                inm->inm_state = IGMP_IREPORTEDLAST;
                igmp_timers_are_running = 1;
        }
-       splx(s);
+       crit_exit();
 }
 
 void
@@ -386,7 +386,6 @@ igmp_fasttimo()
 {
        struct in_multi *inm;
        struct in_multistep step;
-       int s;
 
        /*
         * Quick check to see if any work needs to be done, in order
@@ -396,7 +395,7 @@ igmp_fasttimo()
        if (!igmp_timers_are_running)
                return;
 
-       s = splnet();
+       crit_enter();
        igmp_timers_are_running = 0;
        IN_FIRST_MULTI(step, inm);
        while (inm != NULL) {
@@ -410,15 +409,15 @@ igmp_fasttimo()
                }
                IN_NEXT_MULTI(step, inm);
        }
-       splx(s);
+       crit_exit();
 }
 
 void
 igmp_slowtimo()
 {
-       int s = splnet();
        struct router_info *rti =  Head;
 
+       crit_enter();
 #ifdef IGMP_DEBUG
        printf("[igmp.c,_slowtimo] -- > entering \n");
 #endif
@@ -434,7 +433,7 @@ igmp_slowtimo()
 #ifdef IGMP_DEBUG      
        printf("[igmp.c,_slowtimo] -- > exiting \n");
 #endif
-       splx(s);
+       crit_exit();
 }
 
 static struct route igmprt;
index 66669ab..564262d 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)in.c        8.4 (Berkeley) 1/9/95
  * $FreeBSD: src/sys/netinet/in.c,v 1.44.2.14 2002/11/08 00:45:50 suz Exp $
- * $DragonFly: src/sys/netinet/in.c,v 1.14 2005/01/06 09:14:13 hsu Exp $
+ * $DragonFly: src/sys/netinet/in.c,v 1.15 2005/06/02 23:52:42 dillon Exp $
  */
 
 #include "opt_bootp.h"
@@ -44,6 +44,7 @@
 #include <sys/socket.h>
 #include <sys/kernel.h>
 #include <sys/sysctl.h>
+#include <sys/thread2.h>
 
 #include <net/if.h>
 #include <net/if_types.h>
@@ -202,7 +203,7 @@ in_control(so, cmd, data, ifp, td)
        struct in_ifaddr *oia;
        struct in_aliasreq *ifra = (struct in_aliasreq *)data;
        struct sockaddr_in oldaddr;
-       int hostIsNew, iaIsNew, maskIsNew, s;
+       int hostIsNew, iaIsNew, maskIsNew;
        int error = 0;
 
        iaIsNew = 0;
@@ -284,7 +285,7 @@ in_control(so, cmd, data, ifp, td)
                         * Protect from ipintr() traversing address list
                         * while we're modifying it.
                         */
-                       s = splnet();
+                       crit_enter();
                        
                        TAILQ_INSERT_TAIL(&in_ifaddrhead, ia, ia_link);
                        ifa = &ia->ia_ifa;
@@ -303,7 +304,7 @@ in_control(so, cmd, data, ifp, td)
                        if (!(ifp->if_flags & IFF_LOOPBACK))
                                in_interfaces++;
                        iaIsNew = 1;
-                       splx(s);
+                       crit_exit();
                }
                break;
 
@@ -456,12 +457,12 @@ in_control(so, cmd, data, ifp, td)
         * Protect from ipintr() traversing address list while we're modifying
         * it.
         */
-       s = splnet();
+       crit_enter();
        TAILQ_REMOVE(&ifp->if_addrhead, &ia->ia_ifa, ifa_link);
        TAILQ_REMOVE(&in_ifaddrhead, ia, ia_link);
        LIST_REMOVE(ia, ia_hash);
        IFAFREE(&ia->ia_ifa);
-       splx(s);
+       crit_exit();
 
        return (error);
 }
@@ -676,7 +677,9 @@ in_ifinit(ifp, ia, sin, scrub)
 {
        u_long i = ntohl(sin->sin_addr.s_addr);
        struct sockaddr_in oldaddr;
-       int s = splimp(), flags = RTF_UP, error = 0;
+       int flags = RTF_UP, error = 0;
+
+       crit_enter();
 
        oldaddr = ia->ia_addr;
        if (oldaddr.sin_family == AF_INET)
@@ -693,7 +696,7 @@ in_ifinit(ifp, ia, sin, scrub)
        if (ifp->if_ioctl &&
            (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)ia,
                                      (struct ucred *)NULL))) {
-               splx(s);
+               crit_exit();
                /* LIST_REMOVE(ia, ia_hash) is done in in_control */
                ia->ia_addr = oldaddr;
                if (ia->ia_addr.sin_family == AF_INET)
@@ -701,7 +704,7 @@ in_ifinit(ifp, ia, sin, scrub)
                            ia, ia_hash);
                return (error);
        }
-       splx(s);
+       crit_exit();
        if (scrub) {
                ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr;
                in_ifscrub(ifp, ia);
@@ -827,7 +830,6 @@ in_addmulti(ap, ifp)
        int error;
        struct sockaddr_in sin;
        struct ifmultiaddr *ifma;
-       int s = splnet();
 
        /*
         * Call generic routine to add membership or increment
@@ -838,9 +840,10 @@ in_addmulti(ap, ifp)
        sin.sin_family = AF_INET;
        sin.sin_len = sizeof sin;
        sin.sin_addr = *ap;
+       crit_enter();
        error = if_addmulti(ifp, (struct sockaddr *)&sin, &ifma);
        if (error) {
-               splx(s);
+               crit_exit();
                return 0;
        }
 
@@ -849,7 +852,7 @@ in_addmulti(ap, ifp)
         * a new record.  Otherwise, we are done.
         */
        if (ifma->ifma_protospec != 0) {
-               splx(s);
+               crit_exit();
                return ifma->ifma_protospec;
        }
 
@@ -866,7 +869,7 @@ in_addmulti(ap, ifp)
         * Let IGMP know that we have joined a new IP multicast group.
         */
        igmp_joingroup(inm);
-       splx(s);
+       crit_exit();
        return (inm);
 }
 
@@ -877,10 +880,11 @@ void
 in_delmulti(inm)
        struct in_multi *inm;
 {
-       struct ifmultiaddr *ifma = inm->inm_ifma;
+       struct ifmultiaddr *ifma;
        struct in_multi my_inm;
-       int s = splnet();
 
+       crit_enter();
+       ifma = inm->inm_ifma;
        my_inm.inm_ifp = NULL ; /* don't send the leave msg */
        if (ifma->ifma_refcount == 1) {
                /*
@@ -898,5 +902,5 @@ in_delmulti(inm)
        if_delmulti(ifma->ifma_ifp, ifma->ifma_addr);
        if (my_inm.inm_ifp != NULL)
                igmp_leavegroup(&my_inm);
-       splx(s);
+       crit_exit();
 }
index 7b8e203..b9c9239 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     @(#)in_pcb.c    8.4 (Berkeley) 5/24/95
  * $FreeBSD: src/sys/netinet/in_pcb.c,v 1.59.2.27 2004/01/02 04:06:42 ambrisko Exp $
- * $DragonFly: src/sys/netinet/in_pcb.c,v 1.35 2005/05/06 11:52:02 corecode Exp $
+ * $DragonFly: src/sys/netinet/in_pcb.c,v 1.36 2005/06/02 23:52:42 dillon Exp $
  */
 
 #include "opt_ipsec.h"
 #include <sys/jail.h>
 #include <sys/kernel.h>
 #include <sys/sysctl.h>
+#include <sys/thread2.h>
 
 #include <machine/limits.h>
 
@@ -194,9 +195,9 @@ SYSCTL_PROC(_net_inet_ip_portrange, OID_AUTO, hilast, CTLTYPE_INT|CTLFLAG_RW,
 /*
  * in_pcb.c: manage the Protocol Control Blocks.
  *
- * NOTE: It is assumed that most of these functions will be called at
- * splnet(). XXX - There are, unfortunately, a few exceptions to this
- * rule that should be fixed.
+ * NOTE: It is assumed that most of these functions will be called from
+ * a critical section.  XXX - There are, unfortunately, a few exceptions
+ * to this rule that should be fixed.
  *
  * NOTE: The caller should initialize the cpu field to the cpu running the
  * protocol stack associated with this inpcbinfo.
@@ -651,7 +652,6 @@ in_setsockaddr(so, nam)
        struct socket *so;
        struct sockaddr **nam;
 {
-       int s;
        struct inpcb *inp;
        struct sockaddr_in *sin;
 
@@ -663,16 +663,16 @@ in_setsockaddr(so, nam)
        sin->sin_family = AF_INET;
        sin->sin_len = sizeof *sin;
 
-       s = splnet();
+       crit_enter();
        inp = so->so_pcb;
        if (!inp) {
-               splx(s);
+               crit_exit();
                free(sin, M_SONAME);
                return (ECONNRESET);
        }
        sin->sin_port = inp->inp_lport;
        sin->sin_addr = inp->inp_laddr;
-       splx(s);
+       crit_exit();
 
        *nam = (struct sockaddr *)sin;
        return (0);
@@ -683,7 +683,6 @@ in_setpeeraddr(so, nam)
        struct socket *so;
        struct sockaddr **nam;
 {
-       int s;
        struct inpcb *inp;
        struct sockaddr_in *sin;
 
@@ -695,16 +694,16 @@ in_setpeeraddr(so, nam)
        sin->sin_family = AF_INET;
        sin->sin_len = sizeof *sin;
 
-       s = splnet();
+       crit_enter();
        inp = so->so_pcb;
        if (!inp) {
-               splx(s);
+               crit_exit();
                free(sin, M_SONAME);
                return (ECONNRESET);
        }
        sin->sin_port = inp->inp_fport;
        sin->sin_addr = inp->inp_faddr;
-       splx(s);
+       crit_exit();
 
        *nam = (struct sockaddr *)sin;
        return (0);
@@ -717,13 +716,12 @@ in_pcbnotifyall(head, faddr, errno, notify)
        void (*notify) (struct inpcb *, int);
 {
        struct inpcb *inp, *ninp;
-       int s;
 
        /*
         * note: if INP_PLACEMARKER is set we must ignore the rest of
         * the structure and skip it.
         */
-       s = splnet();
+       crit_enter();
        LIST_FOREACH_MUTABLE(inp, head, inp_list, ninp) {
                if (inp->inp_flags & INP_PLACEMARKER)
                        continue;
@@ -736,7 +734,7 @@ in_pcbnotifyall(head, faddr, errno, notify)
                        continue;
                (*notify)(inp, errno);          /* can remove inp from list! */
        }
-       splx(s);
+       crit_exit();
 }
 
 void
index e45b69e..4908d1e 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/in_rmx.c,v 1.37.2.3 2002/08/09 14:49:23 ru Exp $
- * $DragonFly: src/sys/netinet/in_rmx.c,v 1.11 2005/03/09 23:31:44 hsu Exp $
+ * $DragonFly: src/sys/netinet/in_rmx.c,v 1.12 2005/06/02 23:52:42 dillon Exp $
  */
 
 /*
@@ -50,6 +50,7 @@
 #include <sys/socket.h>
 #include <sys/mbuf.h>
 #include <sys/syslog.h>
+#include <sys/thread2.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -276,15 +277,14 @@ in_rtqtimo(void *rock)
        struct rtqk_arg arg;
        struct timeval atv;
        static time_t last_adjusted_timeout = 0;
-       int s;
 
        arg.found = arg.killed = 0;
        arg.rnh = rnh;
        arg.nextstop = time_second + rtq_timeout;
        arg.draining = arg.updating = 0;
-       s = splnet();
+       crit_enter();
        rnh->rnh_walktree(rnh, in_rtqkill, &arg);
-       splx(s);
+       crit_exit();
 
        /*
         * Attempt to be somewhat dynamic about this:
@@ -309,9 +309,9 @@ in_rtqtimo(void *rock)
 #endif
                arg.found = arg.killed = 0;
                arg.updating = 1;
-               s = splnet();
+               crit_enter();
                rnh->rnh_walktree(rnh, in_rtqkill, &arg);
-               splx(s);
+               crit_exit();
        }
 
        atv.tv_usec = 0;
@@ -324,16 +324,15 @@ in_rtqdrain(void)
 {
        struct radix_node_head *rnh = rt_tables[AF_INET];
        struct rtqk_arg arg;
-       int s;
 
        arg.found = arg.killed = 0;
        arg.rnh = rnh;
        arg.nextstop = 0;
        arg.draining = 1;
        arg.updating = 0;
-       s = splnet();
+       crit_enter();
        rnh->rnh_walktree(rnh, in_rtqkill, &arg);
-       splx(s);
+       crit_exit();
 }
 
 /*
index 63ce246..d33d134 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/ip_divert.c,v 1.42.2.6 2003/01/23 21:06:45 sam Exp $
- * $DragonFly: src/sys/netinet/ip_divert.c,v 1.23 2005/05/08 11:01:26 joerg Exp $
+ * $DragonFly: src/sys/netinet/ip_divert.c,v 1.24 2005/06/02 23:52:42 dillon Exp $
  */
 
 #include "opt_inet.h"
@@ -53,6 +53,7 @@
 #include <sys/sysctl.h>
 #include <sys/systm.h>
 #include <sys/proc.h>
+#include <sys/thread2.h>
 
 #include <vm/vm_zone.h>
 
@@ -342,7 +343,7 @@ static int
 div_attach(struct socket *so, int proto, struct pru_attach_info *ai)
 {
        struct inpcb *inp;
-       int error, s;
+       int error;
 
        inp  = so->so_pcb;
        if (inp)
@@ -353,9 +354,9 @@ div_attach(struct socket *so, int proto, struct pru_attach_info *ai)
        error = soreserve(so, div_sendspace, div_recvspace, ai->sb_rlimit);
        if (error)
                return error;
-       s = splnet();
+       crit_enter();
        error = in_pcballoc(so, &divcbinfo);
-       splx(s);
+       crit_exit();
        if (error)
                return error;
        inp = (struct inpcb *)so->so_pcb;
@@ -401,10 +402,9 @@ static int
 div_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
        struct inpcb *inp;
-       int s;
        int error;
 
-       s = splnet();
+       crit_enter();
        inp = so->so_pcb;
        /* in_pcbbind assumes that nam is a sockaddr_in
         * and in_pcbbind requires a valid address. Since divert
@@ -419,7 +419,7 @@ div_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
                ((struct sockaddr_in *)nam)->sin_addr.s_addr = INADDR_ANY;
                error = in_pcbbind(inp, nam, td);
        }
-       splx(s);
+       crit_exit();
        return error;
 }
 
index 4972a70..699e554 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/netinet/ip_encap.c,v 1.1.2.5 2003/01/23 21:06:45 sam Exp $    */
-/*     $DragonFly: src/sys/netinet/ip_encap.c,v 1.11 2005/02/01 05:34:33 dillon Exp $  */
+/*     $DragonFly: src/sys/netinet/ip_encap.c,v 1.12 2005/06/02 23:52:42 dillon Exp $  */
 /*     $KAME: ip_encap.c,v 1.41 2001/03/15 08:35:08 itojun Exp $       */
 
 /*
@@ -91,6 +91,7 @@
 
 #include <sys/kernel.h>
 #include <sys/malloc.h>
+#include <sys/thread2.h>
 MALLOC_DEFINE(M_NETADDR, "Export Host", "Export host address structure");
 
 static void encap_add (struct encaptab *);
@@ -314,9 +315,8 @@ encap_attach(af, proto, sp, sm, dp, dm, psw, arg)
 {
        struct encaptab *ep;
        int error;
-       int s;
 
-       s = splnet();
+       crit_enter();
        /* sanity check on args */
        if (sp->sa_len > sizeof ep->src || dp->sa_len > sizeof ep->dst) {
                error = EINVAL;
@@ -368,11 +368,11 @@ encap_attach(af, proto, sp, sm, dp, dm, psw, arg)
        encap_add(ep);
 
        error = 0;
-       splx(s);
+       crit_exit();
        return ep;
 
 fail:
-       splx(s);
+       crit_exit();
        return NULL;
 }
 
@@ -386,9 +386,8 @@ encap_attach_func(af, proto, func, psw, arg)
 {
        struct encaptab *ep;
        int error;
-       int s;
 
-       s = splnet();
+       crit_enter();
        /* sanity check on args */
        if (!func) {
                error = EINVAL;
@@ -410,11 +409,11 @@ encap_attach_func(af, proto, func, psw, arg)
        encap_add(ep);
 
        error = 0;
-       splx(s);
+       crit_exit();
        return ep;
 
 fail:
-       splx(s);
+       crit_exit();
        return NULL;
 }
 
index 86fbab2..80aea29 100644 (file)
@@ -34,7 +34,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/ip_flow.c,v 1.9.2.2 2001/11/04 17:35:31 luigi Exp $
- * $DragonFly: src/sys/netinet/ip_flow.c,v 1.7 2005/03/04 03:48:25 hsu Exp $
+ * $DragonFly: src/sys/netinet/ip_flow.c,v 1.8 2005/06/02 23:52:42 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -48,6 +48,7 @@
 #include <sys/kernel.h>
 
 #include <sys/sysctl.h>
+#include <sys/thread2.h>
 
 #include <net/if.h>
 #include <net/route.h>
@@ -183,16 +184,14 @@ ipflow_addstats(struct ipflow *ipf)
 static void
 ipflow_free(struct ipflow *ipf)
 {
-       int s;
-
        /*
         * Remove the flow from the hash table (at elevated IPL).
         * Once it's off the list, we can deal with it at normal
         * network IPL.
         */
-       s = splimp();
+       crit_enter();
        LIST_REMOVE(ipf, ipf_next);
-       splx(s);
+       crit_exit();
        ipflow_addstats(ipf);
        RTFREE(ipf->ipf_ro.ro_rt);
        ipflow_inuse--;
@@ -204,7 +203,6 @@ ipflow_reap(void)
 {
        struct ipflow *ipf, *maybe_ipf = NULL;
        int idx;
-       int s;
 
        for (idx = 0; idx < IPFLOW_HASHSIZE; idx++) {
                ipf = LIST_FIRST(&ipflows[idx]);
@@ -234,9 +232,9 @@ done:
        /*
         * Remove the entry from the flow table.
         */
-       s = splimp();
+       crit_enter();
        LIST_REMOVE(ipf, ipf_next);
-       splx(s);
+       crit_exit();
        ipflow_addstats(ipf);
        RTFREE(ipf->ipf_ro.ro_rt);
        return ipf;
@@ -272,7 +270,6 @@ ipflow_create(const struct route *ro, struct mbuf *m)
        const struct ip *const ip = mtod(m, struct ip *);
        struct ipflow *ipf;
        unsigned hash;
-       int s;
 
        /*
         * Don't create cache entries for ICMP messages.
@@ -297,9 +294,9 @@ ipflow_create(const struct route *ro, struct mbuf *m)
                }
                bzero(ipf, sizeof *ipf);
        } else {
-               s = splimp();
+               crit_enter();
                LIST_REMOVE(ipf, ipf_next);
-               splx(s);
+               crit_exit();
                ipflow_addstats(ipf);
                RTFREE(ipf->ipf_ro.ro_rt);
                ipf->ipf_uses = ipf->ipf_last_uses = 0;
@@ -319,7 +316,7 @@ ipflow_create(const struct route *ro, struct mbuf *m)
         * Insert into the approriate bucket of the flow table.
         */
        hash = ipflow_hash(ip->ip_dst, ip->ip_src, ip->ip_tos);
-       s = splimp();
+       crit_enter();
        LIST_INSERT_HEAD(&ipflows[hash], ipf, ipf_next);
-       splx(s);
+       crit_exit();
 }
index 5927a93..eff0e41 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     @(#)ip_input.c  8.2 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/netinet/ip_input.c,v 1.130.2.52 2003/03/07 07:01:28 silby Exp $
- * $DragonFly: src/sys/netinet/ip_input.c,v 1.51 2005/04/18 23:43:04 hsu Exp $
+ * $DragonFly: src/sys/netinet/ip_input.c,v 1.52 2005/06/02 23:52:42 dillon Exp $
  */
 
 #define        _IP_VHL
@@ -478,7 +478,7 @@ ip_input(struct mbuf *m)
 #ifdef FAST_IPSEC
        struct tdb_ident *tdbi;
        struct secpolicy *sp;
-       int s, error;
+       int error;
 #endif
 
        args.eh = NULL;
@@ -834,7 +834,7 @@ pass:
 #endif
 #ifdef FAST_IPSEC
                mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_DONE, NULL);
-               s = splnet();
+               crit_enter();
                if (mtag != NULL) {
                        tdbi = (struct tdb_ident *)(mtag + 1);
                        sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND);
@@ -843,7 +843,7 @@ pass:
                                                   IP_FORWARDING, &error);
                }
                if (sp == NULL) {       /* NB: can happen if error */
-                       splx(s);
+                       crit_exit();
                        /*XXX error stat???*/
                        DPRINTF(("ip_input: no SP for forwarding\n"));  /*XXX*/
                        goto bad;
@@ -854,7 +854,7 @@ pass:
                 */
                error = ipsec_in_reject(sp, m);
                KEY_FREESP(&sp);
-               splx(s);
+               crit_exit();
                if (error) {
                        ipstat.ips_cantforward++;
                        goto bad;
@@ -1061,7 +1061,7 @@ found:
                 * packet is returned to the ip input queue for delivery.
                 */
                mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_DONE, NULL);
-               s = splnet();
+               crit_enter();
                if (mtag != NULL) {
                        tdbi = (struct tdb_ident *)(mtag + 1);
                        sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND);
@@ -1081,7 +1081,7 @@ found:
 DPRINTF(("ip_input: no SP, packet discarded\n"));/*XXX*/
                        goto bad;
                }
-               splx(s);
+               crit_exit();
                if (error)
                        goto bad;
        }
@@ -1382,9 +1382,9 @@ void
 ip_slowtimo(void)
 {
        struct ipq *fp;
-       int s = splnet();
        int i;
 
+       crit_enter();
        for (i = 0; i < IPREASS_NHASH; i++) {
                fp = ipq[i].next;
                if (fp == NULL)
@@ -1414,7 +1414,7 @@ ip_slowtimo(void)
                }
        }
        ipflow_slowtimo();
-       splx(s);
+       crit_exit();
 }
 
 /*
index 35fd5d7..12d6cae 100644 (file)
@@ -28,7 +28,7 @@
  *
  *     @(#)ip_output.c 8.3 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/netinet/ip_output.c,v 1.99.2.37 2003/04/15 06:44:45 silby Exp $
- * $DragonFly: src/sys/netinet/ip_output.c,v 1.28 2005/04/18 14:26:57 joerg Exp $
+ * $DragonFly: src/sys/netinet/ip_output.c,v 1.29 2005/06/02 23:52:42 dillon Exp $
  */
 
 #define _IP_VHL
@@ -51,6 +51,7 @@
 #include <sys/socketvar.h>
 #include <sys/proc.h>
 #include <sys/sysctl.h>
+#include <sys/thread2.h>
 #include <sys/in_cksum.h>
 
 #include <net/if.h>
@@ -143,7 +144,6 @@ ip_output(struct mbuf *m0, struct mbuf *opt, struct route *ro,
        struct m_tag *mtag;
        struct secpolicy *sp = NULL;
        struct tdb_ident *tdbi;
-       int s;
 #endif /* FAST_IPSEC */
        struct ip_fw_args args;
        int src_was_INADDR_ANY = 0;     /* as the name says... */
@@ -583,7 +583,7 @@ skip_ipsec:
         * the lookup and related policy checking.
         */
        mtag = m_tag_find(m, PACKET_TAG_IPSEC_PENDING_TDB, NULL);
-       s = splnet();
+       crit_enter();
        if (mtag != NULL) {
                tdbi = (struct tdb_ident *)(mtag + 1);
                sp = ipsec_getpolicy(tdbi, IPSEC_DIR_OUTBOUND);
@@ -632,7 +632,7 @@ skip_ipsec:
                                 *     done: below.
                                 */
                                KEY_FREESP(&sp), sp = NULL;
-                               splx(s);
+                               crit_exit();
                                goto spd_done;
                        }
                }
@@ -660,10 +660,10 @@ skip_ipsec:
                 */
                if (error == ENOENT)
                        error = 0;
-               splx(s);
+               crit_exit();
                goto done;
        } else {
-               splx(s);
+               crit_exit();
 
                if (error != 0) {
                        /*
@@ -1771,7 +1771,6 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
        struct ifnet *ifp;
        struct ip_moptions *imo = *imop;
        int ifindex;
-       int s;
 
        if (imo == NULL) {
                /*
@@ -1829,10 +1828,10 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                 * IP address.  Find the interface and confirm that
                 * it supports multicasting.
                 */
-               s = splimp();
+               crit_enter();
                ifp = ip_multicast_if(&addr, &ifindex);
                if (ifp == NULL || !(ifp->if_flags & IFF_MULTICAST)) {
-                       splx(s);
+                       crit_exit();
                        error = EADDRNOTAVAIL;
                        break;
                }
@@ -1841,7 +1840,7 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                        imo->imo_multicast_addr = addr;
                else
                        imo->imo_multicast_addr.s_addr = INADDR_ANY;
-               splx(s);
+               crit_exit();
                break;
 
        case IP_MULTICAST_TTL:
@@ -1907,7 +1906,7 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                        error = EINVAL;
                        break;
                }
-               s = splimp();
+               crit_enter();
                /*
                 * If no interface address was provided, use the interface of
                 * the route to the given multicast address.
@@ -1923,7 +1922,7 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                        rt = rtlookup((struct sockaddr *)&dst);
                        if (rt == NULL) {
                                error = EADDRNOTAVAIL;
-                               splx(s);
+                               crit_exit();
                                break;
                        }
                        --rt->rt_refcnt;
@@ -1938,7 +1937,7 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                 */
                if (ifp == NULL || !(ifp->if_flags & IFF_MULTICAST)) {
                        error = EADDRNOTAVAIL;
-                       splx(s);
+                       crit_exit();
                        break;
                }
                /*
@@ -1953,12 +1952,12 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                }
                if (i < imo->imo_num_memberships) {
                        error = EADDRINUSE;
-                       splx(s);
+                       crit_exit();
                        break;
                }
                if (i == IP_MAX_MEMBERSHIPS) {
                        error = ETOOMANYREFS;
-                       splx(s);
+                       crit_exit();
                        break;
                }
                /*
@@ -1968,11 +1967,11 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                if ((imo->imo_membership[i] =
                     in_addmulti(&mreq.imr_multiaddr, ifp)) == NULL) {
                        error = ENOBUFS;
-                       splx(s);
+                       crit_exit();
                        break;
                }
                ++imo->imo_num_memberships;
-               splx(s);
+               crit_exit();
                break;
 
        case IP_DROP_MEMBERSHIP:
@@ -1989,7 +1988,7 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                        break;
                }
 
-               s = splimp();
+               crit_enter();
                /*
                 * If an interface address was specified, get a pointer
                 * to its ifnet structure.
@@ -2000,7 +1999,7 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                        ifp = ip_multicast_if(&mreq.imr_interface, NULL);
                        if (ifp == NULL) {
                                error = EADDRNOTAVAIL;
-                               splx(s);
+                               crit_exit();
                                break;
                        }
                }
@@ -2016,7 +2015,7 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                }
                if (i == imo->imo_num_memberships) {
                        error = EADDRNOTAVAIL;
-                       splx(s);
+                       crit_exit();
                        break;
                }
                /*
@@ -2030,7 +2029,7 @@ ip_setmoptions(struct sockopt *sopt, struct ip_moptions **imop)
                for (++i; i < imo->imo_num_memberships; ++i)
                        imo->imo_membership[i-1] = imo->imo_membership[i];
                --imo->imo_num_memberships;
-               splx(s);
+               crit_exit();
                break;
 
        default:
index c637f98..b65c9fb 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)raw_ip.c    8.7 (Berkeley) 5/15/95
  * $FreeBSD: src/sys/netinet/raw_ip.c,v 1.64.2.16 2003/08/24 08:24:38 hsu Exp $
- * $DragonFly: src/sys/netinet/raw_ip.c,v 1.21 2005/03/04 03:48:25 hsu Exp $
+ * $DragonFly: src/sys/netinet/raw_ip.c,v 1.22 2005/06/02 23:52:42 dillon Exp $
  */
 
 #include "opt_inet6.h"
@@ -49,6 +49,7 @@
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/sysctl.h>
+#include <sys/thread2.h>
 
 #include <machine/stdarg.h>
 
@@ -511,7 +512,7 @@ static int
 rip_attach(struct socket *so, int proto, struct pru_attach_info *ai)
 {
        struct inpcb *inp;
-       int error, s;
+       int error;
 
        inp = so->so_pcb;
        if (inp)
@@ -522,9 +523,9 @@ rip_attach(struct socket *so, int proto, struct pru_attach_info *ai)
        error = soreserve(so, rip_sendspace, rip_recvspace, ai->sb_rlimit);
        if (error)
                return error;
-       s = splnet();
+       crit_enter();
        error = in_pcballoc(so, &ripcbinfo);
-       splx(s);
+       crit_exit();
        if (error)
                return error;
        inp = (struct inpcb *)so->so_pcb;
index 38d557d..203282e 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     @(#)tcp_subr.c  8.2 (Berkeley) 5/24/95
  * $FreeBSD: src/sys/netinet/tcp_subr.c,v 1.73.2.31 2003/01/24 05:11:34 sam Exp $
- * $DragonFly: src/sys/netinet/tcp_subr.c,v 1.48 2005/05/10 15:48:10 hsu Exp $
+ * $DragonFly: src/sys/netinet/tcp_subr.c,v 1.49 2005/06/02 23:52:42 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -1206,7 +1206,7 @@ tcp_getcred(SYSCTL_HANDLER_ARGS)
        struct sockaddr_in addrs[2];
        struct inpcb *inp;
        int cpu;
-       int error, s;
+       int error;
 
        error = suser(req->td);
        if (error != 0)
@@ -1214,8 +1214,7 @@ tcp_getcred(SYSCTL_HANDLER_ARGS)
        error = SYSCTL_IN(req, addrs, sizeof addrs);
        if (error != 0)
                return (error);
-       s = splnet();
-
+       crit_enter();
        cpu = tcp_addrcpu(addrs[1].sin_addr.s_addr, addrs[1].sin_port,
            addrs[0].sin_addr.s_addr, addrs[0].sin_port);
        inp = in_pcblookup_hash(&tcbinfo[cpu], addrs[1].sin_addr,
@@ -1226,7 +1225,7 @@ tcp_getcred(SYSCTL_HANDLER_ARGS)
        }
        error = SYSCTL_OUT(req, inp->inp_socket->so_cred, sizeof(struct ucred));
 out:
-       splx(s);
+       crit_exit();
        return (error);
 }
 
@@ -1239,7 +1238,7 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS)
 {
        struct sockaddr_in6 addrs[2];
        struct inpcb *inp;
-       int error, s;
+       int error;
        boolean_t mapped = FALSE;
 
        error = suser(req->td);
@@ -1254,7 +1253,7 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS)
                else
                        return (EINVAL);
        }
-       s = splnet();
+       crit_enter();
        if (mapped) {
                inp = in_pcblookup_hash(&tcbinfo[0],
                    *(struct in_addr *)&addrs[1].sin6_addr.s6_addr[12],
@@ -1274,7 +1273,7 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS)
        }
        error = SYSCTL_OUT(req, inp->inp_socket->so_cred, sizeof(struct ucred));
 out:
-       splx(s);
+       crit_exit();
        return (error);
 }
 
@@ -1293,7 +1292,7 @@ tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
        struct tcpcb *tp;
        void (*notify)(struct inpcb *, int) = tcp_notify;
        tcp_seq icmpseq;
-       int arg, cpu, s;
+       int arg, cpu;
 
        if ((unsigned)cmd >= PRC_NCMDS || inetctlerrmap[cmd] == 0) {
                return;
@@ -1326,7 +1325,7 @@ tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
        }
 
        if (ip != NULL) {
-               s = splnet();
+               crit_enter();
                th = (struct tcphdr *)((caddr_t)ip +
                                       (IP_VHL_HL(ip->ip_vhl) << 2));
                cpu = tcp_addrcpu(faddr.s_addr, th->th_dport,
@@ -1351,7 +1350,7 @@ tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
 #endif
                        syncache_unreach(&inc, th);
                }
-               splx(s);
+               crit_exit();
        } else {
                for (cpu = 0; cpu < ncpus2; cpu++) {
                        in_pcbnotifyall(&tcbinfo[cpu].pcblisthead, faddr, arg,
index cf176ce..5cd1fe5 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     @(#)tcp_timer.c 8.2 (Berkeley) 5/24/95
  * $FreeBSD: src/sys/netinet/tcp_timer.c,v 1.34.2.14 2003/02/03 02:33:41 hsu Exp $
- * $DragonFly: src/sys/netinet/tcp_timer.c,v 1.14 2005/05/10 15:48:10 hsu Exp $
+ * $DragonFly: src/sys/netinet/tcp_timer.c,v 1.15 2005/06/02 23:52:42 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -99,6 +99,7 @@
 #include <sys/protosw.h>
 #include <sys/thread.h>
 #include <sys/globaldata.h>
+#include <sys/thread2.h>
 
 #include <machine/cpu.h>       /* before tcp_seq.h, for tcp_random18() */
 
@@ -189,13 +190,9 @@ int        tcp_maxidle;
 void
 tcp_slowtimo(void)
 {
-       int s;
-
-       s = splnet();
-
+       crit_enter();
        tcp_maxidle = tcp_keepcnt * tcp_keepintvl;
-
-       splx(s);
+       crit_exit();
 }
 
 /*
@@ -225,11 +222,10 @@ void
 tcp_timer_delack(void *xtp)
 {
        struct tcpcb *tp = xtp;
-       int s;
 
-       s = splnet();
+       crit_enter();
        if (callout_pending(tp->tt_delack) || !callout_active(tp->tt_delack)) {
-               splx(s);
+               crit_exit();
                return;
        }
        callout_deactivate(tp->tt_delack);
@@ -237,22 +233,21 @@ tcp_timer_delack(void *xtp)
        tp->t_flags |= TF_ACKNOW;
        tcpstat.tcps_delack++;
        tcp_output(tp);
-       splx(s);
+       crit_exit();
 }
 
 void
 tcp_timer_2msl(void *xtp)
 {
        struct tcpcb *tp = xtp;
-       int s;
 #ifdef TCPDEBUG
        int ostate;
 
        ostate = tp->t_state;
 #endif
-       s = splnet();
+       crit_enter();
        if (callout_pending(tp->tt_2msl) || !callout_active(tp->tt_2msl)) {
-               splx(s);
+               crit_exit();
                return;
        }
        callout_deactivate(tp->tt_2msl);
@@ -273,7 +268,7 @@ tcp_timer_2msl(void *xtp)
        if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
                tcp_trace(TA_USER, ostate, tp, NULL, NULL, PRU_SLOWTIMO);
 #endif
-       splx(s);
+       crit_exit();
 }
 
 void
@@ -281,15 +276,14 @@ tcp_timer_keep(void *xtp)
 {
        struct tcpcb *tp = xtp;
        struct tcptemp *t_template;
-       int s;
 #ifdef TCPDEBUG
        int ostate;
 
        ostate = tp->t_state;
 #endif
-       s = splnet();
+       crit_enter();
        if (callout_pending(tp->tt_keep) || !callout_active(tp->tt_keep)) {
-               splx(s);
+               crit_exit();
                return;
        }
        callout_deactivate(tp->tt_keep);
@@ -333,7 +327,7 @@ tcp_timer_keep(void *xtp)
        if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)
                tcp_trace(TA_USER, ostate, tp, NULL, NULL, PRU_SLOWTIMO);
 #endif
-       splx(s);
+       crit_exit();
        return;
 
 dropit:
@@ -344,22 +338,21 @@ dropit:
        if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
                tcp_trace(TA_USER, ostate, tp, NULL, NULL, PRU_SLOWTIMO);
 #endif
-       splx(s);
+       crit_exit();
 }
 
 void
 tcp_timer_persist(void *xtp)
 {
        struct tcpcb *tp = xtp;
-       int s;
 #ifdef TCPDEBUG
        int ostate;
 
        ostate = tp->t_state;
 #endif
-       s = splnet();
+       crit_enter();
        if (callout_pending(tp->tt_persist) || !callout_active(tp->tt_persist)){
-               splx(s);
+               crit_exit();
                return;
        }
        callout_deactivate(tp->tt_persist);
@@ -392,7 +385,7 @@ out:
        if (tp && tp->t_inpcb->inp_socket->so_options & SO_DEBUG)
                tcp_trace(TA_USER, ostate, tp, NULL, NULL, PRU_SLOWTIMO);
 #endif
-       splx(s);
+       crit_exit();
 }
 
 void
@@ -442,16 +435,15 @@ void
 tcp_timer_rexmt(void *xtp)
 {
        struct tcpcb *tp = xtp;
-       int s;
        int rexmt;
 #ifdef TCPDEBUG
        int ostate;
 
        ostate = tp->t_state;
 #endif
-       s = splnet();
+       crit_enter();
        if (callout_pending(tp->tt_rexmt) || !callout_active(tp->tt_rexmt)) {
-               splx(s);
+               crit_exit();
                return;
        }
        callout_deactivate(tp->tt_rexmt);
@@ -570,5 +562,5 @@ out:
        if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
                tcp_trace(TA_USER, ostate, tp, NULL, NULL, PRU_SLOWTIMO);
 #endif
-       splx(s);
+       crit_exit();
 }
index 18edf68..1ff0637 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     From: @(#)tcp_usrreq.c  8.2 (Berkeley) 1/3/94
  * $FreeBSD: src/sys/netinet/tcp_usrreq.c,v 1.51.2.17 2002/10/11 11:46:44 ume Exp $
- * $DragonFly: src/sys/netinet/tcp_usrreq.c,v 1.35 2005/04/05 07:08:52 dillon Exp $
+ * $DragonFly: src/sys/netinet/tcp_usrreq.c,v 1.36 2005/06/02 23:52:42 dillon Exp $
  */
 
 #include "opt_ipsec.h"
 #include <sys/socketvar.h>
 #include <sys/protosw.h>
 
+#include <sys/thread2.h>
 #include <sys/msgport2.h>
 
 #include <net/if.h>
@@ -174,12 +175,13 @@ static struct tcpcb *
 static int
 tcp_usr_attach(struct socket *so, int proto, struct pru_attach_info *ai)
 {
-       int s = splnet();
        int error;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp = 0;
        TCPDEBUG0;
 
+       crit_enter();
+       inp = so->so_pcb;
        TCPDEBUG1();
        if (inp) {
                error = EISCONN;
@@ -195,7 +197,7 @@ tcp_usr_attach(struct socket *so, int proto, struct pru_attach_info *ai)
        tp = sototcpcb(so);
 out:
        TCPDEBUG2(PRU_ATTACH);
-       splx(s);
+       crit_exit();
        return error;
 }
 
@@ -209,14 +211,15 @@ out:
 static int
 tcp_usr_detach(struct socket *so)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
        TCPDEBUG0;
 
+       crit_enter();
+       inp = so->so_pcb;
        if (inp == NULL) {
-               splx(s);
+               crit_exit();
                return EINVAL;  /* XXX */
        }
 
@@ -230,21 +233,25 @@ tcp_usr_detach(struct socket *so)
                tp = tcp_disconnect(tp);
                TCPDEBUG2(PRU_DETACH);
        }
-       splx(s);
+       crit_exit();
        return error;
 }
 
-#define        COMMON_START()  TCPDEBUG0; \
+#define        COMMON_START(so, inp)           \
+                       TCPDEBUG0;      \
+                                       \
+                       crit_enter();   \
+                       inp = so->so_pcb; \
                        do { \
                                     if (inp == 0) { \
-                                            splx(s); \
+                                            crit_exit(); \
                                             return EINVAL; \
                                     } \
                                     tp = intotcpcb(inp); \
                                     TCPDEBUG1(); \
                     } while(0)
 
-#define COMMON_END(req)        out: TCPDEBUG2(req); splx(s); return error; goto out
+#define COMMON_END(req)        out: TCPDEBUG2(req); crit_exit(); return error; goto out
 
 
 /*
@@ -253,13 +260,12 @@ tcp_usr_detach(struct socket *so)
 static int
 tcp_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
        struct sockaddr_in *sinp;
 
-       COMMON_START();
+       COMMON_START(so, inp);
 
        /*
         * Must check for multicast addresses and disallow binding
@@ -282,13 +288,12 @@ tcp_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
 static int
 tcp6_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
        struct sockaddr_in6 *sin6p;
 
-       COMMON_START();
+       COMMON_START(so, inp);
 
        /*
         * Must check for multicast addresses and disallow binding
@@ -346,15 +351,14 @@ in_pcbinswildcardhash_handler(struct lwkt_msg *msg0)
 static int
 tcp_usr_listen(struct socket *so, struct thread *td)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
 #ifdef SMP
        int cpu;
 #endif
 
-       COMMON_START();
+       COMMON_START(so, inp);
        if (inp->inp_lport == 0) {
                error = in_pcbbind(inp, NULL, td);
                if (error != 0)
@@ -395,15 +399,14 @@ tcp_usr_listen(struct socket *so, struct thread *td)
 static int
 tcp6_usr_listen(struct socket *so, struct thread *td)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
 #ifdef SMP
        int cpu;
 #endif
 
-       COMMON_START();
+       COMMON_START(so, inp);
        if (inp->inp_lport == 0) {
                if (!(inp->inp_flags & IN6P_IPV6_V6ONLY))
                        inp->inp_vflag |= INP_IPV4;
@@ -453,13 +456,12 @@ tcp6_usr_listen(struct socket *so, struct thread *td)
 static int
 tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
        struct sockaddr_in *sinp;
 
-       COMMON_START();
+       COMMON_START(so, inp);
 
        /*
         * Must disallow TCP ``connections'' to multicast addresses.
@@ -483,13 +485,12 @@ tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
 static int
 tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
        struct sockaddr_in6 *sin6p;
 
-       COMMON_START();
+       COMMON_START(so, inp);
 
        /*
         * Must disallow TCP ``connections'' to multicast addresses.
@@ -541,12 +542,11 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
 static int
 tcp_usr_disconnect(struct socket *so)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
 
-       COMMON_START();
+       COMMON_START(so, inp);
        tp = tcp_disconnect(tp);
        COMMON_END(PRU_DISCONNECT);
 }
@@ -559,18 +559,19 @@ tcp_usr_disconnect(struct socket *so)
 static int
 tcp_usr_accept(struct socket *so, struct sockaddr **nam)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp = NULL;
        TCPDEBUG0;
 
+       crit_enter();
+       inp = so->so_pcb;
        if (so->so_state & SS_ISDISCONNECTED) {
                error = ECONNABORTED;
                goto out;
        }
        if (inp == 0) {
-               splx(s);
+               crit_exit();
                return (EINVAL);
        }
        tp = intotcpcb(inp);
@@ -583,18 +584,20 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam)
 static int
 tcp6_usr_accept(struct socket *so, struct sockaddr **nam)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp = NULL;
        TCPDEBUG0;
 
+       crit_enter();
+       inp = so->so_pcb;
+
        if (so->so_state & SS_ISDISCONNECTED) {
                error = ECONNABORTED;
                goto out;
        }
        if (inp == 0) {
-               splx(s);
+               crit_exit();
                return (EINVAL);
        }
        tp = intotcpcb(inp);
@@ -609,12 +612,11 @@ tcp6_usr_accept(struct socket *so, struct sockaddr **nam)
 static int
 tcp_usr_shutdown(struct socket *so)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
 
-       COMMON_START();
+       COMMON_START(so, inp);
        socantsendmore(so);
        tp = tcp_usrclosed(tp);
        if (tp)
@@ -628,12 +630,11 @@ tcp_usr_shutdown(struct socket *so)
 static int
 tcp_usr_rcvd(struct socket *so, int flags)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
 
-       COMMON_START();
+       COMMON_START(so, inp);
        tcp_output(tp);
        COMMON_END(PRU_RCVD);
 }
@@ -649,20 +650,22 @@ static int
 tcp_usr_send(struct socket *so, int flags, struct mbuf *m,
             struct sockaddr *nam, struct mbuf *control, struct thread *td)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
 #ifdef INET6
        int isipv6;
 #endif
        TCPDEBUG0;
 
+       crit_enter();
+       inp = so->so_pcb;
+
        if (inp == NULL) {
                /*
                 * OOPS! we lost a race, the TCP session got reset after
                 * we checked SS_CANTSENDMORE, eg: while doing uiomove or a
-                * network interrupt in the non-splnet() section of sosend().
+                * network interrupt in the non-critical section of sosend().
                 */
                if (m)
                        m_freem(m);
@@ -773,12 +776,11 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m,
 static int
 tcp_usr_abort(struct socket *so)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
 
-       COMMON_START();
+       COMMON_START(so, inp);
        tp = tcp_drop(tp, ECONNABORTED);
        COMMON_END(PRU_ABORT);
 }
@@ -789,12 +791,11 @@ tcp_usr_abort(struct socket *so)
 static int
 tcp_usr_rcvoob(struct socket *so, struct mbuf *m, int flags)
 {
-       int s = splnet();
        int error = 0;
-       struct inpcb *inp = so->so_pcb;
+       struct inpcb *inp;
        struct tcpcb *tp;
 
-       COMMON_START();
+       COMMON_START(so, inp);
        if ((so->so_oobmark == 0 &&
             (so->so_state & SS_RCVATMARK) == 0) ||
            so->so_options & SO_OOBINLINE ||
@@ -1061,25 +1062,25 @@ tcp6_connect(struct tcpcb *tp, struct sockaddr *nam, struct thread *td)
 
 /*
  * The new sockopt interface makes it possible for us to block in the
- * copyin/out step (if we take a page fault).  Taking a page fault at
- * splnet() is probably a Bad Thing.  (Since sockets and pcbs both now
- * use TSM, there probably isn't any need for this function to run at
- * splnet() any more.  This needs more examination.)
+ * copyin/out step (if we take a page fault).  Taking a page fault while
+ * in a critical section is probably a Bad Thing.  (Since sockets and pcbs
+ * both now use TSM, there probably isn't any need for this function to 
+ * run in a critical section any more.  This needs more examination.)
  */
 int
 tcp_ctloutput(so, sopt)
        struct socket *so;
        struct sockopt *sopt;
 {
-       int     error, opt, optval, s;
+       int     error, opt, optval;
        struct  inpcb *inp;
        struct  tcpcb *tp;
 
        error = 0;
-       s = splnet();           /* XXX */
+       crit_enter();           /* XXX */
        inp = so->so_pcb;
        if (inp == NULL) {
-               splx(s);
+               crit_exit();
                return (ECONNRESET);
        }
        if (sopt->sopt_level != IPPROTO_TCP) {
@@ -1089,7 +1090,7 @@ tcp_ctloutput(so, sopt)
                else
 #endif /* INET6 */
                error = ip_ctloutput(so, sopt);
-               splx(s);
+               crit_exit();
                return (error);
        }
        tp = intotcpcb(inp);
@@ -1176,7 +1177,7 @@ tcp_ctloutput(so, sopt)
                        error = sooptcopyout(sopt, &optval, sizeof optval);
                break;
        }
-       splx(s);
+       crit_exit();
        return (error);
 }
 
index 9a7ee4b..55d84d9 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     @(#)udp_usrreq.c        8.6 (Berkeley) 5/23/95
  * $FreeBSD: src/sys/netinet/udp_usrreq.c,v 1.64.2.18 2003/01/24 05:11:34 sam Exp $
- * $DragonFly: src/sys/netinet/udp_usrreq.c,v 1.34 2005/02/08 22:56:19 hsu Exp $
+ * $DragonFly: src/sys/netinet/udp_usrreq.c,v 1.35 2005/06/02 23:52:42 dillon Exp $
  */
 
 #include "opt_ipsec.h"
 #include <sys/socketvar.h>
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
+#include <sys/thread2.h>
 #include <sys/in_cksum.h>
 
 #include <machine/stdarg.h>
@@ -629,7 +630,6 @@ udp_ctlinput(cmd, sa, vip)
        void (*notify) (struct inpcb *, int) = udp_notify;
        struct in_addr faddr;
        struct inpcb *inp;
-       int s;
 
        faddr = ((struct sockaddr_in *)sa)->sin_addr;
        if (sa->sa_family != AF_INET || faddr.s_addr == INADDR_ANY)
@@ -643,13 +643,13 @@ udp_ctlinput(cmd, sa, vip)
        else if ((unsigned)cmd >= PRC_NCMDS || inetctlerrmap[cmd] == 0)
                return;
        if (ip) {
-               s = splnet();
+               crit_enter();
                uh = (struct udphdr *)((caddr_t)ip + (ip->ip_hl << 2));
                inp = in_pcblookup_hash(&udbinfo, faddr, uh->uh_dport,
                                        ip->ip_src, uh->uh_sport, 0, NULL);
                if (inp != NULL && inp->inp_socket != NULL)
                        (*notify)(inp, inetctlerrmap[cmd]);
-               splx(s);
+               crit_exit();
        } else
                in_pcbnotifyall(&udbinfo.pcblisthead, faddr, inetctlerrmap[cmd],
                                notify);
@@ -663,7 +663,7 @@ udp_getcred(SYSCTL_HANDLER_ARGS)
 {
        struct sockaddr_in addrs[2];
        struct inpcb *inp;
-       int error, s;
+       int error;
 
        error = suser(req->td);
        if (error)
@@ -671,7 +671,7 @@ udp_getcred(SYSCTL_HANDLER_ARGS)
        error = SYSCTL_IN(req, addrs, sizeof addrs);
        if (error)
                return (error);
-       s = splnet();
+       crit_enter();
        inp = in_pcblookup_hash(&udbinfo, addrs[1].sin_addr, addrs[1].sin_port,
                                addrs[0].sin_addr, addrs[0].sin_port, 1, NULL);
        if (inp == NULL || inp->inp_socket == NULL) {
@@ -680,7 +680,7 @@ udp_getcred(SYSCTL_HANDLER_ARGS)
        }
        error = SYSCTL_OUT(req, inp->inp_socket->so_cred, sizeof(struct ucred));
 out:
-       splx(s);
+       crit_exit();
        return (error);
 }
 
@@ -832,15 +832,14 @@ static int
 udp_abort(struct socket *so)
 {
        struct inpcb *inp;
-       int s;
 
        inp = so->so_pcb;
        if (inp == NULL)
                return EINVAL;  /* ??? possible? panic instead? */
        soisdisconnected(so);
-       s = splnet();
+       crit_enter();
        in_pcbdetach(inp);
-       splx(s);
+       crit_exit();
        return 0;
 }
 
@@ -848,7 +847,7 @@ static int
 udp_attach(struct socket *so, int proto, struct pru_attach_info *ai)
 {
        struct inpcb *inp;
-       int s, error;
+       int error;
 
        inp = so->so_pcb;
        if (inp != NULL)
@@ -857,9 +856,9 @@ udp_attach(struct socket *so, int proto, struct pru_attach_info *ai)
        error = soreserve(so, udp_sendspace, udp_recvspace, ai->sb_rlimit);
        if (error)
                return error;
-       s = splnet();
+       crit_enter();
        error = in_pcballoc(so, &udbinfo);
-       splx(s);
+       crit_exit();
        if (error)
                return error;
 
@@ -874,14 +873,14 @@ udp_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
        struct sockaddr_in *sin = (struct sockaddr_in *)nam;
        struct inpcb *inp;
-       int s, error;
+       int error;
 
        inp = so->so_pcb;
        if (inp == NULL)
                return EINVAL;
-       s = splnet();
+       crit_enter();
        error = in_pcbbind(inp, nam, td);
-       splx(s);
+       crit_exit();
        if (error == 0) {
                if (sin->sin_addr.s_addr != INADDR_ANY)
                        inp->inp_flags |= INP_WASBOUND_NOTANY;
@@ -894,7 +893,7 @@ static int
 udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
 {
        struct inpcb *inp;
-       int s, error;
+       int error;
        struct sockaddr_in *sin;
 
        inp = so->so_pcb;
@@ -903,7 +902,7 @@ udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
        if (inp->inp_faddr.s_addr != INADDR_ANY)
                return EISCONN;
        error = 0;
-       s = splnet();
+       crit_enter();
        if (td->td_proc && td->td_proc->p_ucred->cr_prison != NULL &&
            inp->inp_laddr.s_addr == INADDR_ANY) {
                error = in_pcbbind(inp, NULL, td);
@@ -915,7 +914,7 @@ udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
                        in_pcbremwildcardhash(inp);
                error = in_pcbconnect(inp, nam, td);
        }
-       splx(s);
+       crit_exit();
        if (error == 0)
                soisconnected(so);
        else if (error == EAFNOSUPPORT) {       /* connection dissolved */
@@ -935,14 +934,13 @@ static int
 udp_detach(struct socket *so)
 {
        struct inpcb *inp;
-       int s;
 
        inp = so->so_pcb;
        if (inp == NULL)
                return EINVAL;
-       s = splnet();
+       crit_enter();
        in_pcbdetach(inp);
-       splx(s);
+       crit_exit();
        return 0;
 }
 
@@ -950,7 +948,6 @@ static int
 udp_disconnect(struct socket *so)
 {
        struct inpcb *inp;
-       int s;
 
        inp = so->so_pcb;
        if (inp == NULL)
@@ -958,9 +955,9 @@ udp_disconnect(struct socket *so)
        if (inp->inp_faddr.s_addr == INADDR_ANY)
                return ENOTCONN;
 
-       s = splnet();
+       crit_enter();
        in_pcbdisconnect(inp);
-       splx(s);
+       crit_exit();
        so->so_state &= ~SS_ISCONNECTED;                /* XXX */
        return 0;
 }