mv643xx_eth: avoid reading ->byte_cnt twice during receive processing
authorLennert Buytenhek <buytenh@wantstofly.org>
Sun, 14 Sep 2008 13:50:32 +0000 (15:50 +0200)
committerLennert Buytenhek <buytenh@marvell.com>
Sun, 14 Sep 2008 13:53:28 +0000 (15:53 +0200)
Currently, the receive processing reads ->byte_cnt twice (once to
update interface statistics and once to properly size the data area
of the received skb), but since receive descriptors live in uncached
memory, caching this value in a local variable saves one uncached
access, and increases routing performance a tiny little bit more.

Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
drivers/net/mv643xx_eth.c

index 4fbd62e45ae9c1b67f56faa947b41e1474cf2c0a..6564be122acf9d1063bb9d6db03baa2e18f2f453 100644 (file)
@@ -477,6 +477,7 @@ static int rxq_process(struct rx_queue *rxq, int budget)
                struct rx_desc *rx_desc;
                unsigned int cmd_sts;
                struct sk_buff *skb;
+               u16 byte_cnt;
 
                rx_desc = &rxq->rx_desc_area[rxq->rx_curr_desc];
 
@@ -499,6 +500,8 @@ static int rxq_process(struct rx_queue *rxq, int budget)
 
                mp->work_rx_refill |= 1 << rxq->index;
 
+               byte_cnt = rx_desc->byte_cnt;
+
                /*
                 * Update statistics.
                 *
@@ -508,7 +511,7 @@ static int rxq_process(struct rx_queue *rxq, int budget)
                 * byte CRC at the end of the packet (which we do count).
                 */
                stats->rx_packets++;
-               stats->rx_bytes += rx_desc->byte_cnt - 2;
+               stats->rx_bytes += byte_cnt - 2;
 
                /*
                 * In case we received a packet without first / last bits
@@ -537,7 +540,7 @@ static int rxq_process(struct rx_queue *rxq, int budget)
                         * The -4 is for the CRC in the trailer of the
                         * received packet
                         */
-                       skb_put(skb, rx_desc->byte_cnt - 2 - 4);
+                       skb_put(skb, byte_cnt - 2 - 4);
 
                        if (cmd_sts & LAYER_4_CHECKSUM_OK) {
                                skb->ip_summed = CHECKSUM_UNNECESSARY;