ipv4: add net device refcount tracker to struct in_device
authorEric Dumazet <edumazet@google.com>
Sun, 5 Dec 2021 04:22:12 +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/linux/inetdevice.h
net/ipv4/devinet.c

index 518b484..674aeea 100644 (file)
@@ -24,6 +24,8 @@ struct ipv4_devconf {
 
 struct in_device {
        struct net_device       *dev;
+       netdevice_tracker       dev_tracker;
+
        refcount_t              refcnt;
        int                     dead;
        struct in_ifaddr        __rcu *ifa_list;/* IP ifaddr chain              */
index 323e622..fba2bff 100644 (file)
@@ -243,7 +243,7 @@ void in_dev_finish_destroy(struct in_device *idev)
 #ifdef NET_REFCNT_DEBUG
        pr_debug("%s: %p=%s\n", __func__, idev, dev ? dev->name : "NIL");
 #endif
-       dev_put(dev);
+       dev_put_track(dev, &idev->dev_tracker);
        if (!idev->dead)
                pr_err("Freeing alive in_device %p\n", idev);
        else
@@ -271,7 +271,7 @@ static struct in_device *inetdev_init(struct net_device *dev)
        if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
                dev_disable_lro(dev);
        /* Reference in_dev->dev */
-       dev_hold(dev);
+       dev_hold_track(dev, &in_dev->dev_tracker, GFP_KERNEL);
        /* Account for reference dev->ip_ptr (below) */
        refcount_set(&in_dev->refcnt, 1);