tunnel: eliminate recursion field
Subsystems (3)
PATCH 1/1 tunnel: eliminate recursion field
It seems recursion field from "struct ip_tunnel" is not anymore needed. recursion prevention is done at the upper level (in dev_queue_xmit()), since we use HARD_TX_LOCK protection for tunnels.
This avoids a cache line ping pong on "struct ip_tunnel" : This structure should be now mostly read on xmit and receive paths.
--- include/net/ipip.h | 1 - net/ipv4/ip_gre.c | 13 +------------ net/ipv4/ipip.c | 8 -------- 3 files changed, 1 insertion(+), 21 deletions(-)
include/net/ipip.h +0 -1
@@ -12,7 +12,6 @@ struct ip_tunnelstruct ip_tunnel *next;struct net_device *dev; -int recursion;/* Depth of hard_start_xmit recursion */ int err_count;/* Number of arrived ICMP errors */ unsigned long err_time;/* Time when the last ICMP error arrived */
net/ipv4/ip_gre.c +1 -12
@@ -66,10 +66,7 @@ solution, but it supposes maintaing new variable in ALL skb, even if no tunneling is used. - Current solution: t->recursion lock breaks dead loops. It looks - like dev->tbusy flag, but I preferred new variable, because - the semantics is different. One day, when hard_start_xmit - will be multithreaded we will have to use skb->encapsulation. + Current solution: HARD_TX_LOCK lock breaks dead loops.
@@ -678,11 +675,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev__be32 dst;int mtu; -if (tunnel->recursion++) { - stats->collisions++; - goto tx_error; - } -if (dev->type ==ARPHRD_ETHER )IPCB (skb)->flags =0 ;
@@ -820,7 +812,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *devip_rt_put (rt); stats->tx_dropped++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }if (skb->sk)
@@ -888,7 +879,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *devnf_reset (skb);IPTUNNEL_XMIT (); - tunnel->recursion--;return NETDEV_TX_OK ; tx_error_icmp:
@@ -897,7 +887,6 @@ tx_error_icmp: tx_error: stats->tx_errors++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }
net/ipv4/ipip.c +0 -8
@@ -402,11 +402,6 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)__be32 dst = tiph->daddr;int mtu; -if (tunnel->recursion++) { - stats->collisions++; - goto tx_error; - } -if (skb->protocol !=htons (ETH_P_IP )) goto tx_error;
@@ -485,7 +480,6 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)ip_rt_put (rt); stats->tx_dropped++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }if (skb->sk)
@@ -523,7 +517,6 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)nf_reset (skb);IPTUNNEL_XMIT (); - tunnel->recursion--;return NETDEV_TX_OK ; tx_error_icmp:
@@ -531,7 +524,6 @@ tx_error_icmp: tx_error: stats->tx_errors++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }
Quoted 6 lines · Eric Dumazet
It seems recursion field from "struct
ip_tunnel" is not anymore needed. recursion prevention is done at the upper level (indev_queue_xmit()), since we useHARD_TX_LOCKprotection for tunnels.This avoids a cache line ping pong on "struct
ip_tunnel" : This structure should be now mostly read on xmit and receive paths.
Oops I forgot ipv6 tunnels, silly me, here is an updated version.
Thanks
[PATCH] tunnel: eliminate recursion field
It seems recursion field from "struct ip_tunnel" is not anymore needed. recursion prevention is done at the upper level (in dev_queue_xmit()), since we use HARD_TX_LOCK protection for tunnels.
This avoids a cache line ping pong on "struct ip_tunnel" : This structure should be now mostly read on xmit and receive paths.
--- include/net/ipip.h | 1 - net/ipv4/ip_gre.c | 13 +------------ net/ipv4/ipip.c | 8 -------- net/ipv6/ip6_tunnel.c | 7 ------- net/ipv6/sit.c | 8 -------- 5 files changed, 1 insertion(+), 36 deletions(-)
include/net/ipip.h +0 -1
@@ -12,7 +12,6 @@ struct ip_tunnelstruct ip_tunnel *next;struct net_device *dev; -int recursion;/* Depth of hard_start_xmit recursion */ int err_count;/* Number of arrived ICMP errors */ unsigned long err_time;/* Time when the last ICMP error arrived */
net/ipv4/ip_gre.c +1 -12
@@ -66,10 +66,7 @@ solution, but it supposes maintaing new variable in ALL skb, even if no tunneling is used. - Current solution: t->recursion lock breaks dead loops. It looks - like dev->tbusy flag, but I preferred new variable, because - the semantics is different. One day, when hard_start_xmit - will be multithreaded we will have to use skb->encapsulation. + Current solution: HARD_TX_LOCK lock breaks dead loops.
@@ -678,11 +675,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev__be32 dst;int mtu; -if (tunnel->recursion++) { - stats->collisions++; - goto tx_error; - } -if (dev->type ==ARPHRD_ETHER )IPCB (skb)->flags =0 ;
@@ -820,7 +812,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *devip_rt_put (rt); stats->tx_dropped++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }if (skb->sk)
@@ -888,7 +879,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *devnf_reset (skb);IPTUNNEL_XMIT (); - tunnel->recursion--;return NETDEV_TX_OK ; tx_error_icmp:
@@ -897,7 +887,6 @@ tx_error_icmp: tx_error: stats->tx_errors++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }
net/ipv4/ipip.c +0 -8
@@ -402,11 +402,6 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)__be32 dst = tiph->daddr;int mtu; -if (tunnel->recursion++) { - stats->collisions++; - goto tx_error; - } -if (skb->protocol !=htons (ETH_P_IP )) goto tx_error;
@@ -485,7 +480,6 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)ip_rt_put (rt); stats->tx_dropped++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }if (skb->sk)
@@ -523,7 +517,6 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)nf_reset (skb);IPTUNNEL_XMIT (); - tunnel->recursion--;return NETDEV_TX_OK ; tx_error_icmp:
@@ -531,7 +524,6 @@ tx_error_icmp: tx_error: stats->tx_errors++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }
net/ipv6/ip6_tunnel.c +0 -7
@@ -1043,11 +1043,6 @@ ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)struct net_device_stats *stats = &t->dev->stats;int ret; -if (t->recursion++) { - stats->collisions++; - goto tx_err; - } -switch (skb->protocol) {case htons (ETH_P_IP ): ret =ip4ip6_tnl_xmit (skb, dev);
@@ -1062,14 +1057,12 @@ ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)if (ret <0 ) goto tx_err; - t->recursion--;return NETDEV_TX_OK ; tx_err: stats->tx_errors++; stats->tx_dropped++;kfree_skb (skb); - t->recursion--;return NETDEV_TX_OK ; }
net/ipv6/sit.c +0 -8
@@ -626,11 +626,6 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,struct in6_addr *addr6;int addr_type; -if (tunnel->recursion++) { - stats->collisions++; - goto tx_error; - } -if (skb->protocol !=htons (ETH_P_IPV6 )) goto tx_error;
@@ -753,7 +748,6 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,ip_rt_put (rt); stats->tx_dropped++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }if (skb->sk)
@@ -794,7 +788,6 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,nf_reset (skb);IPTUNNEL_XMIT (); - tunnel->recursion--;return NETDEV_TX_OK ; tx_error_icmp:
@@ -802,7 +795,6 @@ tx_error_icmp: tx_error: stats->tx_errors++;dev_kfree_skb (skb); - tunnel->recursion--;return NETDEV_TX_OK ; }
From: Eric Dumazet <[email protected]>
Date: Wed, 23 Sep 2009 22:28:33 +0200
Quoted 14 lines
Quoted 6 lines · Eric Dumazet
It seems recursion field from "struct
ip_tunnel" is not anymore needed. recursion prevention is done at the upper level (indev_queue_xmit()), since we useHARD_TX_LOCKprotection for tunnels.This avoids a cache line ping pong on "struct
ip_tunnel" : This structure should be now mostly read on xmit and receive paths.Oops I forgot ipv6 tunnels, silly me, here is an updated version.
Thanks
[PATCH] tunnel: eliminate recursion field
Quoted 8 lines
It seems recursion field from "struct
ip_tunnel" is not anymore needed. recursion prevention is done at the upper level (indev_queue_xmit()), since we useHARD_TX_LOCKprotection for tunnels.This avoids a cache line ping pong on "struct
ip_tunnel" : This structure should be now mostly read on xmit and receive paths.Signed-off-by Eric Dumazet <[email protected]>
Applied.
Quoted 3 lines · Eric Dumazet
It seems recursion field from "struct
ip_tunnel" is not anymore needed. recursion prevention is done at the upper level (indev_queue_xmit()), since we useHARD_TX_LOCKprotection for tunnels.
What if we get async processing in between, e.g., nf_queue? In that case we could end up with a packet that went round and around until it exceeded the MTU.
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt