| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | From 9cbfea02c1dbee0afb9128f065e6e793672b9ff7 Mon Sep 17 00:00:00 2001 | 
|  | 2 | From: Sieng Piaw Liew <liew.s.piaw@gmail.com> | 
|  | 3 | Date: Wed, 6 Jan 2021 22:42:02 +0800 | 
|  | 4 | Subject: [PATCH 1/7] bcm63xx_enet: batch process rx path | 
|  | 5 |  | 
|  | 6 | Use netif_receive_skb_list to batch process rx skb. | 
|  | 7 | Tested on BCM6328 320 MHz using iperf3 -M 512, increasing performance | 
|  | 8 | by 12.5%. | 
|  | 9 |  | 
|  | 10 | Before: | 
|  | 11 | [ ID] Interval           Transfer     Bandwidth       Retr | 
|  | 12 | [  4]   0.00-30.00  sec   120 MBytes  33.7 Mbits/sec  277         sender | 
|  | 13 | [  4]   0.00-30.00  sec   120 MBytes  33.5 Mbits/sec            receiver | 
|  | 14 |  | 
|  | 15 | After: | 
|  | 16 | [ ID] Interval           Transfer     Bandwidth       Retr | 
|  | 17 | [  4]   0.00-30.00  sec   136 MBytes  37.9 Mbits/sec  203         sender | 
|  | 18 | [  4]   0.00-30.00  sec   135 MBytes  37.7 Mbits/sec            receiver | 
|  | 19 |  | 
|  | 20 | Signed-off-by: Sieng Piaw Liew <liew.s.piaw@gmail.com> | 
|  | 21 | Acked-by: Florian Fainelli <f.fainelli@gmail.com> | 
|  | 22 | Signed-off-by: Jakub Kicinski <kuba@kernel.org> | 
|  | 23 | --- | 
|  | 24 | drivers/net/ethernet/broadcom/bcm63xx_enet.c | 6 +++++- | 
|  | 25 | 1 file changed, 5 insertions(+), 1 deletion(-) | 
|  | 26 |  | 
|  | 27 | --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c | 
|  | 28 | +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c | 
|  | 29 | @@ -298,10 +298,12 @@ static void bcm_enet_refill_rx_timer(str | 
|  | 30 | static int bcm_enet_receive_queue(struct net_device *dev, int budget) | 
|  | 31 | { | 
|  | 32 | struct bcm_enet_priv *priv; | 
|  | 33 | +	struct list_head rx_list; | 
|  | 34 | struct device *kdev; | 
|  | 35 | int processed; | 
|  | 36 |  | 
|  | 37 | priv = netdev_priv(dev); | 
|  | 38 | +	INIT_LIST_HEAD(&rx_list); | 
|  | 39 | kdev = &priv->pdev->dev; | 
|  | 40 | processed = 0; | 
|  | 41 |  | 
|  | 42 | @@ -392,10 +394,12 @@ static int bcm_enet_receive_queue(struct | 
|  | 43 | skb->protocol = eth_type_trans(skb, dev); | 
|  | 44 | dev->stats.rx_packets++; | 
|  | 45 | dev->stats.rx_bytes += len; | 
|  | 46 | -		netif_receive_skb(skb); | 
|  | 47 | +		list_add_tail(&skb->list, &rx_list); | 
|  | 48 |  | 
|  | 49 | } while (--budget > 0); | 
|  | 50 |  | 
|  | 51 | +	netif_receive_skb_list(&rx_list); | 
|  | 52 | + | 
|  | 53 | if (processed || !priv->rx_desc_count) { | 
|  | 54 | bcm_enet_refill_rx(dev); | 
|  | 55 |  |