Don't drain the protocol queues at interrupt level.
authordm <dm@openbsd.org>
Mon, 2 Sep 1996 18:14:15 +0000 (18:14 +0000)
committerdm <dm@openbsd.org>
Mon, 2 Sep 1996 18:14:15 +0000 (18:14 +0000)
sys/kern/uipc_mbuf.c
sys/netinet/ip_input.c
sys/sys/mbuf.h

index efd54f9..b37aa24 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uipc_mbuf.c,v 1.3 1996/06/20 10:50:22 deraadt Exp $   */
+/*     $OpenBSD: uipc_mbuf.c,v 1.4 1996/09/02 18:14:15 dm Exp $        */
 /*     $NetBSD: uipc_mbuf.c,v 1.15.4.1 1996/06/13 17:11:44 cgd Exp $   */
 
 /*
@@ -53,6 +53,7 @@
 extern vm_map_t mb_map;
 struct mbuf *mbutl;
 char   *mclrefcnt;
+int    needqueuedrain;
 
 void
 mbinit()
@@ -120,6 +121,11 @@ m_retry(i, t)
 {
        register struct mbuf *m;
 
+       if (i & M_DONTWAIT) {
+               needqueuedrain = 1;
+               setsoftnet ();
+               return (NULL);
+       }
        m_reclaim();
 #define m_retry(i, t)  (struct mbuf *)0
        MGET(m, i, t);
@@ -136,6 +142,11 @@ m_retryhdr(i, t)
 {
        register struct mbuf *m;
 
+       if (i & M_DONTWAIT) {
+               needqueuedrain = 1;
+               setsoftnet ();
+               return (NULL);
+       }
        m_reclaim();
 #define m_retryhdr(i, t) (struct mbuf *)0
        MGETHDR(m, i, t);
@@ -150,6 +161,7 @@ m_reclaim()
        register struct protosw *pr;
        int s = splimp();
 
+       needqueuedrain = 0;
        for (dp = domains; dp; dp = dp->dom_next)
                for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
                        if (pr->pr_drain)
index c004bf3..56ee3ea 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip_input.c,v 1.16 1996/08/14 07:50:13 deraadt Exp $   */
+/*     $OpenBSD: ip_input.c,v 1.17 1996/09/02 18:14:19 dm Exp $        */
 /*     $NetBSD: ip_input.c,v 1.30 1996/03/16 23:53:58 christos Exp $   */
 
 /*
@@ -182,6 +182,8 @@ ipintr()
        struct ipqent *ipqe;
        int hlen, mff, s;
 
+       if (needqueuedrain)
+               m_reclaim ();
 next:
        /*
         * Get next datagram off input queue and get IP header
index c18ff32..27c3e2b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mbuf.h,v 1.2 1996/03/03 12:12:00 niklas Exp $ */
+/*     $OpenBSD: mbuf.h,v 1.3 1996/09/02 18:14:21 dm Exp $     */
 /*     $NetBSD: mbuf.h,v 1.19 1996/02/09 18:25:14 christos Exp $       */
 
 /*
@@ -360,6 +360,8 @@ int max_protohdr;                   /* largest protocol header */
 int    max_hdr;                        /* largest link+protocol header */
 int    max_datalen;                    /* MHLEN - max_hdr */
 extern int mbtypes[];                  /* XXX */
+extern int needqueuedrain;             /* True if allocation failed at */
+                                       /* interrupt level */
 
 void   mbinit __P((void));
 struct mbuf *m_copym __P((struct mbuf *, int, int, int));