Home Home > GIT Browse > SLE15-AZURE
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Kubecek <mkubecek@suse.cz>2019-02-14 14:04:44 +0100
committerMichal Kubecek <mkubecek@suse.cz>2019-02-14 18:06:20 +0100
commit37e2cdea53e5df0966e57208241aec1862bbabf4 (patch)
treea7d75a0b3af2ebe359195b3287e847158049c07b
parente5f835f04952a8caf9d088a1f785425e00a7a4b4 (diff)
ipv4: speedup ipv6 tunnels dismantle (bsc#1122982).
-rw-r--r--patches.fixes/ipv4-speedup-ipv6-tunnels-dismantle.patch172
-rw-r--r--series.conf1
2 files changed, 173 insertions, 0 deletions
diff --git a/patches.fixes/ipv4-speedup-ipv6-tunnels-dismantle.patch b/patches.fixes/ipv4-speedup-ipv6-tunnels-dismantle.patch
new file mode 100644
index 0000000000..300be82840
--- /dev/null
+++ b/patches.fixes/ipv4-speedup-ipv6-tunnels-dismantle.patch
@@ -0,0 +1,172 @@
+From: Eric Dumazet <edumazet@google.com>
+Date: Tue, 19 Sep 2017 16:27:09 -0700
+Subject: ipv4: speedup ipv6 tunnels dismantle
+Patch-mainline: v4.15-rc1
+Git-commit: 64bc17811b72758753e2b64cd8f2a63812c61fe1
+References: bsc#1122982
+
+Implement exit_batch() method to dismantle more devices
+per round.
+
+(rtnl_lock() ...
+ unregister_netdevice_many() ...
+ rtnl_unlock())
+
+Tested:
+$ cat add_del_unshare.sh
+for i in `seq 1 40`
+do
+ (for j in `seq 1 100` ; do unshare -n /bin/true >/dev/null ; done) &
+done
+wait ; grep net_namespace /proc/slabinfo
+
+Before patch :
+$ time ./add_del_unshare.sh
+net_namespace 126 282 5504 1 2 : tunables 8 4 0 : slabdata 126 282 0
+
+real 1m38.965s
+user 0m0.688s
+sys 0m37.017s
+
+After patch:
+$ time ./add_del_unshare.sh
+net_namespace 135 291 5504 1 2 : tunables 8 4 0 : slabdata 135 291 0
+
+real 0m22.117s
+user 0m0.728s
+sys 0m35.328s
+
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Acked-by: Michal Kubecek <mkubecek@suse.cz>
+
+---
+ include/net/ip_tunnels.h | 3 ++-
+ net/ipv4/ip_gre.c | 14 ++++++--------
+ net/ipv4/ip_tunnel.c | 12 +++++++++---
+ net/ipv4/ip_vti.c | 7 +++----
+ net/ipv4/ipip.c | 7 +++----
+ 5 files changed, 23 insertions(+), 20 deletions(-)
+
+--- a/include/net/ip_tunnels.h
++++ b/include/net/ip_tunnels.h
+@@ -253,7 +253,8 @@ int ip_tunnel_get_iflink(const struct net_device *dev);
+ int ip_tunnel_init_net(struct net *net, unsigned int ip_tnl_net_id,
+ struct rtnl_link_ops *ops, char *devname);
+
+-void ip_tunnel_delete_net(struct ip_tunnel_net *itn, struct rtnl_link_ops *ops);
++void ip_tunnel_delete_nets(struct list_head *list_net, unsigned int id,
++ struct rtnl_link_ops *ops);
+
+ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
+ const struct iphdr *tnl_params, const u8 protocol);
+--- a/net/ipv4/ip_gre.c
++++ b/net/ipv4/ip_gre.c
+@@ -763,15 +763,14 @@ static int __net_init ipgre_init_net(struct net *net)
+ return ip_tunnel_init_net(net, ipgre_net_id, &ipgre_link_ops, NULL);
+ }
+
+-static void __net_exit ipgre_exit_net(struct net *net)
++static void __net_exit ipgre_exit_batch_net(struct list_head *list_net)
+ {
+- struct ip_tunnel_net *itn = net_generic(net, ipgre_net_id);
+- ip_tunnel_delete_net(itn, &ipgre_link_ops);
++ ip_tunnel_delete_nets(list_net, ipgre_net_id, &ipgre_link_ops);
+ }
+
+ static struct pernet_operations ipgre_net_ops = {
+ .init = ipgre_init_net,
+- .exit = ipgre_exit_net,
++ .exit_batch = ipgre_exit_batch_net,
+ .id = &ipgre_net_id,
+ .size = sizeof(struct ip_tunnel_net),
+ };
+@@ -1185,15 +1184,14 @@ static int __net_init ipgre_tap_init_net(struct net *net)
+ return ip_tunnel_init_net(net, gre_tap_net_id, &ipgre_tap_ops, "gretap0");
+ }
+
+-static void __net_exit ipgre_tap_exit_net(struct net *net)
++static void __net_exit ipgre_tap_exit_batch_net(struct list_head *list_net)
+ {
+- struct ip_tunnel_net *itn = net_generic(net, gre_tap_net_id);
+- ip_tunnel_delete_net(itn, &ipgre_tap_ops);
++ ip_tunnel_delete_nets(list_net, gre_tap_net_id, &ipgre_tap_ops);
+ }
+
+ static struct pernet_operations ipgre_tap_net_ops = {
+ .init = ipgre_tap_init_net,
+- .exit = ipgre_tap_exit_net,
++ .exit_batch = ipgre_tap_exit_batch_net,
+ .id = &gre_tap_net_id,
+ .size = sizeof(struct ip_tunnel_net),
+ };
+--- a/net/ipv4/ip_tunnel.c
++++ b/net/ipv4/ip_tunnel.c
+@@ -1071,16 +1071,22 @@ static void ip_tunnel_destroy(struct ip_tunnel_net *itn, struct list_head *head,
+ }
+ }
+
+-void ip_tunnel_delete_net(struct ip_tunnel_net *itn, struct rtnl_link_ops *ops)
++void ip_tunnel_delete_nets(struct list_head *net_list, unsigned int id,
++ struct rtnl_link_ops *ops)
+ {
++ struct ip_tunnel_net *itn;
++ struct net *net;
+ LIST_HEAD(list);
+
+ rtnl_lock();
+- ip_tunnel_destroy(itn, &list, ops);
++ list_for_each_entry(net, net_list, exit_list) {
++ itn = net_generic(net, id);
++ ip_tunnel_destroy(itn, &list, ops);
++ }
+ unregister_netdevice_many(&list);
+ rtnl_unlock();
+ }
+-EXPORT_SYMBOL_GPL(ip_tunnel_delete_net);
++EXPORT_SYMBOL_GPL(ip_tunnel_delete_nets);
+
+ int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
+ struct ip_tunnel_parm *p, __u32 fwmark)
+--- a/net/ipv4/ip_vti.c
++++ b/net/ipv4/ip_vti.c
+@@ -452,15 +452,14 @@ static int __net_init vti_init_net(struct net *net)
+ return 0;
+ }
+
+-static void __net_exit vti_exit_net(struct net *net)
++static void __net_exit vti_exit_batch_net(struct list_head *list_net)
+ {
+- struct ip_tunnel_net *itn = net_generic(net, vti_net_id);
+- ip_tunnel_delete_net(itn, &vti_link_ops);
++ ip_tunnel_delete_nets(list_net, vti_net_id, &vti_link_ops);
+ }
+
+ static struct pernet_operations vti_net_ops = {
+ .init = vti_init_net,
+- .exit = vti_exit_net,
++ .exit_batch = vti_exit_batch_net,
+ .id = &vti_net_id,
+ .size = sizeof(struct ip_tunnel_net),
+ };
+--- a/net/ipv4/ipip.c
++++ b/net/ipv4/ipip.c
+@@ -658,15 +658,14 @@ static int __net_init ipip_init_net(struct net *net)
+ return ip_tunnel_init_net(net, ipip_net_id, &ipip_link_ops, "tunl0");
+ }
+
+-static void __net_exit ipip_exit_net(struct net *net)
++static void __net_exit ipip_exit_batch_net(struct list_head *list_net)
+ {
+- struct ip_tunnel_net *itn = net_generic(net, ipip_net_id);
+- ip_tunnel_delete_net(itn, &ipip_link_ops);
++ ip_tunnel_delete_nets(list_net, ipip_net_id, &ipip_link_ops);
+ }
+
+ static struct pernet_operations ipip_net_ops = {
+ .init = ipip_init_net,
+- .exit = ipip_exit_net,
++ .exit_batch = ipip_exit_batch_net,
+ .id = &ipip_net_id,
+ .size = sizeof(struct ip_tunnel_net),
+ };
diff --git a/series.conf b/series.conf
index 460300ed58..b6f9207245 100644
--- a/series.conf
+++ b/series.conf
@@ -8769,6 +8769,7 @@
patches.fixes/ipv6-addrlabel-per-netns-list.patch
patches.fixes/tcp-batch-tcp_net_metrics_exit.patch
patches.fixes/ipv6-speedup-ipv6-tunnels-dismantle.patch
+ patches.fixes/ipv4-speedup-ipv6-tunnels-dismantle.patch
patches.drivers/cxgb4-add-new-T5-pci-device-id-s-34929cb4.patch
patches.drivers/drivers-net-e1000e-use-setup_timer-helper.patch
patches.drivers/drivers-net-bnxt-use-setup_timer-helper.patch