summaryrefslogtreecommitdiff
path: root/net/xfrm/xfrm_interface.c
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2020-06-08 20:14:49 +0300
committerTony Lindgren <tony@atomide.com>2020-06-08 20:14:49 +0300
commit4263eb6880df8383fff0efb872278a99eb6142c8 (patch)
tree67ab9bf228e4f5f341f9408e055180932b39fe06 /net/xfrm/xfrm_interface.c
parent636338d7968e47c7f2e0b772a2a825ad932883fb (diff)
parent8e326a8bdef3fb42b92bf2742e8405d9b9209367 (diff)
downloadlinux-4263eb6880df8383fff0efb872278a99eb6142c8.tar.xz
Merge branch 'fixes-v5.7' into fixes
Diffstat (limited to 'net/xfrm/xfrm_interface.c')
-rw-r--r--net/xfrm/xfrm_interface.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c
index 3361e3ac5714..1e115cbf21d3 100644
--- a/net/xfrm/xfrm_interface.c
+++ b/net/xfrm/xfrm_interface.c
@@ -750,7 +750,28 @@ static struct rtnl_link_ops xfrmi_link_ops __read_mostly = {
.get_link_net = xfrmi_get_link_net,
};
+static void __net_exit xfrmi_exit_batch_net(struct list_head *net_exit_list)
+{
+ struct net *net;
+ LIST_HEAD(list);
+
+ rtnl_lock();
+ list_for_each_entry(net, net_exit_list, exit_list) {
+ struct xfrmi_net *xfrmn = net_generic(net, xfrmi_net_id);
+ struct xfrm_if __rcu **xip;
+ struct xfrm_if *xi;
+
+ for (xip = &xfrmn->xfrmi[0];
+ (xi = rtnl_dereference(*xip)) != NULL;
+ xip = &xi->next)
+ unregister_netdevice_queue(xi->dev, &list);
+ }
+ unregister_netdevice_many(&list);
+ rtnl_unlock();
+}
+
static struct pernet_operations xfrmi_net_ops = {
+ .exit_batch = xfrmi_exit_batch_net,
.id = &xfrmi_net_id,
.size = sizeof(struct xfrmi_net),
};