Skip to content

Commit

Permalink
tunnel: eliminate recursion field
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Eric Dumazet <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Eric Dumazet authored and davem330 committed Sep 24, 2009
1 parent edf42a2 commit a43912a
Show file tree
Hide file tree
Showing 5 changed files with 1 addition and 36 deletions.
1 change: 0 additions & 1 deletion include/net/ipip.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ struct ip_tunnel
struct 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 */

Expand Down
13 changes: 1 addition & 12 deletions net/ipv4/ip_gre.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -820,7 +812,6 @@ static netdev_tx_t ipgre_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)
Expand Down Expand Up @@ -888,7 +879,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
nf_reset(skb);

IPTUNNEL_XMIT();
tunnel->recursion--;
return NETDEV_TX_OK;

tx_error_icmp:
Expand All @@ -897,7 +887,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
tx_error:
stats->tx_errors++;
dev_kfree_skb(skb);
tunnel->recursion--;
return NETDEV_TX_OK;
}

Expand Down
8 changes: 0 additions & 8 deletions net/ipv4/ipip.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -523,15 +517,13 @@ 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:
dst_link_failure(skb);
tx_error:
stats->tx_errors++;
dev_kfree_skb(skb);
tunnel->recursion--;
return NETDEV_TX_OK;
}

Expand Down
7 changes: 0 additions & 7 deletions net/ipv6/ip6_tunnel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
}

Expand Down
8 changes: 0 additions & 8 deletions net/ipv6/sit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -794,15 +788,13 @@ 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:
dst_link_failure(skb);
tx_error:
stats->tx_errors++;
dev_kfree_skb(skb);
tunnel->recursion--;
return NETDEV_TX_OK;
}

Expand Down

0 comments on commit a43912a

Please sign in to comment.