From: Christoph Paasch Date: Thu, 15 Aug 2024 16:12:01 +0000 (-0700) Subject: mpls: Reduce skb re-allocations due to skb_cow() X-Git-Tag: v6.12-rc1~232^2~235 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f4ae8420f6ebdabf97e0c4f5f99412768687985f;p=thirdparty%2Fkernel%2Flinux.git mpls: Reduce skb re-allocations due to skb_cow() 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 Reported-by: Craig Taylor Signed-off-by: Christoph Paasch Reviewed-by: Simon Horman Link: https://patch.msgid.link/20240815161201.22021-1-cpaasch@apple.com Signed-off-by: Jakub Kicinski --- diff --git a/net/mpls/mpls_iptunnel.c b/net/mpls/mpls_iptunnel.c index 4385fd3b13be3..6e73da94af7fb 100644 --- a/net/mpls/mpls_iptunnel.c +++ b/net/mpls/mpls_iptunnel.c @@ -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);