diff options
author | Tony Lindgren <tony@atomide.com> | 2020-06-08 20:14:49 +0300 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2020-06-08 20:14:49 +0300 |
commit | 4263eb6880df8383fff0efb872278a99eb6142c8 (patch) | |
tree | 67ab9bf228e4f5f341f9408e055180932b39fe06 /net/xfrm/xfrm_interface.c | |
parent | 636338d7968e47c7f2e0b772a2a825ad932883fb (diff) | |
parent | 8e326a8bdef3fb42b92bf2742e8405d9b9209367 (diff) | |
download | linux-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.c | 21 |
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), }; |