diff options
author | Patrick McHardy <kaber@trash.net> | 2007-07-09 18:33:40 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-07-11 01:19:05 -0400 |
commit | cfbba49d80be6cf8d3872b66fc5421f119843b36 (patch) | |
tree | 2e2a966d43b6cd80c2ae7c8d5e37ab4c8a0262ad | |
parent | 4839c52b01ca91be1c62761e08fb3deb3881e857 (diff) |
[NET]: Avoid copying writable clones in tunnel drivers
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv4/ip_gre.c | 3 | ||||
-rw-r--r-- | net/ipv4/ipip.c | 3 | ||||
-rw-r--r-- | net/ipv6/ip6_tunnel.c | 4 | ||||
-rw-r--r-- | net/ipv6/sit.c | 3 |
4 files changed, 8 insertions, 5 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 63282934725e..5c14ed63e56c 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -809,7 +809,8 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
809 | 809 | ||
810 | max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen; | 810 | max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen; |
811 | 811 | ||
812 | if (skb_headroom(skb) < max_headroom || skb_cloned(skb) || skb_shared(skb)) { | 812 | if (skb_headroom(skb) < max_headroom || skb_shared(skb)|| |
813 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { | ||
813 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); | 814 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); |
814 | if (!new_skb) { | 815 | if (!new_skb) { |
815 | ip_rt_put(rt); | 816 | ip_rt_put(rt); |
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index ebd2f2d532f6..396437242a1b 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -595,7 +595,8 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
595 | */ | 595 | */ |
596 | max_headroom = (LL_RESERVED_SPACE(tdev)+sizeof(struct iphdr)); | 596 | max_headroom = (LL_RESERVED_SPACE(tdev)+sizeof(struct iphdr)); |
597 | 597 | ||
598 | if (skb_headroom(skb) < max_headroom || skb_cloned(skb) || skb_shared(skb)) { | 598 | if (skb_headroom(skb) < max_headroom || skb_shared(skb) || |
599 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { | ||
599 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); | 600 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); |
600 | if (!new_skb) { | 601 | if (!new_skb) { |
601 | ip_rt_put(rt); | 602 | ip_rt_put(rt); |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index a0902fbdb4e1..281aee42d3f0 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -883,8 +883,8 @@ static int ip6_tnl_xmit2(struct sk_buff *skb, | |||
883 | */ | 883 | */ |
884 | max_headroom += LL_RESERVED_SPACE(tdev); | 884 | max_headroom += LL_RESERVED_SPACE(tdev); |
885 | 885 | ||
886 | if (skb_headroom(skb) < max_headroom || | 886 | if (skb_headroom(skb) < max_headroom || skb_shared(skb) || |
887 | skb_cloned(skb) || skb_shared(skb)) { | 887 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { |
888 | struct sk_buff *new_skb; | 888 | struct sk_buff *new_skb; |
889 | 889 | ||
890 | if (!(new_skb = skb_realloc_headroom(skb, max_headroom))) | 890 | if (!(new_skb = skb_realloc_headroom(skb, max_headroom))) |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 1efa95a99f45..eb20bb690abd 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -532,7 +532,8 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
532 | */ | 532 | */ |
533 | max_headroom = LL_RESERVED_SPACE(tdev)+sizeof(struct iphdr); | 533 | max_headroom = LL_RESERVED_SPACE(tdev)+sizeof(struct iphdr); |
534 | 534 | ||
535 | if (skb_headroom(skb) < max_headroom || skb_cloned(skb) || skb_shared(skb)) { | 535 | if (skb_headroom(skb) < max_headroom || skb_shared(skb) || |
536 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { | ||
536 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); | 537 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); |
537 | if (!new_skb) { | 538 | if (!new_skb) { |
538 | ip_rt_put(rt); | 539 | ip_rt_put(rt); |