Skip to content

Commit 039f506

Browse files
Pravin B Shelardavem330
authored andcommitted
ip_tunnel: Move stats update to iptunnel_xmit()
By moving stats update into iptunnel_xmit(), we can simplify iptunnel_xmit() usage. With this change there is no need to call another function (iptunnel_xmit_stats()) to update stats in tunnel xmit code path. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent d7d3e25 commit 039f506

File tree

12 files changed

+56
-78
lines changed

12 files changed

+56
-78
lines changed

drivers/net/geneve.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -918,12 +918,11 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
918918
ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
919919
df = 0;
920920
}
921-
err = udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, fl4.saddr, fl4.daddr,
922-
tos, ttl, df, sport, geneve->dst_port,
923-
!net_eq(geneve->net, dev_net(geneve->dev)),
924-
!(flags & GENEVE_F_UDP_CSUM));
921+
udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, fl4.saddr, fl4.daddr,
922+
tos, ttl, df, sport, geneve->dst_port,
923+
!net_eq(geneve->net, dev_net(geneve->dev)),
924+
!(flags & GENEVE_F_UDP_CSUM));
925925

926-
iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
927926
return NETDEV_TX_OK;
928927

929928
tx_error:
@@ -1005,10 +1004,10 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
10051004
ttl = 1;
10061005
ttl = ttl ? : ip6_dst_hoplimit(dst);
10071006
}
1008-
err = udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev,
1009-
&fl6.saddr, &fl6.daddr, prio, ttl,
1010-
sport, geneve->dst_port,
1011-
!!(flags & GENEVE_F_UDP_ZERO_CSUM6_TX));
1007+
udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev,
1008+
&fl6.saddr, &fl6.daddr, prio, ttl,
1009+
sport, geneve->dst_port,
1010+
!!(flags & GENEVE_F_UDP_ZERO_CSUM6_TX));
10121011
return NETDEV_TX_OK;
10131012

10141013
tx_error:

drivers/net/vxlan.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,9 +1841,10 @@ static int vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *sk
18411841

18421842
skb_set_inner_protocol(skb, htons(ETH_P_TEB));
18431843

1844-
return udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos,
1845-
ttl, df, src_port, dst_port, xnet,
1846-
!(vxflags & VXLAN_F_UDP_CSUM));
1844+
udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos, ttl, df,
1845+
src_port, dst_port, xnet,
1846+
!(vxflags & VXLAN_F_UDP_CSUM));
1847+
return 0;
18471848
}
18481849

18491850
#if IS_ENABLED(CONFIG_IPV6)
@@ -2056,8 +2057,6 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
20562057
skb = NULL;
20572058
goto rt_tx_error;
20582059
}
2059-
2060-
iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
20612060
#if IS_ENABLED(CONFIG_IPV6)
20622061
} else {
20632062
struct dst_entry *ndst;

include/net/ip6_tunnel.h

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <linux/netdevice.h>
66
#include <linux/if_tunnel.h>
77
#include <linux/ip6_tunnel.h>
8+
#include <net/ip_tunnels.h>
89

910
#define IP6TUNNEL_ERR_TIMEO (30*HZ)
1011

@@ -83,22 +84,12 @@ int ip6_tnl_get_iflink(const struct net_device *dev);
8384
static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,
8485
struct net_device *dev)
8586
{
86-
struct net_device_stats *stats = &dev->stats;
8787
int pkt_len, err;
8888

8989
pkt_len = skb->len - skb_inner_network_offset(skb);
9090
err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb);
91-
92-
if (net_xmit_eval(err) == 0) {
93-
struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats);
94-
u64_stats_update_begin(&tstats->syncp);
95-
tstats->tx_bytes += pkt_len;
96-
tstats->tx_packets++;
97-
u64_stats_update_end(&tstats->syncp);
98-
put_cpu_ptr(tstats);
99-
} else {
100-
stats->tx_errors++;
101-
stats->tx_aborted_errors++;
102-
}
91+
if (unlikely(net_xmit_eval(err)))
92+
pkt_len = -1;
93+
iptunnel_xmit_stats(dev, pkt_len);
10394
}
10495
#endif

