]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[netdevice] Process all received packets in net_poll()
authorMichael Brown <mcb30@ipxe.org>
Sun, 1 Jul 2012 21:47:06 +0000 (22:47 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 4 Jul 2012 12:41:49 +0000 (13:41 +0100)
The current logic is to process at most one received packet per call
to net_poll(), on the basis that refilling the hardware descriptor
ring should be delayed as little as possible.  However, this limits
the rate at which packets can be processed and ultimately ends up
adding latency which, in turn, limits the achievable throughput.

With temporary modifications in place to essentially remove all
resource constraints (heap size increased to 16MB, RX descriptor ring
increased to 64 descriptors) and a TCP window size of 1MB, the
throughput on a gigabit (i.e. 119MBps) network can be observed to fall
off exponentially from around 115MBps to around 75MBps.  Changing
net_poll() to process all received packets results in a steady
119MBps throughput.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/netdevice.c

index b9b1337a1620d7fd1bf94dacea8890a4ae717fd9..6afe2d5f5fad3e91e49e95463c24b21dc6b849fa 100644 (file)
@@ -750,13 +750,8 @@ void net_poll ( void ) {
                if ( netdev_rx_frozen ( netdev ) )
                        continue;
 
-               /* Process at most one received packet.  Give priority
-                * to getting packets out of the NIC over processing
-                * the received packets, because we advertise a window
-                * that assumes that we can receive packets from the
-                * NIC faster than they arrive.
-                */
-               if ( ( iobuf = netdev_rx_dequeue ( netdev ) ) ) {
+               /* Process all received packets */
+               while ( ( iobuf = netdev_rx_dequeue ( netdev ) ) ) {
 
                        DBGC2 ( netdev, "NETDEV %s processing %p (%p+%zx)\n",
                                netdev->name, iobuf, iobuf->data,