diff options
author | Christoph Paasch <cpaasch@apple.com> | 2024-08-15 09:12:01 -0700 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2024-08-16 17:53:49 -0700 |
commit | f4ae8420f6ebdabf97e0c4f5f99412768687985f (patch) | |
tree | 83c016cf129805a11a6e0024fd99f631604fed5c /net/mpls | |
parent | 1c66df862561a11a8ea9b4c97ecfe91983c3bda7 (diff) | |
download | linux-f4ae8420f6ebdabf97e0c4f5f99412768687985f.tar.gz linux-f4ae8420f6ebdabf97e0c4f5f99412768687985f.tar.bz2 linux-f4ae8420f6ebdabf97e0c4f5f99412768687985f.zip |
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 <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>
Diffstat (limited to 'net/mpls')
-rw-r--r-- | net/mpls/mpls_iptunnel.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/mpls/mpls_iptunnel.c b/net/mpls/mpls_iptunnel.c index 4385fd3b13be..6e73da94af7f 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); |