include/net/ip_tunnels.h

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -273,32 +273,34 @@ static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph,
273273
}
274274

275275
int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto);
276-
int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
277-
__be32 src, __be32 dst, u8 proto,
278-
u8 tos, u8 ttl, __be16 df, bool xnet);
276+
void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
277+
__be32 src, __be32 dst, u8 proto,
278+
u8 tos, u8 ttl, __be16 df, bool xnet);
279279
struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md,
280280
gfp_t flags);
281281

282282
struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, bool gre_csum,
283283
int gso_type_mask);
284284

285-
static inline void iptunnel_xmit_stats(int err,
286-
struct net_device_stats *err_stats,
287-
struct pcpu_sw_netstats __percpu *stats)
285+
static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len)
288286
{
289-
if (err > 0) {
290-
struct pcpu_sw_netstats *tstats = get_cpu_ptr(stats);
287+
if (pkt_len > 0) {
288+
struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats);
291289

292290
u64_stats_update_begin(&tstats->syncp);
293-
tstats->tx_bytes += err;
291+
tstats->tx_bytes += pkt_len;
294292
tstats->tx_packets++;
295293
u64_stats_update_end(&tstats->syncp);
296294
put_cpu_ptr(tstats);
297-
} else if (err < 0) {
298-
err_stats->tx_errors++;
299-
err_stats->tx_aborted_errors++;
300295
} else {
301-
err_stats->tx_dropped++;
296+
struct net_device_stats *err_stats = &dev->stats;
297+
298+
if (pkt_len < 0) {
299+
err_stats->tx_errors++;
300+
err_stats->tx_aborted_errors++;
301+
} else {
302+
err_stats->tx_dropped++;
303+
}
302304
}
303305
}
304306

include/net/udp_tunnel.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
7878
struct udp_tunnel_sock_cfg *sock_cfg);
7979

8080
/* Transmit the skb using UDP encapsulation. */
81-
int udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
82-
__be32 src, __be32 dst, __u8 tos, __u8 ttl,
83-
__be16 df, __be16 src_port, __be16 dst_port,
84-
bool xnet, bool nocheck);
81+
void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
82+
__be32 src, __be32 dst, __u8 tos, __u8 ttl,
83+
__be16 df, __be16 src_port, __be16 dst_port,
84+
bool xnet, bool nocheck);
8585

8686
#if IS_ENABLED(CONFIG_IPV6)
8787
int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,

net/ipv4/ip_gre.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -561,10 +561,9 @@ static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev)
561561
tunnel_id_to_key(tun_info->key.tun_id), 0);
562562

563563
df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
564-
err = iptunnel_xmit(skb->sk, rt, skb, fl.saddr,
565-
key->u.ipv4.dst, IPPROTO_GRE,
566-
key->tos, key->ttl, df, false);
567-
iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
564+
565+
iptunnel_xmit(skb->sk, rt, skb, fl.saddr, key->u.ipv4.dst, IPPROTO_GRE,
566+
key->tos, key->ttl, df, false);
568567
return;
569568

570569
err_free_rt:

net/ipv4/ip_tunnel.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,6 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
656656
struct rtable *rt; /* Route to the other host */
657657
unsigned int max_headroom; /* The extra header space needed */
658658
__be32 dst;
659-
int err;
660659
bool connected;
661660

662661
inner_iph = (const struct iphdr *)skb_inner_network_header(skb);
@@ -794,10 +793,8 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
794793
return;
795794
}
796795

797-
err = iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, protocol,
798-
tos, ttl, df, !net_eq(tunnel->net, dev_net(dev)));
799-
iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
800-
796+
iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, protocol, tos, ttl,
797+
df, !net_eq(tunnel->net, dev_net(dev)));
801798
return;
802799

803800
#if IS_ENABLED(CONFIG_IPV6)

net/ipv4/ip_tunnel_core.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,13 @@
4747
#include <net/rtnetlink.h>
4848
#include <net/dst_metadata.h>
4949

