]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mpls: Reduce skb re-allocations due to skb_cow()
authorChristoph Paasch <cpaasch@apple.com>
Thu, 15 Aug 2024 16:12:01 +0000 (09:12 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 17 Aug 2024 00:53:49 +0000 (17:53 -0700)
mpls_xmit() needs to prepend the MPLS-labels to the packet. That implies
one needs to make sure there is enough space for it in the headers.

Calling skb_cow() implies however that one wants to change even the
playload part of the packet (which is not true for MPLS). Thus, call
skb_cow_head() instead, which is what other tunnelling protocols do.

Running a server with this comm it entirely removed the calls to
pskb_expand_head() from the callstack in mpls_xmit() thus having
significant CPU-reduction, especially at peak times.

Cc: Roopa Prabhu <roopa@nvidia.com>
Reported-by: Craig Taylor <cmtaylor@apple.com>
Signed-off-by: Christoph Paasch <cpaasch@apple.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20240815161201.22021-1-cpaasch@apple.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mpls/mpls_iptunnel.c

index 4385fd3b13be30f94b730e3c9b87936aacbbabd0..6e73da94af7fba2da61567f97d6cc4bae55b3a5d 100644 (file)
@@ -106,7 +106,7 @@ static int mpls_xmit(struct sk_buff *skb)
                hh_len = 0;
 
        /* Ensure there is enough space for the headers in the skb */
-       if (skb_cow(skb, hh_len + new_header_size))
+       if (skb_cow_head(skb, hh_len + new_header_size))
                goto drop;
 
        skb_set_inner_protocol(skb, skb->protocol);