ipv6: add net device refcount tracker to struct inet6_dev
authorEric Dumazet <edumazet@google.com>
Sun, 5 Dec 2021 04:22:11 +0000 (20:22 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 7 Dec 2021 00:05:11 +0000 (16:05 -0800)
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/if_inet6.h
net/ipv6/addrconf.c
net/ipv6/addrconf_core.c

index 653e7d0f65cb7a5e7458daf860215d1873c532e7..f026cf08a8e86c54ea5d9f1abddd5f0e3caf402b 100644 (file)
@@ -160,6 +160,7 @@ struct ipv6_devstat {
 
 struct inet6_dev {
        struct net_device       *dev;
+       netdevice_tracker       dev_tracker;
 
        struct list_head        addr_list;
 
index 3445f8017430f145496bad78afd6378bf5cb1c02..3eee17790a82fe6c528db4e821b11444cfa26866 100644 (file)
@@ -405,13 +405,13 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
        if (ndev->cnf.forwarding)
                dev_disable_lro(dev);
        /* We refer to the device */
-       dev_hold(dev);
+       dev_hold_track(dev, &ndev->dev_tracker, GFP_KERNEL);
 
        if (snmp6_alloc_dev(ndev) < 0) {
                netdev_dbg(dev, "%s: cannot allocate memory for statistics\n",
                           __func__);
                neigh_parms_release(&nd_tbl, ndev->nd_parms);
-               dev_put(dev);
+               dev_put_track(dev, &ndev->dev_tracker);
                kfree(ndev);
                return ERR_PTR(err);
        }
index 1d4054bb345b72204179c17b4ebc69e11e3faf53..881d1477d24ad5af79fd744bee1e0792fcfa483d 100644 (file)
@@ -263,7 +263,7 @@ void in6_dev_finish_destroy(struct inet6_dev *idev)
 #ifdef NET_REFCNT_DEBUG
        pr_debug("%s: %s\n", __func__, dev ? dev->name : "NIL");
 #endif
-       dev_put(dev);
+       dev_put_track(dev, &idev->dev_tracker);
        if (!idev->dead) {
                pr_warn("Freeing alive inet6 device %p\n", idev);
                return;