50-
int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
51-
__be32 src, __be32 dst, __u8 proto,
52-
__u8 tos, __u8 ttl, __be16 df, bool xnet)
50+
void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
51+
__be32 src, __be32 dst, __u8 proto,
52+
__u8 tos, __u8 ttl, __be16 df, bool xnet)
5353
{
5454
int pkt_len = skb->len - skb_inner_network_offset(skb);
5555
struct net *net = dev_net(rt->dst.dev);
56+
struct net_device *dev = skb->dev;
5657
struct iphdr *iph;
5758
int err;
5859

@@ -81,7 +82,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
8182
err = ip_local_out(net, sk, skb);
8283
if (unlikely(net_xmit_eval(err)))
8384
pkt_len = 0;
84-
return pkt_len;
85+
iptunnel_xmit_stats(dev, pkt_len);
8586
}
8687
EXPORT_SYMBOL_GPL(iptunnel_xmit);
8788

net/ipv4/ip_vti.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev,
199199
err = dst_output(tunnel->net, skb->sk, skb);
200200
if (net_xmit_eval(err) == 0)
201201
err = skb->len;
202-
iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
202+
iptunnel_xmit_stats(dev, err);
203203
return NETDEV_TX_OK;
204204

205205
tx_error_icmp:

net/ipv4/udp_tunnel.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
7474
}
7575
EXPORT_SYMBOL_GPL(setup_udp_tunnel_sock);
7676

77-
int udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
78-
__be32 src, __be32 dst, __u8 tos, __u8 ttl,
79-
__be16 df, __be16 src_port, __be16 dst_port,
80-
bool xnet, bool nocheck)
77+
void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
78+
__be32 src, __be32 dst, __u8 tos, __u8 ttl,
79+
__be16 df, __be16 src_port, __be16 dst_port,
80+
bool xnet, bool nocheck)
8181
{
8282
struct udphdr *uh;
8383

@@ -91,8 +91,7 @@ int udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
9191

9292
udp_set_csum(nocheck, skb, src, dst, skb->len);
9393

94-
return iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP,
95-
tos, ttl, df, xnet);
94+
iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, xnet);
9695
}
9796
EXPORT_SYMBOL_GPL(udp_tunnel_xmit_skb);
9897

net/ipv6/sit.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,6 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
820820
const struct in6_addr *addr6;
821821
int addr_type;
822822
u8 ttl;
823-
int err;
824823
u8 protocol = IPPROTO_IPV6;
825824
int t_hlen = tunnel->hlen + sizeof(struct iphdr);
826825

@@ -983,10 +982,8 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
983982

984983
skb_set_inner_ipproto(skb, IPPROTO_IPV6);
985984

986-
err = iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr,
987-
protocol, tos, ttl, df,
988-
!net_eq(tunnel->net, dev_net(dev)));
989-
iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
985+
iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, protocol, tos, ttl,
986+
df, !net_eq(tunnel->net, dev_net(dev)));
990987
return NETDEV_TX_OK;
991988

992989
tx_error_icmp:

net/tipc/udp_media.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,9 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
182182
goto tx_error;
183183
}
184184
ttl = ip4_dst_hoplimit(&rt->dst);
185-
err = udp_tunnel_xmit_skb(rt, ub->ubsock->sk, skb,
186-
src->ipv4.s_addr,
187-
dst->ipv4.s_addr, 0, ttl, 0,
188-
src->udp_port, dst->udp_port,
189-
false, true);
190-
if (err < 0) {
191-
ip_rt_put(rt);
192-
goto tx_error;
193-
}
185+
udp_tunnel_xmit_skb(rt, ub->ubsock->sk, skb, src->ipv4.s_addr,
186+
dst->ipv4.s_addr, 0, ttl, 0, src->udp_port,
187+
dst->udp_port, false, true);
194188
#if IS_ENABLED(CONFIG_IPV6)
195189
} else {
196190
struct dst_entry *ndst;

0 commit comments

Comments
 (0)