Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Dec 2013 11:59:06 -0800
From:      Adrian Chadd <adrian@freebsd.org>
To:        Gleb Smirnoff <glebius@freebsd.org>
Cc:        Jack F Vogel <jfv@freebsd.org>, Michael Tuexen <Michael.Tuexen@lurchi.franken.de>, Ryan Stone <rysto32@gmail.com>, freebsd-net <freebsd-net@freebsd.org>
Subject:   Re: Removing queue length check in ip_output (was Re: buf_ring in HEAD is racy)
Message-ID:  <CAJ-VmonYRb9jQKbXLuurQrrjaUzQcwiRze0O7g2A5s=KPBjDKw@mail.gmail.com>
In-Reply-To: <CAJ-Vmo=jCo-H8BwybFS3uaS3xQ4pxSz-hpxyEg0z2g3KSoErwQ@mail.gmail.com>
References:  <CAJ-VmomyPq_2K-MFhb7vt6MM7RBbmn7yaTzUXb7%2BN7TbW1RmHQ@mail.gmail.com> <20131219151606.GB71033@FreeBSD.org> <CAJ-Vmo=jCo-H8BwybFS3uaS3xQ4pxSz-hpxyEg0z2g3KSoErwQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
How's this?

Index: sys/netinet/ip_output.c
===================================================================
--- sys/netinet/ip_output.c     (revision 259474)
+++ sys/netinet/ip_output.c     (working copy)
@@ -123,7 +123,9 @@
        struct mbuf *m0;
        int hlen = sizeof (struct ip);
        int mtu;
+#if 0
        int n;  /* scratchpad */
+#endif
        int error = 0;
        struct sockaddr_in *dst;
        const struct sockaddr_in *gw;
@@ -431,6 +433,25 @@
        }

        /*
+        * Both in the SMP world, pre-emption world if_transmit() world,
+        * the following code doesn't really function as intended any further.
+        *
+        * + There can and will be multiple CPUs running this code path
+        *   in parallel, and we do no lock holding when checking the
+        *   queue depth;
+        * + And since other threads can be running concurrently, even if
+        *   we do pass this check, another thread may queue some frames
+        *   before this thread does and it will end up partially or fully
+        *   failing to send anyway;
+        * + if_transmit() based drivers don't necessarily set ifq_len
+        *   at all.
+        *
+        * This should be replaced with a method of pushing an entire list
+        * of fragment frames to the driver and have the driver decide
+        * whether it can queue or not queue the entire set.
+        */
+#if 0
+       /*
         * Verify that we have any chance at all of being able to queue the
         * packet or packet fragments, unless ALTQ is enabled on the given
         * interface in which case packetdrop should be done by queueing.
@@ -446,6 +467,7 @@
                ifp->if_snd.ifq_drops += n;
                goto bad;
        }
+#endif

        /*
         * Look for broadcast address and


-a



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-VmonYRb9jQKbXLuurQrrjaUzQcwiRze0O7g2A5s=KPBjDKw>