]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.14.40/geneve-update-skb-dst-pmtu-on-tx-path.patch
Linux 4.14.95
[thirdparty/kernel/stable-queue.git] / releases / 4.14.40 / geneve-update-skb-dst-pmtu-on-tx-path.patch
1 From 52a589d51f1008f62569bf89e95b26221ee76690 Mon Sep 17 00:00:00 2001
2 From: Xin Long <lucien.xin@gmail.com>
3 Date: Mon, 25 Dec 2017 14:43:58 +0800
4 Subject: geneve: update skb dst pmtu on tx path
5
6 From: Xin Long <lucien.xin@gmail.com>
7
8 commit 52a589d51f1008f62569bf89e95b26221ee76690 upstream.
9
10 Commit a93bf0ff4490 ("vxlan: update skb dst pmtu on tx path") has fixed
11 a performance issue caused by the change of lower dev's mtu for vxlan.
12
13 The same thing needs to be done for geneve as well.
14
15 Note that geneve cannot adjust it's mtu according to lower dev's mtu
16 when creating it. The performance is very low later when netperfing
17 over it without fixing the mtu manually. This patch could also avoid
18 this issue.
19
20 Signed-off-by: Xin Long <lucien.xin@gmail.com>
21 Signed-off-by: David S. Miller <davem@davemloft.net>
22 Cc: Thomas Deutschmann <whissi@gentoo.org>
23 Cc: Eddie Chapman <eddie@ehuk.net>
24 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
25
26 ---
27 drivers/net/geneve.c | 14 ++++++++++++++
28 1 file changed, 14 insertions(+)
29
30 --- a/drivers/net/geneve.c
31 +++ b/drivers/net/geneve.c
32 @@ -825,6 +825,13 @@ static int geneve_xmit_skb(struct sk_buf
33 if (IS_ERR(rt))
34 return PTR_ERR(rt);
35
36 + if (skb_dst(skb)) {
37 + int mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr) -
38 + GENEVE_BASE_HLEN - info->options_len - 14;
39 +
40 + skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu);
41 + }
42 +
43 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
44 if (geneve->collect_md) {
45 tos = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
46 @@ -864,6 +871,13 @@ static int geneve6_xmit_skb(struct sk_bu
47 if (IS_ERR(dst))
48 return PTR_ERR(dst);
49
50 + if (skb_dst(skb)) {
51 + int mtu = dst_mtu(dst) - sizeof(struct ipv6hdr) -
52 + GENEVE_BASE_HLEN - info->options_len - 14;
53 +
54 + skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu);
55 + }
56 +
57 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
58 if (geneve->collect_md) {
59 prio = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);