Patch "net: slightly optimize eth_type_trans" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: slightly optimize eth_type_trans

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-slightly-optimize-eth_type_trans.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit bd6ac739b17bc821e48f4d5e85249cf94fceab29
Author: Li RongQing <lirongqing@xxxxxxxxx>
Date:   Tue Nov 13 09:34:31 2018 +0800

    net: slightly optimize eth_type_trans
    
    [ Upstream commit 45cf7959c30402d7c4ea43568a6f1bab0ba6ca63 ]
    
    netperf udp stream shows that eth_type_trans takes certain cpu,
    so adjust the mac address check order, and firstly check if it
    is device address, and only check if it is multicast address
    only if not the device address.
    
    After this change:
    To unicast, and skb dst mac is device mac, this is most of time
    reduce a comparision
    To unicast, and skb dst mac is not device mac, nothing change
    To multicast, increase a comparision
    
    Before:
    1.03%  [kernel]          [k] eth_type_trans
    
    After:
    0.78%  [kernel]          [k] eth_type_trans
    
    Signed-off-by: Zhang Yu <zhangyu31@xxxxxxxxx>
    Signed-off-by: Li RongQing <lirongqing@xxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Stable-dep-of: 6e159fd653d7 ("ethernet: Add helper for assigning packet type when dest address does not match device address")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c
index ca06e9a53d15c..88a074dd983e6 100644
--- a/net/ethernet/eth.c
+++ b/net/ethernet/eth.c
@@ -165,15 +165,17 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
 	eth = (struct ethhdr *)skb->data;
 	skb_pull_inline(skb, ETH_HLEN);
 
-	if (unlikely(is_multicast_ether_addr_64bits(eth->h_dest))) {
-		if (ether_addr_equal_64bits(eth->h_dest, dev->broadcast))
-			skb->pkt_type = PACKET_BROADCAST;
-		else
-			skb->pkt_type = PACKET_MULTICAST;
+	if (unlikely(!ether_addr_equal_64bits(eth->h_dest,
+					      dev->dev_addr))) {
+		if (unlikely(is_multicast_ether_addr_64bits(eth->h_dest))) {
+			if (ether_addr_equal_64bits(eth->h_dest, dev->broadcast))
+				skb->pkt_type = PACKET_BROADCAST;
+			else
+				skb->pkt_type = PACKET_MULTICAST;
+		} else {
+			skb->pkt_type = PACKET_OTHERHOST;
+		}
 	}
-	else if (unlikely(!ether_addr_equal_64bits(eth->h_dest,
-						   dev->dev_addr)))
-		skb->pkt_type = PACKET_OTHERHOST;
 
 	/*
 	 * Some variants of DSA tagging don't have an ethertype field




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux