Merge tag 'ipsec-next-2024-03-06' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / net / xfrm / xfrm_interface_core.c
index 1a1f6613fda2f95e2a920a9cb0a0f7838e911fdb..4df5c06e3ece834039e1713377538bd7f4d12a3e 100644 (file)
@@ -726,7 +726,7 @@ static int xfrmi_get_iflink(const struct net_device *dev)
 {
        struct xfrm_if *xi = netdev_priv(dev);
 
-       return xi->p.link;
+       return READ_ONCE(xi->p.link);
 }
 
 static const struct net_device_ops xfrmi_netdev_ops = {
@@ -951,12 +951,12 @@ 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)
+static void __net_exit xfrmi_exit_batch_rtnl(struct list_head *net_exit_list,
+                                            struct list_head *dev_to_kill)
 {
        struct net *net;
-       LIST_HEAD(list);
 
-       rtnl_lock();
+       ASSERT_RTNL();
        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;
@@ -967,18 +967,16 @@ static void __net_exit xfrmi_exit_batch_net(struct list_head *net_exit_list)
                        for (xip = &xfrmn->xfrmi[i];
                             (xi = rtnl_dereference(*xip)) != NULL;
                             xip = &xi->next)
-                               unregister_netdevice_queue(xi->dev, &list);
+                               unregister_netdevice_queue(xi->dev, dev_to_kill);
                }
                xi = rtnl_dereference(xfrmn->collect_md_xfrmi);
                if (xi)
-                       unregister_netdevice_queue(xi->dev, &list);
+                       unregister_netdevice_queue(xi->dev, dev_to_kill);
        }
-       unregister_netdevice_many(&list);
-       rtnl_unlock();
 }
 
 static struct pernet_operations xfrmi_net_ops = {
-       .exit_batch = xfrmi_exit_batch_net,
+       .exit_batch_rtnl = xfrmi_exit_batch_rtnl,
        .id   = &xfrmi_net_id,
        .size = sizeof(struct xfrmi_net),
 };