sh_eth: Optimization for RX excess judgement
authorMitsuhiro Kimura <mitsuhiro.kimura.kc@renesas.com>
Tue, 9 Dec 2014 12:23:42 +0000 (21:23 +0900)
committerDavid S. Miller <davem@davemloft.net>
Tue, 9 Dec 2014 23:05:08 +0000 (18:05 -0500)
Both of 'boguscnt' and 'quota' have nearly meaning as the condition of
the reception loop.
In order to cut down redundant processing, this patch changes excess
judgement.

Signed-off-by: Mitsuhiro Kimura <mitsuhiro.kimura.kc@renesas.com>
Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/renesas/sh_eth.c

index 71f59ee513046defd7f4334c13c9a2675cac0af7..e77025915b235cff096fadb60f61d38d6d2da638 100644 (file)
@@ -1395,10 +1395,13 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
 
        int entry = mdp->cur_rx % mdp->num_rx_ring;
        int boguscnt = (mdp->dirty_rx + mdp->num_rx_ring) - mdp->cur_rx;
+       int limit;
        struct sk_buff *skb;
        u16 pkt_len = 0;
        u32 desc_status;
 
+       boguscnt = min(boguscnt, *quota);
+       limit = boguscnt;
        rxdesc = &mdp->rx_ring[entry];
        while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) {
                desc_status = edmac_to_cpu(mdp, rxdesc->status);
@@ -1407,11 +1410,6 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
                if (--boguscnt < 0)
                        break;
 
-               if (*quota <= 0)
-                       break;
-
-               (*quota)--;
-
                if (!(desc_status & RDFEND))
                        ndev->stats.rx_length_errors++;
 
@@ -1502,6 +1500,8 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
                sh_eth_write(ndev, EDRRR_R, EDRRR);
        }
 
+       *quota -= limit - boguscnt - 1;
+
        return *quota <= 0;
 }